windbg遍歷程序頁表檢視記憶體

2022-03-19 02:50:35 字數 1380 閱讀 7660

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 部門名稱。用交叉表實現每個公...