今天查詢頁表對映資料時,無意發現乙個有趣的概念,就是頁表自對映。
頁目錄基址記為pdt,頁目錄項記為pde,頁表項記為pte。bits(m,n,value)表示取value從高m位到高n位的值。
32位系統下,所有的pte所佔的空間剛好是4mb。如果將這些pte連續地放在記憶體中,那麼這4mb記憶體空間對應的pte(稱為pte的pte)剛好在乙個4kb頁中,而這個4kb在頁目錄表中剛好也佔一項。
如果再合理地設定4mb頁表的位址,那麼就可以使得pte的pte所佔的4kb的內容與pde所佔的4kb的內容完全相同。這樣一來,可以就可以將頁目錄表也作為乙個頁表,這也意味著,頁目錄表中有一項會指向自己。
頁目錄表本身占用4kb,所以它也剛好對應了乙個pte。而從前面的設定可以知道頁目錄表本身也是乙個頁表,那麼指向頁目錄表的那個pte必然也在頁目錄表當中。頁目錄表基址經過兩級頁表轉換之後仍然可以轉換成自己的實體地址,所以頁目錄表基位址的對應的pde指向自己,對應的pte也指向自己。
符合上面的要求的乙個例項:將頁表安排在0xc0000000~0xc0400000,頁目錄安排在0xc0300000~0xc0400000。
按照上面的設定,可以如下兩個效果:
1. 通過乙個頁的pte(xpte)的虛位址v_pte,可以直接得到該頁的虛位址為(v_pte<<10)
2. 通過乙個頁表的pde(xpde)的虛位址v_pde,可以直接得到該頁表所在頁的虛位址為( v_pde<<10)
下面來解釋一下為什麼:
1.1 首先看看v_pte自己轉換成實體地址的過程
1.1.1 v_pte取出bits(31,22)在頁目錄表中查詢,根據上面的設定,找到的pde項剛好指向頁目錄表
1.1.2 再取出bits(21,12),在頁目錄表(此時頁目錄表也作為乙個頁表)中查詢,找到的pte項指向xpte所在的頁表
1.1.3 再計算頁內偏移,找到了xpte的實體地址
1.2 再來看看(v_pte<<10)轉換成實體地址的過程
1.2.1 (v_pte<<10)取出bits(31,22)(即v_pte的bits(21,12))在頁目錄表中查詢,根據上面的巧妙設定,相當於1.1.2的過程,取到的pde項指向xpte所在的頁表
1.2.2 (v_pte<<10)取出bits(21,12)(即v_pte的bits(11, 2)在xpte所在頁表查詢,找到的剛好是xpte這個pte
1.2.3 xpte指向的頁面的實體地址加上(v_pte<<10)的低12位(低12位為全0)就是(v_pte<<10)的實體地址。也就是說(v_pte<<10)對應的實體地址剛好就是xpte指向的頁面的實體地址,反過來,也就是說(v_pte<<10)就是這個頁面的虛位址。
2.1 首先看看xpde自己的虛位址如何轉換成實體地址
v_pde的bits(31,12)剛好就等於頁目錄表基址,按照頁目錄表和頁表位置的安排,有
2.1.1 v_pde取出bits(31,22),找到的pde指向頁目錄表本身
2.1.2 v_pde取出bits(21,12),找到的pte也指向頁目錄表本身
2.1.3 v_pde取出bits(11,0)作為偏移,加上頁目錄表的實體地址,得到v_pde的實體地址
2.2 再來看看(v_pde<<10)的虛位址如何轉換成實體地址
2.2.1 (v_pde<<10)取出bits(31,22),也就是v_pde的bits(21,12),在頁目錄表中查詢,找到的pde指向頁目錄表本身,這一步相當於2.1.2
2.2.2 (v_pde<<10)取出bits(21,12),也就是v_pde的bits(11, 2),仍在頁目錄表中查詢,找到的就是xpde所指向的頁表的實體地址
2.2.3 (v_pde<<10)的bits(11,0)為全0,所以轉換出來的實體地址等於xpde所指向的頁表的實體地址。(v_pde<<10)的實體地址等於xpde所指向的頁表的實體地址,反過來看,(v_pde<<10)就是xpde所指向的頁表的虛位址。
Windows頁目錄自對映方案
2010 10 02 01 22 7504人閱讀 舉報 潘愛民,2010年10月1日 首先,看下面的乙個巨集 此巨集的含義是,給定乙個pte的虛擬位址,返回該pte所指頁面的虛擬位址。舉例而言,假設pte的位址 虛擬位址 為0xc0390c84,即1100,0000,00 11,1001,0000,...
Windows頁目錄自對映方案
首先,看下面的乙個巨集 此巨集的含義是,給定乙個pte的虛擬位址,返回該pte所指頁面的虛擬位址。舉例而言,假設pte的位址 虛擬位址 為0xc0390c84,即1100,0000,00 11,1001,0000,1100,1000,0100,這裡 符號將它分為頁目錄索引 頁表索引 頁內偏移三部分。...
Windows頁目錄自對映方案
原位址 潘老師的一篇部落格,學習 首先,看下面的乙個巨集 此巨集的含義是,給定乙個pte的虛擬位址,返回該pte所指頁面的虛擬位址。舉例而言,假設pte的位址 虛擬位址 為0xc0390c84,即1100,0000,00 11,1001,0000,1100,1000,0100,這裡 符號將它分為頁目...