環境設定:
關閉pae(實體地址擴充套件)
bcdedit /set pae forcedisable
bcdedit/set nx alwaysoff
開啟雙機除錯,在虛擬機器中新建乙個記事本,並輸入「cyxvc」,然後斷下來
在windbgm中輸入:
0: kd> !process 0 0 notepad.exe
process 8816f3d8 sessionid: 1 cid: 0960 peb: 7ffd4000 parentcid: 0630
dirbase: 38200000 objecttable: 8bfbc410 handlecount: 63.
image: notepad.exe
0: kd>.process 8816f3d8
implicit process is now 8816f3d8
warning: .cache forcedecodeuser is not enabled
0: kd> s -u 400000 l2000000 "cyxvc"
018a0b3c 0063 0079 0078 0076 0063 0000 0000 0000 c.y.x.v.c.......
0: kd>du 018a0b3c
018a0b3c "cyxvc"
分解018a0b3c
前十位(頁目錄索引):
6中十位(頁表索引):
a0後十二位(位元組索引):
b3c0: kd>!dd 38200000
#38200000 3962e867 396af867 00000000 00000000
#38200010 36303867 36fcf867 39e3f867 390a5867
#38200020 3a0be867 38000867 36d0f867 00000000
#38200030 00000000 00000000 00000000 00000000
#38200040 00000000 00000000 00000000 00000000
#38200050 00000000 00000000 00000000 00000000
#38200060 00000000 00000000 00000000 00000000
#38200070 00000000 00000000 00000000 00000000
39e3f867 後三位是許可權描述 取39e3f000
0: kd>!dd 39e3f000+a0*4
#39e3f280 38180867 00000080 00000080 00000080
#39e3f290 35dc2867 360c1867 00000080 00000080
#39e3f2a0 36604867 36908867 362c3867 367c9867
#39e3f2b0 36c0a867 3690b867 36e8c867 3690d867
#39e3f2c0 36b4e867 36f8f867 36c90867 36c11867
#39e3f2d0 36c52867 367c6867 369c7867 370d3867
#39e3f2e0 36805867 36d96867 36f97867 36e98867
#39e3f2f0 36dd9867 3705a867 371db867 374dc867
38180867 後三位是許可權描述 取38180000
最終轉換成的實體地址為:38180000+b3c=38180b3c
即 018a0b3c =》 38180b3c
其他資料:
已知乙個虛擬位址0x01af5518, 則轉換的過程如下:
注意: *這裡討論的以windows下普通模式分頁的情況, 也就是2級頁表的情況*
1.首先把虛擬位址拆分成3個部分(低12位, 中10位, 高10位), 換成2進製如下:
-> 0000 0001 1010 1111 0101 0101 0001 1000
按照10, 10, 12的位數重新排列後
-> (頁目錄索引)00 000 00110, (頁表項索引)10 1111 0101, (偏移)0101 0001 1000
換算成十六進製制後可以得到如下結果
頁目錄索引 = 6, 頁表項索引 = 0x2f5 , 偏移 = 0x518
2. 根據當前的cr3暫存器中的實體地址定位頁目錄表基址
cr3中存放的是實體地址, 這個實體地址指向程序的頁目錄表基址, 由此可以得到
頁目錄表基址(pde) = cr3 = 0xaa0e5000
3. 計算頁表項的位址
頁表位址存放在頁目錄表(pde)中的第6個專案中, 也就是
[0xaa0e5000 + 4 * 6] = [0xaa0e5018] = 0x3d955867, 其中0x00000867為該頁表屬性值, pte = 0x3d955000
3. 計算頁面實體地址
我們要找的頁面在這個頁表中的第0x2f5項, 所以虛擬位址所在的頁的實體地址為
[0x3d955000 + 0x2f5 * 4] = [0x3d955bd4] =
假設[0x3d955bd4] = 0x7095e847, 頁面的實體地址 x0x7095e000, 0x00000847表示的是頁面屬性
4. 計算最終的實體地址
由虛擬位址分離的偏移可以計算出最終的實體地址為
0x7095e000 + 0x00000518 = 0x7095e518.
初試將虛擬位址轉換為實體地址
背景 最近學習張銀奎的 軟體除錯 看到 2.7.5 節 使用windbg觀察分頁機制,終於看到第乙個可以操作的例子,但始終不能按書上的方式正確的將虛擬位址轉換為實體地址,google一下,終於解決,放到這裡記錄一下。注 可以看到提示符是 kd,這裡為了避免開兩個windbg,直接使用的是核心除錯除錯...
使用者態程序的虛擬位址轉換到實體地址
看linux記憶體機制好幾遍了,總算是對記憶體機制有了基本的認識。下面就說乙個我剛看記憶體是的乙個問題 使用者態程序的虛擬位址如何轉換成實體地址?區分乙個程序,我們都知道最簡單就是程序的pid。我們就從 pid,virtualaddress 來看看如何將乙個程序的虛擬位址轉換為實體地址phyaddr...
Linux 核心虛擬位址到實體地址轉換討論
首先我們基於平坦型物理記憶體,單個node,下面是基於64位armv8架構得到,其他架構也有類似結論 arm64 ffffffc000080000 t text ffffffc000080160 t stext ffffffc000083000 t vectors ffffffc0010890b8 ...