深度詳解Linux物理內(nèi)存組織結(jié)構(gòu)(看完秒懂)
系統(tǒng)調(diào)用mmap
虛擬內(nèi)存區(qū)域使用起始地址和結(jié)束地址描述。鏈表按起始地址遞增排序。
mmap指定的偏移單位是字節(jié),mmap2指定的偏移單位是頁。ARM64架構(gòu)實現(xiàn)系統(tǒng)調(diào)用mmap。

系統(tǒng)調(diào)用munmmap
系統(tǒng)調(diào)用munmap用來刪除內(nèi)存映射,有兩個參數(shù):起始地址、長度。主要委托給do_munmap。

vma = find_vma(mm, start); // 根據(jù)起始地址找到要刪除的第一個虛擬內(nèi)存區(qū)域vma
如果只刪除虛擬內(nèi)存區(qū)域vam的部分,那么分裂虛擬內(nèi)存區(qū)域vma
根據(jù)結(jié)束地址找到要刪除的最后一個虛擬內(nèi)存區(qū)域vma
如果只刪除虛擬內(nèi)存區(qū)域last的一部分,那么分裂虛擬內(nèi)存區(qū)域vma
針對所有刪除目標,如果虛擬內(nèi)存區(qū)域被鎖定在內(nèi)存中(不允許換出到交換區(qū)),調(diào)用函數(shù)解除鎖定
調(diào)用此函數(shù),把所有刪除目標從進程虛擬內(nèi)存區(qū)域鏈表和樹中刪除,單獨組成一條臨時的鏈表
調(diào)用此函數(shù),針對所有刪除目標,在進程的頁表中刪除映射,并且從處理器的頁表緩存中刪除映射
調(diào)用此函數(shù)執(zhí)行處理器架構(gòu)特定的處理操作
調(diào)用此函數(shù),刪除所有目標
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。?!前100名進群領取,額外贈送一份價值699的內(nèi)核資料包(含視頻教程、電子書、實戰(zhàn)項目及代碼)?

體系結(jié)構(gòu)
目前多處理器系統(tǒng)有兩種體系結(jié)構(gòu):
非一致內(nèi)存訪問(Non-Unit Memory Access, NUMA):內(nèi)存被劃分成多個內(nèi)存節(jié)點的多處理器系統(tǒng)。訪問一個內(nèi)存節(jié)點花費的時間取決于處理器和內(nèi)存節(jié)點的距離。
對稱多處理器(Symmetric Multi-Processor, SMP):即一致內(nèi)存訪問(Uniform Memory Access, UMA),所有內(nèi)存處理器訪問內(nèi)存花費的時間是相同的。

內(nèi)存模型
內(nèi)存模型是從處理器角度看到的物理內(nèi)存分布,內(nèi)核管理不同內(nèi)存模型的方式存在差異。內(nèi)存管理子系統(tǒng)支持3種內(nèi)存模型:
平坦內(nèi)存(Flat Memory): 內(nèi)存的 物理地址空間是連續(xù)的,沒有空洞。
不連續(xù)內(nèi)存(Discontiguous Memory): 內(nèi)存的物理地址空間存在空洞,這種模型可以高效的處理空洞。
稀疏內(nèi)存(Space Memory): 內(nèi)存的物理地址空間存在空洞,如果要支持內(nèi)存熱插拔,只能選擇稀疏內(nèi)存模型。
三級結(jié)構(gòu)
內(nèi)存管理子系統(tǒng)使用節(jié)點(node)、區(qū)域(zone)、頁(page)三級結(jié)構(gòu)描述物理內(nèi)存。
1.內(nèi)存節(jié)點
NUMA體系的內(nèi)存節(jié)點,根據(jù)處理器和內(nèi)存的距離劃分;
在具有不連續(xù)內(nèi)存的NUMA系統(tǒng)中,表示比區(qū)域的級別更高的內(nèi)存區(qū)域,根據(jù)物理地址是否連續(xù)劃分,每塊物理地址連續(xù)的內(nèi)存是一個內(nèi)存節(jié)點。
node是內(nèi)存管理最頂層的結(jié)構(gòu),在NUMA架構(gòu)下,CPU平均劃分為多個Node,每個Node都有自己的內(nèi)存控制器及內(nèi)存插槽。CPU訪問自己的Node上內(nèi)存速度快,訪問其他CPU關聯(lián)的內(nèi)存速度慢。UMA被當做只是一個Node的NUMA系統(tǒng)。
2.內(nèi)存區(qū)域
內(nèi)存節(jié)點被劃分為內(nèi)存區(qū)域。
3.物理頁
每個物理頁對應一個page結(jié)構(gòu)體,稱為頁描述符。內(nèi)存節(jié)點的pglist_data實例的成員node_mem_map指向該內(nèi)存節(jié)點包含的所有物理頁的頁描述符組成的數(shù)組。
頁是內(nèi)存管理中的最小單位,頁面中的內(nèi)存其物理地址是連續(xù)的,每個物理頁由struct page描述。為了節(jié)省內(nèi)存,struct page是一個聯(lián)合體。
頁,又稱為頁幀,在內(nèi)核當中,內(nèi)存管理單元MMU(負責虛擬地址和物理地址轉(zhuǎn)換的硬件)是把物理頁page作為內(nèi)存管理的基本單位。體系結(jié)構(gòu)不同,支持的頁大小也相同。
32位體系結(jié)構(gòu)支持4kb的頁;64位體系結(jié)構(gòu)支持8kb的頁;MIPS64架構(gòu)體系支持16kb的頁。
總結(jié)
本文介紹了Linux內(nèi)存組織結(jié)構(gòu),先介紹了mmap munmmap的具體執(zhí)行流程。主要介紹了內(nèi)存模型,三級結(jié)構(gòu)節(jié)點、區(qū)域、頁相關內(nèi)容。
