物理地址扩展

物理地址擴展(Physical Address Extension, PAE)

今早在知乎上看到一個新概念——物理地址擴展,查閱了許多資料,發現都只是將維基百科上的敘述再講了一遍,依舊十分晦澀難懂,於是打算自己用更加易懂的語言將自己的感悟寫下。

早期的CPU和操作系統都是32位的,可以訪問的物理內存只有4G。後來4G不夠用了,於是人們想辦法去擴展物理內存。

Intel Pentium pro以上的CPU增加了PAE的功能。那什麼是PAE呢?CPU是怎麼做到支持PAE的呢?

首先Intel做的是將CPU原來的32根地址線增加到了36根地址線。都知道CPU可以訪問的內存大小根本是有地址線的位數決定的,CPU增加了4根地址線後,可以訪問的內存就變成了原來的\(2^4\)倍,也就是64G內存。

但是只是從硬件層面實現內存的擴展是不行的,為了與32位的CPU相適應,所有的軟件都是設計成32位的,只能訪問4GB的內存。難道現在有64GB的內存可以訪問還是只能給軟件訪問4GB嗎?當然不行。

於是就誕生了PAE。

對於每個軟件或者說每個進程來說,其可以訪問的虛擬地址或者說邏輯地址空間還是4GB不變的,但是操作系統可以通過地址映射將虛擬地址映射到不同物理地址,這就允許多個進程的使用內存加起來超過了4GB。原來是所有的進程共享4GB內存,現在是所有的進程都可以訪問4GB內存,但是加起來共享64GB內存。

題外話:地址映射同時需要操作系統和CPU的支持。在CPU的內部,有一個叫MMU的部件,這個MMU不是Manchester Metropolitan University, 而是Memory Management Unit,在CPU內部負責CPU的內存訪問需求,功能包括虛擬地址到物理地址的轉換、內存保護、中央處理器告訴緩存的控制等。

如果CPU沒有MMU,CPU要訪問內存時傳出的地址就直接送到了內存的針腳上,等於直接訪問了物理內存,由於內存碎片化線性的存在,內存的使用率將大大降低。如果操作系統不知道CPU不支持邏輯地址的話就更加恐怖,CPU將直接將邏輯地址當做物理地址傳給內存,將訪問到錯誤的內存地址。

而啟用了MMU的CPU,CPU執行單元發出的地址將被MMU截獲,進行一次地址轉換後才傳給內存。

而在執行過程中,操作系統和MMU是這樣的配合的:

  • 操作系統在初始化或分配、释放内存时会执行一些指令在物理内存中填写页表,然后用指令设置MMU,告诉MMU页表在物理内存中的什么位置。
  • 设置好之后,CPU每次执行访问内存的指令都会自动引发MMU做查表和地址转换操作,地址转换操作由硬件自动完成,不需要用指令控制MMU去做。

註:題外話中大部分內容引用自這篇文章

但是隨著大型軟件的推出,又出現了一個問題——如果進程需要訪問超過4GB的內存怎麼辦呢?

對於需要超過4GB內存的軟件來說,需要操作系統提供另外的支持技術,這種技術在Windows上叫Address Windowing Extension(AWE),在類Unix上則有多種不統一的技術在使用。

為了實現這種技術,需要對頁表的結構進行改進。

在傳統的分頁結構中,32位的線性地址通常是如下分配的。由於圖是本地的,所以請對照

32位的地址線中,從高往低,10位用於頁表的尋址,10位用於頁的尋址,最後12位用於頁內偏移量的尋址,頁的大小為4KiB(懷有疑惑)。

現在還沒有談論到PAE,我們先弄清楚頁表的結構。在頁表的表項的第7位叫做PS(Page Size),如果這個位設為1,則頁目錄的表項不再指向頁表,而是指向一個4MiB的頁。

在啟用PAE後,為了可以使用附加的地址位,頁表和頁目錄中的表項都從32位增加到了64位。可以查找的範圍更大了,但是頁目錄和頁表的總大小要保持不變,所以只有9位可以用來查找頁目錄和頁表,為了能夠依舊有那麼多頁目錄和頁表可以用,於是就引入了一級頁目錄指針,共佔兩位,可以尋址到4個頁目錄。

posted @ 2020-04-10 11:18  kaleidopink  阅读(568)  评论(0编辑  收藏  举报