|
淺析linux內(nèi)核內(nèi)存管理之PAE
早期Intel處理器從80386到Pentium使用32位物理地址,理論上,這樣可以訪問4GB的RAM。然而,大型服務(wù)器需要大于4GB的RAM來同時(shí)運(yùn)行數(shù)以千計(jì)的進(jìn)程,近幾年來這對(duì)Intel造成了壓力,所以必須擴(kuò)展32位80x86所支持的RAM容量。 Intel通過在它的處理器上把管腳數(shù)從32增加到36已經(jīng)滿足了這些需求,可以尋址64GB。同時(shí)引入了一種新的分頁機(jī)制PAE(Physical Address Extension,物理地址擴(kuò)展)把32位線性地址轉(zhuǎn)換為36位物理地址才能使用所增加的物理內(nèi)存,通過設(shè)置CR4的第5位來開啟對(duì)PAE的支持。引入PAE就是為了訪問大于4GB的RAM,線性地址仍然是32位,而物理地址是36位。 64GB的RAM被分為2^24個(gè)頁框,頁表項(xiàng)的物理地址字段從20位擴(kuò)展到了24位。PAE表項(xiàng)必須包含12個(gè)標(biāo)志位和24個(gè)物理地址位,總數(shù)之和為36,頁表項(xiàng)大小從32位變?yōu)?4位。這樣原來一個(gè)頁框有1024個(gè)entry,現(xiàn)在有512個(gè)entry。開啟PAE的80x86 32位使用的是三級(jí)頁表,第一級(jí)是新引入的PDPT(頁目錄指針表,相當(dāng)于PGD了),第二級(jí)是PMD,第三級(jí)是PTE。PDPT只有4個(gè)entry,每個(gè)對(duì)應(yīng)1GB RAM,每個(gè)entry 是64位。CR3中有27位作為PDPT的起始地址。 在開啟PAE前,CR3中用20來存儲(chǔ)頁目錄的起始地址;開啟PAE后,用27位來存儲(chǔ)page directory pointer table的起始地址。
下邊分兩種情況來討論,一個(gè)是PS=0,一個(gè)是PS=1: 當(dāng)CR4的第5位被置位(開啟PAE),第4位被置位(開啟PSE)
當(dāng)CR4的第5位被置位(開啟PAE),第4位被清除(關(guān)閉PSE)
如何訪問64GB? 從上邊的三級(jí)分頁可以看到2^2*2^9*2^9*2^11=4GB,仍然訪問的是4GB。訪問64GB方法如下:
但是實(shí)際上是不能訪問這么大的內(nèi)存的,實(shí)際可用的內(nèi)存被限制在16GB,因?yàn)槿绻?4GB,那么每個(gè)struct page結(jié)構(gòu)需要32字節(jié),總共512MB,這樣ZONE_NORMAL的內(nèi)核地址空間就被大量占用,這樣是不允許的。
|
|
|