VMA
(虚拟内存空间)
编辑
锁定
讨论
上传视频
本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!
VMA全称为virtual memory area,指虚拟内存空间,又称作线性区,表示一个线性区间。
中文名
虚拟内存空间
外文名
virtual memory area称 作
称作线性区
描 述
表示一个线性区间
VMA含义简介
编辑
从user process 角度来说明的话,VMA 是 user process 里一段 virtual address space 区块;virtual address space 是连续的记忆体空间,当然VMA也会是连续的空间。VMA 对 Linux 的主要好处是,可以使记忆体的使用更有效率,并且更容易管理 user process address space。
每个线性区描述符表示一个线性区间。进程所拥有的线性区从来不重叠,并且内核尽力把新分配的线性区与相邻的现有线性区进行合并。如果两个相邻线性区的访问权限匹配,就把它们合并在一起。为了存放进程的线性区,Linux既使用了链表(查找链表的时间复杂度是O(n)),也使用了红黑树(查找红黑树的时间复杂度是O(logn))。这两种数据结构包含指向同一线性区描述符的指针,当插入或删除一个线性区描述符时,内核通过红黑树搜索前后元素,并用搜索结果快速更新链表而不用扫描链表。
进程的vm_mm链接着属于该进程的所有线性区间,如果CPU要访问的地址(虚拟地址)不属于任何一个线性区(即addrss不在任何一个线性区的vm_start~vm_end内,典型错误就是访问了NULL指针指向的地址),就会产生段错误。
VMA数据结构
编辑
(参考自linux-2.6.11.11/include/linux/mm.h)如下:
structvm_area_struct{
structmm_struct*vm_mm;/*Theaddressspacewebelongto.*/
unsignedlongvm_start;/*Ourstartaddresswithinvm_mm.*/
unsignedlongvm_end;/*Thefirstbyteafterourendaddresswithinvm_mm.linkedlistofVMareaspertask,sortedbyaddress*/
structvm_area_struct*vm_next;
pgprot_tvm_page_prot;/*AccesspermissionsofthisVMA.*/
unsignedlongvm_flags;/*Flags,listedbelow.*/
structrb_nodevm_rb;
/*Forareaswithanaddressspaceandbackingstore,linkageintotheaddress_space->i_mmappriotree,orlinkagetothelistoflikevmashangingoffitsnode,orlinkageofvmaintheaddress_space->i_mmap_nonlinearlist.*/
union{
struct{
structlist_headlist;
void*parent;/*alignswithprio_tree_nodeparent*/
structvm_area_struct*head;}vm_set;
structraw_prio_tree_nodeprio_tree_node;
}shared;
/**Afile'sMAP_PRIVATEvmacanbeinbothi_mmaptreeandanon_vma*list,afteraCOWofoneofthefilepages.AMAP_SHAREDvma*canonlybeinthei_mmaptree.AnanonymousMAP_PRIVATE,stack*orbrkvma(withNULLfile)canonlybeinananon_vmalist.*/
structlist_headanon_vma_node;/*Serializedbyanon_vma->lock*/
structanon_vma*anon_vma;/*Serializedbypage_table_lock*/
/*Functionpointerstodealwiththisstruct.*/
structvm_operations_struct*vm_ops;
/*Informationaboutourbackingstore:*/
unsignedlongvm_pgoff;/*Offset(withinvm_file)inPAGE_SIZEunits,*not*PAGE_CACHE_SIZE*/
structfile*vm_file;/*Filewemapto(canbeNULL).*/
void*vm_private_data;/*wasvm_pte(sharedmem)*/
unsignedlongvm_truncate_count;/*truncate_countorrestart_addr*/
#ifndefCONFIG_MMUatomic_tvm_usage;/*refcount(VMAssharedif!MMU)*/
#endif
#ifdefCONFIG_NUMA
structmempolicy*vm_policy;/*NUMApolicyfortheVMA*/
#endif
};