如上图所示,大概的进程虚拟内存管理关系图
重点结构 对于mm_struct中 mm代表的结构包括三个 1 mmap 链表,2 mmap_val平衡树 3 mmap_cache, 当vm_area_struct比较少的时候使用
链表保存结构,当数量较多的时候为了增加查找速度,使用平衡书,cache则用于缓存最后一次使用的vm结构,命中率大概35%
内核维护的结构则比较复杂
有三层结构
第一层pglist_data用于表示numa中的不同区域
第二层zone_struct用于管理每个区域中不同管理区,包括ZONE_DMA, ZONE_NORMAL,ZONE_HIGHMEM
第三层用于描述内存块,包含一系列不同大小的内存块序列
注意以上三层结构全都用于描述物理内存。
mem_map节后则是对物理内存管理的最终数据结构,该数组中没一个页对应一个结构,且是按照线性一一映射的,通过物理内存找到该数据结构中的页使用如下代码
#define pte_page(x) \ (mem_map+((unsigned long)((x).pte_low>> PAGE_SHIFT))
#define virt_to_page(kaddr) (mem_map+(__pa(kaddr)>>PAGE_SHIFT)) 根据内核虚拟地址查询page结构