最近突然想起用softice手工計算一下虛擬位址到實體地址的轉換,理論的東西如段表、頁表等已經很熟悉了,但真正實際操作就碰到了大問題,特別是分頁機制,根本不是從cr3到頁目錄表到頁表再到實體地址這麼簡單,後來讀了一下《intel® 64 and ia-32 architectures
software developer』s manual》(volume 3a: system programming guide, part 1)的第三章「protected-mode memory management」,才發現原先的認識還停留在80386的基礎上,沒有考慮pae、pse-36等機制,所以這裡用乙個實際例子簡單解釋一下, 具體的內容還得去看上述的那本手冊(強烈推薦)。
先寫乙個簡單的用於實驗的例子,只要用vc++6.0建乙個mfc的對話方塊程式(我把工程取名為「memory」),介面只要留下預設生成的「確認」按鈕,該按鈕的訊息函式寫成這樣:
void cmemorydlg::onok()
生成乙個應用程式memory.exe,就可以開始實驗了。
開啟softice後,用symbol loader轉換memory.exe以實現原始碼除錯。撥出softice視窗,鍵入file memorydlg.cpp(包含按鈕訊息函式的cpp),**視窗即出現該cpp檔案的原始碼,尋找**中的cmemorydlg::onok函式,對cdialog::onok()一句設斷點。用ctrl-d隱藏視窗,即彈出memory.exe程式的對話方塊,單擊「確定按鈕」,即彈出sofice視窗。
1、輸入 d test,察看資料視窗,發現test(即0x12345)在0023:0012f698處
2、鍵入 gdt,發現0023對應的段基址為0x00000000,因此test的線性位址為0012f698
3、如果是雙核的機器,則如下操作:鍵入cpu,發現高亮行為cpu0(不一定,可能為cpu0,也可能為cpu1),再鍵入cpu0(若高亮行為cpu1,則鍵入cpu1),查詢對應的cr4暫存器,發現有pse、pae標誌,說明已啟用了pae機制(pse被pae遮蔽)。再看cr3,為0x06c80260。如果是單核的直接鍵入cpu即可。
0x0012f698 :
[00] (用於選擇頁目錄指標表項) [00 0000 000](用於選擇頁目錄表項) [1 0010 1111](用於選擇頁表項) [0110 1001 1000](偏移)
或者:[00] (用於選擇頁目錄指標表項) [00 0000 000](用於選擇頁目錄表項) [1 0010 1111 0110 1001 1000](偏移)
到底取哪一種具體要看頁目錄表項的ps(page size)位。
peek d 06c80260: 0x2a1d7801
peek d 06c80264: 0x00000000
因此,頁目錄指標表項低字為0x2a1d7801,高字為0x00000000
peek d 2a1d7000: 0x36a60867
peek d 2a1d7005: 0
因此,頁目錄表項低字為0x36a60867,高字為0x00000000
由於頁目錄表項的第7位(ps位)為0(......,1000,0000,0001),故頁目錄表項指向頁表而非指向4m大小的頁(即線性位址採用第一種分解方法)
peek d 36a60978: 0x25e25867
peek d 36a6097c : 0x80000000
(手冊中說64頁表項的高位址28被保留為零,但不知為何最高位是1,可能這幾年最高位已被用作某種標誌,我看的是06年的版本,知道的不吝賜教,這裡暫且不管)
因此,頁表項低字為0x36a60867,高字為0x00000000
peek d 25e25698: 0x00012345
啟用PAE後虛擬位址到實體地址的轉換
34安于此生 2013 11 3 20 54 16073 由常規的兩級頁表轉換得不到實體地址的引發的思考?可能你會發現乙個鬱悶的事情 按照通常的兩級頁表的轉化得不到正確實體地址,到底是哪個環節出了問題咧,其實一切都是pae惹的禍!pae是神馬?pae 全稱phyiscal address exten...
虛擬位址與實體地址
乙個程式編譯連線後形成的位址空間是乙個虛擬位址空間,但是程式最終還是要執行在物理記憶體中。因此,應用程式所給出的任何虛位址最終必須被轉化為實體地址,所以,虛擬位址空間必須被對映到物理記憶體空間中,這個對映關係需要通過硬體體系結構所規定的資料結構來建立。這就是我們所說的段描述符表和頁表,linux主要...
邏輯位址 實體地址 虛擬位址
用於記憶體晶元級的單元定址,與處理器和cpu連線的位址匯流排相對應。雖然可以直接把實體地址理解成插在機器上那根記憶體本身,把記憶體看成乙個從0位元組一直到最大空量逐字節的編號的大陣列,然後把這個陣列叫做實體地址,但是事實上,這只是乙個硬體提供給軟體的抽像,記憶體的定址方式並不是這樣。所以,說它是 與...