Linux6.1.79 虚拟内存区描述符(VMA,struct vm_area_struct)

成员类型成员名功能说明(内核选项)
unsigned longvm_start虚拟内存区起始地址
unsigned longvm_end虚拟内存区结束地址
struct mm_struct *vm_mm指向内存描述符
pgprot_tvm_page_prot虚拟内存区访问权限
unsigned longvm_flags虚拟内存区标志
联合体
struct rb_noderb红黑树节点
unsigned longrb_subtree_last红黑树,指向右子树最后一个节点
struct anon_vma_name *anon_name虚拟内存区名字
struct list_headanon_vma_chain虚拟地址子系统使用anon_vma_chain来链接一个进程组的所有anon_vma结构体。当一个进程fork一个子进程,调用者地址空间的所有匿名页都会以写时复制(COW)方式和子进程共享。这会导致要创建的VMA(为子进程)都会表示为和父进程相同的匿名内存区域。为此,内存管理器需要定位并跟踪指向相同区域的所有VMA,这样才能支持取消映射和换出操作。
struct anon_vma *anon_vma虚拟地址空间都是通过匿名内存映射分配的。虚拟地址子系统把进程的所有表示匿名内存区域放到一个链表里,并通过一个匿名虚拟内存区描述符表示。
const struct vm_operations_struct *vm_ops指向虚拟内存区操作集合
unsigned longvm_pgoff虚拟内存区映射到文件中,以页面大小为单位的偏移量
struct file *vm_file虚拟内存区映射到的文件描述符
void *vm_private_data虚拟内存区私有数据,和存储内容和内存映射类型相关
atomic_long_tswap_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_ctxvm_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) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值