一文搞明白Linux內(nèi)核《物理內(nèi)存模型》,(成為大牛要收藏)
一、體系結(jié)構(gòu)與內(nèi)存模型
1、體系結(jié)構(gòu)
目前多處理器系統(tǒng)當(dāng)中,有兩種體系結(jié)構(gòu):
非一致內(nèi)存訪問(NUMA),指內(nèi)存劃分成多個內(nèi)存節(jié)點的多處理器系統(tǒng),訪問一個內(nèi)存節(jié)點花費的時候取決于處理和內(nèi)存節(jié)點的距離。NUMA是中高端服務(wù)器的主流體系結(jié)構(gòu)。
對稱多處理器(SMP),即一致內(nèi)存訪問(UMA),所有處理器訪問內(nèi)存花費的時間是相同。每個處理器的地位是平等的,僅在內(nèi)核初始化的時候不平等:“0號處理器作為引導(dǎo)處理器負(fù)責(zé)初始化內(nèi)核,其他處理器等待內(nèi)核初始化完成?!?/p>
在實際應(yīng)用中可以采用混合體系結(jié)構(gòu),在NUMA節(jié)點內(nèi)部使用SMP體系結(jié)構(gòu)。
2、內(nèi)存模型
從處理器角度看到的物理內(nèi)存分布,內(nèi)核管理不同內(nèi)存模型的方式存在差異。內(nèi)存管理子系統(tǒng)當(dāng)中有3種內(nèi)存模型:
平坦內(nèi)存(Flat Memory):內(nèi)存的物理地址空間是連續(xù)的,沒有空洞。
不連續(xù)內(nèi)存(Discontiguous Memory):內(nèi)存的物理地址空間存在空洞,這種模型可以高效地處理空洞。
稀疏內(nèi)存(Sparse Memory):內(nèi)存的物理地址空間存在空洞,如果需要支持內(nèi)存熱插拔,只能選擇稀疏內(nèi)存模型。
二、三級結(jié)構(gòu)(Node/Zone/Page)
從內(nèi)存管理子系統(tǒng)使用節(jié)點(node)、區(qū)域(zone)和頁(page)三級結(jié)構(gòu)描述物理內(nèi)存。
1、內(nèi)存節(jié)點
NUMA系統(tǒng)的內(nèi)存節(jié)點,根據(jù)處理器和內(nèi)存的距離劃分; 在具有不連續(xù)內(nèi)存的UMA系統(tǒng)中,表示比區(qū)域的級別理高的內(nèi)存區(qū)域,根據(jù)物理地址是否連續(xù)劃分,每塊物理地址連續(xù)的內(nèi)存是一個內(nèi)存節(jié)點。內(nèi)存節(jié)點使用一個pglist_data結(jié)構(gòu)體數(shù)據(jù)類型描述內(nèi)存布局。

成員node_mem_map指向頁描述符數(shù)組,每個物理頁對應(yīng)一個頁描述符。node_mem_map可能不是指向數(shù)組的第一個元素,因為頁描述符數(shù)組的大小必須對齊到2的(MAX_ORDER-1)次方。(MAX_ORDER-1)是頁分配器可分配的最大階數(shù)。具體pglist_ddata對應(yīng)內(nèi)核源碼分析如下:
三、Bootmem/Memblock分配器
在Linux內(nèi)核初始化的時候需要分配內(nèi)存,內(nèi)核提供臨時的引導(dǎo)內(nèi)存分配器,在頁分配器和塊分配器初始化完成之后,把空閑的物理頁交給頁分配器管理,丟棄引導(dǎo)內(nèi)存分配器。
1、bootmem分配器應(yīng)用的數(shù)據(jù)結(jié)構(gòu)源碼如下:
在老版本里面有bootmem_data此結(jié)構(gòu)體。新版本只有memblock結(jié)構(gòu)體。
? ? 2、memblock分配器應(yīng)用的數(shù)據(jù)結(jié)構(gòu)如下:
