如上圖所示,大概的進程虛擬內(nèi)存管理關(guān)系圖
重點結(jié)構(gòu) ?對于mm_struct中 mm代表的結(jié)構(gòu)包括三個 1 mmap 鏈表,2 mmap_val平衡樹 3 mmap_cache, 當(dāng)vm_area_struct比較少的時候使用
鏈表保存結(jié)構(gòu),當(dāng)數(shù)量較多的時候為了增加查找速度,使用平衡書,cache則用于緩存最后一次使用的vm結(jié)構(gòu),命中率大概35%
內(nèi)核維護的結(jié)構(gòu)則比較復(fù)雜
有三層結(jié)構(gòu)?
第一層pglist_data用于表示numa中的不同區(qū)域
第二層zone_struct用于管理每個區(qū)域中不同管理區(qū),包括ZONE_DMA, ZONE_NORMAL,ZONE_HIGHMEM
第三層用于描述內(nèi)存塊,包含一系列不同大小的內(nèi)存塊序列
注意以上三層結(jié)構(gòu)全都用于描述物理內(nèi)存。
mem_map節(jié)后則是對物理內(nèi)存管理的最終數(shù)據(jù)結(jié)構(gòu),該數(shù)組中沒一個頁對應(yīng)一個結(jié)構(gòu),且是按照線性一一映射的,通過物理內(nèi)存找到該數(shù)據(jù)結(jié)構(gòu)中的頁使用如下代碼
#define pte_page(x) \ (mem_map+((unsigned long)((x).pte_low>> PAGE_SHIFT))
#define virt_to_page(kaddr) (mem_map+(__pa(kaddr)>>PAGE_SHIFT)) ? ?根據(jù)內(nèi)核虛擬地址查詢page結(jié)構(gòu)