淺淺講解物理內(nèi)存組織結(jié)構(gòu)
內(nèi)存管理在內(nèi)核中占據(jù)著舉足輕重的地位,畢竟它是用來(lái)處理處理器和內(nèi)存之間的協(xié)作的,而后兩者都是計(jì)算機(jī)中最為重要的資源。內(nèi)存管理的目標(biāo)就是高效合理的使用物理內(nèi)存,不造成浪費(fèi)。
1.體系結(jié)構(gòu)

在計(jì)算機(jī)發(fā)展初期,如上圖,CPU通過(guò)總線訪問(wèn)整個(gè)地址空間,這是一種簡(jiǎn)單經(jīng)濟(jì)的方式,可以盡可能使用內(nèi)存。但是這個(gè)系統(tǒng)本身也存在伸縮性的問(wèn)題,因?yàn)榭偩€的寬度是有限的,這也限制了處理器的數(shù)量。如果添加CPU,會(huì)引起以下兩個(gè)問(wèn)題
CPU增加,每個(gè)節(jié)點(diǎn)的可用帶寬會(huì)減少 CPU增加,總線長(zhǎng)度會(huì)增加,進(jìn)而增加了延遲 于是有了下面的系統(tǒng),如下圖,其中北橋芯片離CPU最近,在CPU與顯卡(PCIE/AGP)、內(nèi)存(DRAM)等建立通信接口,處理高速信號(hào)。南橋則負(fù)責(zé)一些I/O設(shè)備,通常速度相對(duì)前者不高。比如PCI、磁盤(pán)(IDE/SATA)、USB等。

目前管理物理內(nèi)存的方法主要有以下兩種
1.1 一致內(nèi)存訪問(wèn)(Uniform Memory Access,UMA) 也稱(chēng)為對(duì)稱(chēng)多處理器(SMP) 內(nèi)存以連續(xù)的方式組織起來(lái),每個(gè)CPU訪問(wèn)各個(gè)內(nèi)存區(qū)都一樣快。CPU通過(guò)系統(tǒng)總線(前端總線)連到北橋(其中包含內(nèi)存控制器),與內(nèi)存之間的通信必然經(jīng)過(guò)北橋。IO控制器也連到北橋,IO必須通過(guò)北橋才能到達(dá)CPU??梢栽黾佣鄠€(gè)總線或者內(nèi)存通道增加帶寬。不過(guò)總的來(lái)將,UMA的這種伸縮性是有限的。

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書(shū)籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書(shū)、實(shí)戰(zhàn)項(xiàng)目及代碼)??


1.2 非一致內(nèi)存訪問(wèn)(Non-Unit Memory Access,NUMA)
每個(gè)CPU是平等的(系統(tǒng)啟動(dòng)初始化除外),都有本地內(nèi)存,離著最近訪問(wèn)速度最快。各個(gè)CPU之間通過(guò)總線連接,支持對(duì)其他CPU的訪問(wèn)。如下圖,CPU不再共享北橋,而是獨(dú)有一個(gè)內(nèi)存控制器。

2.內(nèi)存模型
從處理器的角度看物理內(nèi)存分布,內(nèi)存管理子系統(tǒng)支持下面三種內(nèi)存模型
平坦內(nèi)存(Flat Memory):內(nèi)存的物理地址空間連續(xù),不存在空洞。如果物理地址空間不連續(xù),那要額外的分配頁(yè)來(lái)處理這些空洞,顯然這種情況下是低效的。 不連續(xù)內(nèi)存(Discontiguous Memory):如果物理地址空間存在空洞,相對(duì)平坦內(nèi)存能高效處理 稀疏內(nèi)存(Space Memory):物理地址空間存在空洞,并且支持熱拔插。

3.三級(jí)結(jié)構(gòu)
在NUMA,CPU被劃分為多個(gè)節(jié)點(diǎn)(node), 每個(gè)CPU對(duì)應(yīng)一個(gè)本地物理內(nèi)存, 即一個(gè)CPU-node對(duì)應(yīng)一個(gè)內(nèi)存node。 內(nèi)存管理系統(tǒng)通過(guò)節(jié)點(diǎn)(node),內(nèi)存域(zone)、頁(yè)幀(page)三級(jí)結(jié)構(gòu)描述物理內(nèi)存。首先,內(nèi)存劃分為節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)關(guān)聯(lián)一個(gè)CPU。各個(gè)節(jié)點(diǎn)又劃分為內(nèi)存域,各個(gè)內(nèi)存域都關(guān)聯(lián)了一個(gè)數(shù)組,用來(lái)組織屬于該內(nèi)存域的物理頁(yè)。UMA被當(dāng)作只有一個(gè)NUMA的系統(tǒng)。
3.1 內(nèi)存節(jié)點(diǎn)
各個(gè)內(nèi)存節(jié)點(diǎn)保存在一個(gè)單鏈表中,供內(nèi)核遍歷。
3.2 內(nèi)存域
3.2.1 內(nèi)存區(qū)域類(lèi)型
ZONE_DMA,直接內(nèi)存訪問(wèn),某些設(shè)備不能直接訪問(wèn)內(nèi)存的,則需要DMA區(qū)域。 ZONE_DMA32,64位系統(tǒng),紀(jì)要支持直接訪問(wèn)16MB以下的內(nèi)存設(shè)備,又要支持直接訪問(wèn)4GB以下內(nèi)存的32位設(shè)備,需要使用此區(qū)域 ZONE_NORMAL,普通區(qū)域,直接映射到內(nèi)核虛擬地址空間的內(nèi)存區(qū)域,也稱(chēng)線性映射區(qū)域 ZONE_HIGHMEM, 高端內(nèi)存區(qū)域,32位系統(tǒng)的產(chǎn)物,內(nèi)核地址空間只有1GB,于是就分出了低端內(nèi)存區(qū)域+高端內(nèi)存區(qū)域,高端內(nèi)存區(qū)域通過(guò)動(dòng)態(tài)映射用來(lái)擴(kuò)展內(nèi)存。 ZONE_MOVABLE,可移動(dòng)區(qū)域,用來(lái)避免內(nèi)存碎片 ZONE_DEVICE,設(shè)備區(qū)域,為了支持持久內(nèi)存熱拔插而增加的內(nèi)存區(qū)域
3.2.2 數(shù)據(jù)結(jié)構(gòu)
3.3 頁(yè)幀(物理頁(yè))
頁(yè)幀是系統(tǒng)內(nèi)存中的最小單位,每個(gè)頁(yè)都會(huì)對(duì)應(yīng)有一個(gè)struct page的實(shí)例。一般位4KB。對(duì)應(yīng)內(nèi)核結(jié)構(gòu)是struct page,里面有很多聯(lián)合體,這樣寫(xiě)的原因是為了節(jié)省內(nèi)存。
