linux內存管理之PAE(物理地址擴展)解決內存大於4G的問題

    Intel處理器從80386到Pentium使用32位物理地址,理論上,這樣可以訪問4GB的RAM。然而,大型服務器需要大於4GB的RAM來同時運行數以千計的進程,所以必須擴展32位80x86所支持的RAM容量。(這裏是不是瞭解了爲啥叫x86啊,這個x代表1個數字,最小爲3,表示早期的386系列CPU以及之後的系列,只不過最新的系列不再按照x86命名了)

       從pentium pro 處理器開始,intel引入一種叫做 PAE 的機制,Linux 中使用了這種機制。Intel通過在它的處理器上把管腳數從32增加到36已經滿足了這些需求,可以尋址64GB。同時引入了一種新的分頁機制PAE(Physical Address Extension,物理地址擴展),它把32位線性地址轉換爲36位物理地址才能使用所增加的物理內存,通過設置CR4的第5位來開啓對PAE的支持。引入PAE就是爲了訪問大於4GB的RAM,線性地址仍然是32位,而物理地址是36位。也就是線性地址空間仍爲4GB,每個進程可支配4G虛擬內存空間。只不過原來的情況下,所有進程使用共同使用者剩下的3G物理內存,當進程多了的時候,內存壓力會很大,那麼爲了減少這3G物理內存的衝突,擴展了可用的內存空間,這樣衝突的概率就下降了。

       64GB的RAM被分爲2^24個頁框,頁表項的物理地址字段從20位擴展到了24位。PAE表項必須包含12個標誌位和24個物理地址位,總數之和爲36,頁表項大小從32位變爲64位(因爲36不能被4096整除,所以只能用64了)。這樣原來一個頁框有1024個entry,現在有512個entry。開啓PAE的80x86 32位使用的是三級頁表,第一級是新引入的PDPT(頁目錄指針表,相當於PGD了),第二級是PMD,第三級是PTE。PDPT只有4個entry,每個對應1GB RAM,每個entry 是64位。CR3中有27位作爲PDPT的起始地址。爲什麼這麼設計呢?

這是因爲在4K的page設置的情況下,每個page只能存512個entry(無論是目錄表項,還是頁表項),表示0-511這個範圍,需要9位bit位,這佔用了32位線性地址中的9位,同理,由於頁目錄項與頁表項具有同樣的結構,高一級的頁目錄表中也僅能包含512個頁表項(目錄項),同樣佔用了32位線性地址中的9位,此時,線性地址剩餘位數爲:32位(總位數)-12位(頁內偏移量)-9位(指示頁表中的索引)-9位(指示頁目錄表中的索引)=2位,同時,Linux引入了一個頁目錄指針表(PDPT)的頁表新級別,由4個64位表項構成,剩餘的2位即用來指向PDPT中4個項中的一個(這就是PDPT爲啥只有4個entry的原因,因爲只有2位可用啦)。

未啓用PAE下的4K分頁的頁表結構

【未啓用PAE下的4M分頁的頁表結構】

開啓PAE後,用27位來存儲page directory pointer table的起始地址。

下邊分兩種情況來討論,一個是PS=0,一個是PS=1:

當CR4的第5位被置位(開啓PAE),第4位被置位(開啓PSE)

啓用PAE下2M分頁的頁表結構

  • 線性地址31~30,用來指向一個PDPT的entry
  • 線性地址29~21,用來指向一個pmd的entry
  • 線性地址20~0,爲4MB大頁中的offset

當CR4的第5位被置位(開啓PAE),第4位被清除(關閉PSE)

啓用PAE下4K分頁的頁表結構

  • 線性地址31~30,用來指向一個PDPT的entry
  • 線性地址29~21,用來指向一個pmd的entry
  • 線性地址20~12,用來指向一個pte
  • 線性地址11~0,爲4KB頁中的offset

如何訪問64GB?

從上邊的三級分頁可以看到2^2*2^9*2^9*2^11=4GB,仍然訪問的是4GB。訪問64GB方法如下:

  • 修改CR3中的值使其指向不同的PDPT,這樣就指向不同的4GB
  • 修改PDP entry中的值,使其指向不同的PMD表,這樣可以指向不同的1GB

但是實際上是不能訪問這麼大的內存的,實際可用的內存被限制在16GB,因爲如果有64GB,那麼每個struct page結構需要32字節,總共512MB,這樣ZONE_NORMAL的內核地址空間就被大量佔用,這樣是不允許的

參考文獻:

https://blog.csdn.net/geekdonie/article/details/15494503

https://blog.csdn.net/hsly_support/article/details/7463569

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章