成员类型 | 成员名 | 功能说明(内核选项) |
unsigned long | vm_start | 虚拟内存区起始地址 |
unsigned long | vm_end | 虚拟内存区结束地址 |
struct mm_struct * | vm_mm | 指向内存描述符 |
pgprot_t | vm_page_prot | 虚拟内存区访问权限 |
unsigned long | vm_flags | 虚拟内存区标志 |
联合体 | ||
struct rb_node | rb | 红黑树节点 |
unsigned long | rb_subtree_last | 红黑树,指向右子树最后一个节点 |
struct anon_vma_name * | anon_name | 虚拟内存区名字 |
struct list_head | anon_vma_chain | 虚拟地址子系统使用anon_vma_chain来链接一个进程组的所有anon_vma结构体。当一个进程fork一个子进程,调用者地址空间的所有匿名页都会以写时复制(COW)方式和子进程共享。这会导致要创建的VMA(为子进程)都会表示为和父进程相同的匿名内存区域。为此,内存管理器需要定位并跟踪指向相同区域的所有VMA,这样才能支持取消映射和换出操作。 |
struct anon_vma * | anon_vma | 虚拟地址空间都是通过匿名内存映射分配的。虚拟地址子系统把进程的所有表示匿名内存区域放到一个链表里,并通过一个匿名虚拟内存区描述符表示。 |
const struct vm_operations_struct * | vm_ops | 指向虚拟内存区操作集合 |
unsigned long | vm_pgoff | 虚拟内存区映射到文件中,以页面大小为单位的偏移量 |
struct file * | vm_file | 虚拟内存区映射到的文件描述符 |
void * | vm_private_data | 虚拟内存区私有数据,和存储内容和内存映射类型相关 |
atomic_long_t | swap_readahead_info | 交换区的预读信息(CONFIG_SWAP) |
struct vm_region * | vm_region | 非MMU映射的虚拟内存区(!CONFIG_MMU) |
struct mempolicy * | vm_policy | 非一致性内存访问策略(NUMA,Non Uniform Memory Access)(CONFIG_NUMA) |
struct vm_userfaultfd_ctx | vm_userfaultfd_ctx | 用户页错误文件上下文描述符。userfaultfd(用户页错误文件描述符)用来拦截和处理用户空间的页错误异常,内核通过文件描述符将页错误异常的信息传递给用户空间,然后由用户空间决定要往虚拟页写入的数据。 |
1. 虚拟内存区标志
#define VM_NONE 0x00000000 表示非活跃映射
#define VM_READ 0x00000001 若设置,该区域内的页都可读
#define VM_WRITE 0x00000002 若设置,该区域内的页都可写
#define VM_EXEC 0x00000004 若设置,表示内存区域可执行
#define VM_SHARED 0x00000008 若设置,则共享映射区域中的页
#define VM_MAYREAD 0x00000010 若设置,表示该内存区域上可以设置VM_READ标志位
#define VM_MAYWRITE 0x00000020 若设置,表示该内存区域上可以设置VM_WRITE标志位
#define VM_MAYEXEC 0x00000040 若设置,表示该内存区域上可以设置VM_EXEC标志位
#define VM_MAYSHARE 0x00000080 若设置,表示该内存区域上可以设置VM_SHARE标志位
#define VM_GROWSDOWN 0x00000100 若设置,表示映射可以扩展
#define VM_UFFD_MISSING 0x00000200 若设置,表示开启跟踪缺页错误
#define VM_PFNMAP 0x00000400 若设置,表示该区域是通过PFN跟踪页来映射的。
#define VM_UFFD_WP 0x00001000 若设置,表示开启跟踪写保护错误。
#define VM_LOCKED 0x00002000 若设置,该区域内的所有页都被锁住
#define VM_IO 0x00004000 设备IO区域映射时置位。
#define VM_SEQ_READ 0x00008000 表示倾向于顺序访问该内存区域。
#define VM_RAND_READ 0x00010000 表示倾向于随机访问该内存区域。
#define VM_DONTCOPY 0x00020000 fork时不复制该区域。
#define VM_DONTEXPAND 0x00040000 该区域不能再mremap上扩展。
#define VM_LOCKONFAULT 0x00080000 内存映射中的页发生故障时,锁定内存映射中的页。当一个进程使用mlock2系统调用启用MLOCK_ONFAULT时,该标志位会被置位。
#define VM_ACCOUNT 0x00100000 虚拟内存子系统执行额外的检查,来确保在操作带有该标志位的区间时,内存是足够的。
#define VM_NORESERVE 0x00200000 是否需要取消该映射的内存使用统计。
#define VM_HUGETLB 0x00400000 大页面TLB页(Huge TLB Page VM)
#define VM_SYNC 0x00800000 同步缺页异常(Synchronous page faults)
#define VM_ARCH_1 0x01000000 处理器架构相关的标志
#define VM_WIPEONFORK 0x02000000 在子进程中消除父进程的VMA内容(Wipe VMA contents in child)
#define VM_DONTDUMP 0x04000000 转存(core dump)时不包括
#ifdef CONFIG_MEM_SOFT_DIRTY
# define VM_SOFTDIRTY 0x08000000 脏内存区(Not soft dirty clean area)
#else
# define VM_SOFTDIRTY 0
#endif
#define VM_MIXEDMAP 0x10000000 混合使用页帧号和页描述符(Can contain "struct page" and pure PFN pages)
#define VM_HUGEPAGE 0x20000000 表示当前映射包含大TLB页。
#define VM_NOHUGEPAGE 0x40000000 不允许使用大页面(MADV_NOHUGEPAGE marked this vma)
#define VM_MERGEABLE 0x80000000 KSM可以合并的页面(KSM may merge identical pages)