2016-12-09
近期想檢視下系統分配了的頁的頁表項的標誌位,但是發現資料較少,所以還是記錄下,希望可以對某些朋友有所幫助!
系統:win7 32位虛擬機器
平台:kvm虛擬化平台
win7 32位預設是開啟了pae分頁模式的,pae分頁模式本質上和普通的32位分頁並無區別,只是頁表結構和虛擬位址的劃分有所不同,這點就不單獨講述,感興趣可參考另一篇博文:pae 分頁模式詳解
首先寫了一件簡單的核心nt驅動,分配了乙個頁的記憶體,然後寫入資料0xa1b2c3d4
載入驅動:
可以看到頁基址是7ee47400,這正是當前cr3暫存器儲存的頁基址,該位址指向乙個頁目錄指標表(page-directory-pointer-table),需要注意的是該錶一共有4個表項,每個表項八個位元組,並且在pae模式下,位址轉換不直接使用cr3暫存器,而是第一級的頁目錄指標分配了四個pdpte暫存器,每個儲存乙個頁目錄指標,但是也目錄指標暫存器的值卻是**於cr3指向的頁目錄指標表。所以我們仍然可以直接利用cr3來定址。
按照 結構分成四部分:10 000101110 101010101 000000000000,對應16進製制:0x2 0x2e 0x155 0x0
檢視7ee47400內容,由於表項是8位元組,所以使用dq(大小端模式問題)
對應的表項內容為05e07863,同樣取物理頁框號+偏移得:05e07000+0x155*8=05e07aa8
得到表項內容為7fe95963 ,這個就是這個就是最終的pte了,即指向乙個4kb 頁面,物理頁框號為7fe95000,而由於我們是申請的就是乙個頁,即頁內偏移為0,所以這裡同樣也是我們虛擬位址對應的實體地址
檢視內容:
至此,整個查表過程就完成了。
WinDBG遍歷 LIST ENTRY鍊錶
因為window不同版本的核心資料結構有所不同,先宣告實驗環境。本實驗在window7 32位系統下並且執行運算器 calc.exe 測試。為了顯示的資訊不至於冗長,在開始實驗前先講講dt命令的 y引數及exptimerresolutionlisthead全域性變數。1 dt命令檢視 eproces...
核心頁表和程序頁表
初學核心時,經常被 核心頁表 和 程序頁表 搞暈,不知道這到底是個啥東東,跟我們平時理解的頁表有和關係 核心頁表 程序頁表 每個程序自己的頁表,放在程序自身的頁目錄task struct.pgd中。在保護模式下,從硬體角度看,其執行的基本物件為 程序 或執行緒 而定址則依賴於 程序頁表 在程序排程而...
交叉表頁內換行
使用交叉表時,會遇到這種情況 列非常多,行非常少,結果頁面會自動分頁。於是出現了一頁上只顯示幾行,卻顯示成很多頁的情況。既不好看,又浪費紙張 如果列印的話 問題產生了,能不能將這個換頁的動作,限制在同一頁上呢?假設我有這樣乙個表,有兩個字段 gsmc 公司名稱 bmmc 部門名稱。用交叉表實現每個公...