x86平台上的Windows頁表映射機制

來源:互聯網
上載者:User

標籤:style   blog   c   http   int   a   

首先,在x86架構的處理器上,一個正常頁面大小為4KB,非PAE模式下,CR3持有頁目錄頁面的物理地址,PDE和PTE格式相同大小為4位元組。此時每個頁表頁麵包含1024個PTE,可以映射1024個頁面。而x86的4GB地址空間共包含1M個4KB的頁面,映射所有這些頁面共需要1024個頁表頁面,映射這1024個頁表頁面又需要1個頁目錄頁面。乍看起來我們一共需要1025個頁面來管理1M個頁面的映射,其實不然。

我們不妨逆向理順一下思路。首先,我們的地址空間中有1M=1024x1024個頁面,而一個頁表頁面可以映射1024個頁面。所以,我們把4GB地址空間的1M個頁面按每1024個頁面分為1024組。映射這1024組頁面正好需要1024個頁表頁面,所以我們從剛才的1024組頁面中拿掉一組用作頁表。剛才的頁面還剩下1023組,會消耗掉我們這組頁表頁面中的1023個用來映射。所以我們這組頁表頁面中還剩下一個,我們用它來映射剛剛的1023個頁表頁面,從而消耗掉了1023個Entry,那剩下的1個Entry呢?用來映射最後這個頁面本身。

這樣分配聽起來似乎清晰多了,能實現嗎?按上面的思路,最後一個頁表頁面無疑是要用作頁目錄。x86處理器MMU訪問線性地址是要經過兩次尋找加一個位移(非PAE模式)來確定物理地址的。以此為基礎,通過頁目錄、頁表、再加上位移訪問那1023組頁面很好理解,但是如何線上性地址中訪問1023個頁表頁面及頁目錄頁面呢?也就是如何通過頁目錄頁面把1023個頁表頁面和頁目錄頁面自身映射到線性地址中。其實這就是32位Windows的頁表自映射機制。

在32位的Windows中,頁表的起始線性地址恒為0xC0000000,整個頁表地區佔用了連續的4MB線性地址空間。最關鍵的一個設計,就是頁目錄的第0x300項Entry指向頁目錄本身,進而也就決定了頁目錄頁面的線性地址為0xC0300000。這一設計使得MMU在尋找0xC0000000~0xC03FFFFF這一線性地址空間內的任一線性地址的物理地址時,會把頁目錄頁面當做頁表頁面來使用,也就是說會訪問頁目錄頁面兩次。如,是微軟2004年在東京大學舉辦Windows Kernel Internals講座解釋GetPteAddress原理時所給出的一張圖示:

 

其實GetPteAddress功能就是給定一個線性地址,得出用以映射這個線性地址所屬頁面的PTE的地址。原理很明了,4GB的地址空間中包含1M個頁面,而4MB的頁表地區包含1MB個PTE,這些PTE正是按順序一一對應了所有這些頁面。所以把整個地址空間看作是頁面的數組,可以很輕鬆計算出某個線性地址所屬頁面的索引,例如0xE4321000>>12=0xE4321,而PTE數組中對應PTE的線性地址即為0xC0000000+(0xE4321<<2)=0xC0390C84。

由可以看出,給定的線性地址的高10位為1100000000=0x300,即MMU轉譯線性地址的第一步:在頁目錄頁面中尋找頁表指標時使用的索引為0x300,從而使MMU得到頁目錄頁面本身的物理地址。因此MMU在第二個步驟:在頁表頁面中尋找最終的頁面指標時,會使用頁目錄頁面作為頁表頁面以供尋找。而頁目錄頁面的所有1024個Entry儲存的是其本身和其他1023個頁表頁面的物理地址,所以MMU經過兩次尋找最終得到的是某個頁表頁面的物理地址。當線性地址的高10位固定為1100000000時,剩餘低22位僅能表示4MB的範圍,因此其所能表示的線性地址限定在0xC0000000~0xC03FFFFF這一區間內,也正是所有頁表頁面所佔用的線性地址空間範圍。因為微軟所給出的圖示適是用於講解PTE的,PTE大小為4位元組並且其地址也是4位元組對齊,所以最後的12位頁面內位移也可以理解為利用前10位用作PTE數組索引,最低2位恒為0。

不難想到當MMU第二步尋找時如果仍然使用0x300索引,也就是線性地址高20位為11000000001100000000,那麼MMU經過兩次尋找最終得到的物理地址就是頁目錄頁面的物理地址,如:

 

再加上最低12位的頁面內位移, MMU最終轉譯得到的地址落在頁目錄頁面內,也就是說線性地址0xC0300000~0xC0300FFF表示的區間範圍即為頁目錄頁面線上性地址中的地址區間範圍。如果在12位的頁面位移中,繼續使高10位為1100000000用作PTE索引,那麼得到的就是指向頁目錄自身的PTE,也是PDE,其線性地址為0xC0300C00。

總結,使用一個頁面用作頁目錄,使它的第0x300個Entry指向其自身,剩餘的1023個Entry指向其他的1023個頁表頁面。從而巧妙的將頁表區間映射到0xC0000000~0xC03FFFFF這一線性地址區間。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.