2016-12-09
近期想查看下系統分配了的頁的頁表項的標志位,但是發現資料較少,所以還是記錄下,希望可以對某些朋友有所幫助!
系統:win7 32位虛擬機
平台:KVM虛擬化平台
win7 32位默認是開啟了PAE分頁模式的,PAE分頁模式本質上和普通的32位分頁並無區別,只是頁表結構和虛擬地址的划分有所不同,這點就不單獨講述,感興趣可參考另一篇博文:PAE 分頁模式詳解
首先寫了一件簡單的內核NT驅動,分配了一個頁的內存,然后寫入數據0xa1b2c3d4
加載驅動:
看到申請的內存的地址是0x85d55000,我們直接看下這塊內存:
確實是我們寫入的數據,然后開始查看頁表,首先獲取的是頁表基地址,我們通過當前進程查看:
可以看到頁基址是7ee47400,這正是當前CR3寄存器保存的頁基址,該地址指向一個頁目錄指針表(page-directory-pointer-table),需要注意的是該表一共有4個表項,每個表項八個字節,並且在PAE模式下,地址轉換不直接使用CR3寄存器,而是第一級的頁目錄指針分配了四個PDPTE寄存器,每個保存一個頁目錄指針,但是也目錄指針寄存器的值卻是來源於CR3指向的頁目錄指針表。所以我們仍然可以直接利用CR3來尋址。
我們先分解下目標虛擬地址:
按照 結構分成四部分:10 000101110 101010101 000000000000,對應16進制:0x2 0x2e 0x155 0x0
查看7ee47400內容,由於表項是8字節,所以使用dq(大小端模式問題)
根據虛擬地址,知道該地址對應表中第三項,即圖中標記的表項,取物理頁框號+偏移得:4595b000+0x2e*8=4595b170
查看該地址:
對應的表項內容為05e07863,同樣取物理頁框號+偏移得:05e07000+0x155*8=05e07aa8
查看地址內容:
得到表項內容為7fe95963 ,這個就是這個就是最終的PTE了,即指向一個4KB 頁面,物理頁框號為7fe95000,而由於我們是申請的就是一個頁,即頁內偏移為0,所以這里同樣也是我們虛擬地址對應的物理地址
查看內容:
至此,整個查表過程就完成了。