仮想メモリー領域( vm_area_struct )オブジェクトはプロセスのユーザー空間スタックであったり、メモリーマッピングしたファイルに該当するオブジェクトです。
// /usr/src/linux-headers-4.18.16-041816-generic/include/linux/mm_types.h
264 struct vm_area_struct {
265 /* The first cache line has the info for VMA tree walking. */
266
267 unsigned long vm_start; /* Our start address within vm_mm. */
268 unsigned long vm_end; /* The first byte after our end address
269 within vm_mm. */
270
271 /* linked list of VM areas per task, sorted by address */
272 struct vm_area_struct *vm_next, *vm_prev;
273
274 struct rb_node vm_rb;
275
276 /*
277 * Largest free memory gap in bytes to the left of this VMA.
278 * Either between this VMA and vma->vm_prev, or between one of the
279 * VMAs below us in the VMA rbtree and its ->vm_prev. This helps
280 * get_unmapped_area find a free area of the right size.
281 */
282 unsigned long rb_subtree_gap;
283
284 /* Second cache line starts here. */
285
286 struct mm_struct *vm_mm; /* The address space we belong to. */
287 pgprot_t vm_page_prot; /* Access permissions of this VMA. */
288 unsigned long vm_flags; /* Flags, see mm.h. */
289
290 /*
291 * For areas with an address space and backing store,
292 * linkage into the address_space->i_mmap interval tree.
293 */
294 struct {
295 struct rb_node rb;
296 unsigned long rb_subtree_last;
297 } shared;
298
299 /*
300 * A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma
301 * list, after a COW of one of the file pages. A MAP_SHARED vma
302 * can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack
303 * or brk vma (with NULL file) can only be in an anon_vma list.
304 */
305 struct list_head anon_vma_chain; /* Serialized by mmap_sem &
306 * page_table_lock */
307 struct anon_vma *anon_vma; /* Serialized by page_table_lock */
308
309 /* Function pointers to deal with this struct. */
310 const struct vm_operations_struct *vm_ops;
311
312 /* Information about our backing store: */
313 unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE
314 units */
315 struct file * vm_file; /* File we map to (can be NULL). */
316 void * vm_private_data; /* was vm_pte (shared mem) */
317
318 atomic_long_t swap_readahead_info;
319 #ifndef CONFIG_MMU
320 struct vm_region *vm_region; /* NOMMU mapping region */
321 #endif
322 #ifdef CONFIG_NUMA
323 struct mempolicy *vm_policy; /* NUMA policy for the VMA */
324 #endif
325 struct vm_userfaultfd_ctx vm_userfaultfd_ctx;
326 } __randomize_layout;メンバーオブジェクト・変数・ポインターの中で特に重要なのが以下です。
メンバーを見れば分かるように vm_area_struct は連結されています。
vm_next とか vm_prev どかですね。
後はファイルイメージのオフセットである vm_pgoff 何かもありますね。
ファイルオフセットは mmap を使う場合や動的ライブラリを vm_area_struct としてマッピングする場合に必要になるんですが、この辺は図を見たほうが早いと思います。

関連している file があるデータなのであれば、それを指すポインターである vm_file もあります。
ページキャッシュの情報を抽象化した struct address_space とも繋がっていますよね。
Copyright 2018-2019, by Masaki Komatsu