文章目录
- 一、vm_area_struct 结构体成员分析
-
- 1、shared 成员
- 2、anon_vma_chain 成员
- 3、anon_vma 成员
- 二、vm_area_struct 结构体完整源码
在博客 【Linux 内核 内存管理】虚拟地址空间布局架构 ⑦ ( vm_area_struct 结构体成员分析 | vm_start | vm_end | vm_next | vm_prev |vm_rb) 中 , 分析了 vm_start
vm_end
vm_next
vm_prev
vm_rb
这
个结构体成员作用 ;
在博客 【Linux 内核 内存管理】内存映射相关数据结构 ② ( vm_area_struct 结构体成员分析 | vm_mm 成员 | vm_page_prot 成员 | vm_flags 成员 ) 中 , 分析了 vm_area_struct
结构体中的 vm_mm
vm_page_prot
vm_flags
成员作用 ;
一、vm_area_struct 结构体成员分析
1、shared 成员
在 内存映射 中的 " 文件映射 " 中 , 将 " 文件 " 映射到 " 用户虚拟地址空间 " 后 , 需要将该文件的 地址空间结构 address_space
的成员 i_mmap
指针指向的 " 区域树 " 加入到该 shared 结构体中 ;
shared
成员中 , 可以查询 文件 的 哪些 " 文件区间的数据 " , 被映射到了 哪些 " 虚拟内存区域 " 中 ;
/*
* For areas with an address space and backing store,
* linkage into the address_space->i_mmap interval tree.
*/
struct {
struct rb_node rb;
unsigned long rb_subtree_last;
} shared;
2、anon_vma_chain 成员
" 虚拟内存区域 “ vm_area_struct
结构体实例 所 ” 关联 " 的 anon_vma
实例 ,
会与 " 父进程 " 的 anon_vma
实例 串联起来 , 组成一个 链表 ;
struct list_head anon_vma_chain
成员 就是该 anon_vma
实例 组成的 链表 ;
/*
* A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma
* list, after a COW of one of the file pages. A MAP_SHARED vma
* can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack
* or brk vma (with NULL file) can only be in an anon_vma list.
*/
struct list_head anon_vma_chain; /* Serialized by mmap_sem &
* page_table_lock */
3、anon_vma 成员
anon_vma
结构体 用于 组织 " 匿名内存页 " 被 映射到的 " 用户虚拟地址空间 " ,
anon_vma
成员指向了 anon_vma
结构体实例 ;
struct anon_vma *anon_vma; /* Serialized by page_table_lock */
二、vm_area_struct 结构体完整源码
vm_area_struct
结构体完整源码 :
/*
* This struct defines a memory VMM memory area. There is one of these
* per VM-area/task. A VM area is any part of the process virtual memory
* space that has a special rule for the page-fault handlers (ie a shared
* library, the executable area etc).
*/
struct vm_area_struct {
/* The first cache line has the info for VMA tree walking. */
unsigned long vm_start; /* Our start address within vm_mm. */
unsigned long vm_end; /* The first byte after our end address
within vm_mm. */
/* linked list of VM areas per task, sorted by address */
struct vm_area_struct *vm_next, *vm_prev;
struct rb_node vm_rb;
/*
* Largest free memory gap in bytes to the left of this VMA.
* Either between this VMA and vma->vm_prev, or between one of the
* VMAs below us in the VMA rbtree and its ->vm_prev. This helps
* get_unmapped_area find a free area of the right size.
*/
unsigned long rb_subtree_gap;
/* Second cache line starts here. */
struct mm_struct *vm_mm; /* The address space we belong to. */
pgprot_t vm_page_prot; /* Access permissions of this VMA. */
unsigned long vm_flags; /* Flags, see mm.h. */
/*
* For areas with an address space and backing store,
* linkage into the address_space->i_mmap interval tree.
*/
struct {
struct rb_node rb;
unsigned long rb_subtree_last;
} shared;
/*
* A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma
* list, after a COW of one of the file pages. A MAP_SHARED vma
* can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack
* or brk vma (with NULL file) can only be in an anon_vma list.
*/
struct list_head anon_vma_chain; /* Serialized by mmap_sem &
* page_table_lock */
struct anon_vma *anon_vma; /* Serialized by page_table_lock */
/* Function pointers to deal with this struct. */
const struct vm_operations_struct *vm_ops;
/* Information about our backing store: */
unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE
units */
struct file * vm_file; /* File we map to (can be NULL). */
void * vm_private_data; /* was vm_pte (shared mem) */
#ifndef CONFIG_MMU
struct vm_region *vm_region; /* NOMMU mapping region */
#endif
#ifdef CONFIG_NUMA
struct mempolicy *vm_policy; /* NUMA policy for the VMA */
#endif
struct vm_userfaultfd_ctx vm_userfaultfd_ctx;
};