在test.c執行過程中在命令列視窗按下ctrl+c,bochs會進入除錯模式,並會在命令列下顯示如下資訊。
通過u/7檢視當前位置開始的7條指令的反彙編指令
就是test.c中從while開始一直到return的彙編**。變數i儲存在ds:0x3004這個位址,並不停地和0進行比較,直到它為0,才會跳出迴圈。
現在,開始尋找ds:0x3004對應的實體地址,首先查詢段表ldt的實體地址,使用sreg命令
可以看到ldtr的值是0x0068=0000000001101000(二進位制),表示ldt表存放在gdt表的1101(二進位制)=13(十進位制)號位置,gdt表的實體地址已知,檢視gdt表32位元組的內容
gdt表的13號位置的值為 0x82d00068 0x000082fd
xp/8w 0x00fd82d0 得到
在上面的ds中,0x0017=0000000000010111(二進位制),所以rpl=11,可見是在最低的特權級(因為在應用程式中執行),ti=1,表示查詢ldt表,索引值為10(二進位制)= 2(十進位制),表示找ldt表中的第3個段描述符(從0開始編號)。
即0x00003fff 0x10c0f300
段基址+段內偏移,就是線性位址了。所以ds:0x3004的線性位址就是:0x10000000 + 0x3004 = 0x10003004
現已知線性位址,
線性位址變成實體地址 首先需要算出線性位址中的頁目錄號、頁表號和頁內偏移,它們分別對應了32位線性位址的10位+10位+12位,所以0x10003004的頁目錄號是64,頁號3,頁內偏移是4。
ia-32下,頁目錄表的位置由cr3暫存器指引。「creg」命令可以看到:
說明頁目錄表的基址為0。看看其內容,「xp /68w 0」:
頁目錄表和頁表中的內容很簡單,是1024個32位(正好是4k)數。這32位中前20位是物理頁框號,後面是一些屬性資訊(其中最重要的是最後一位p)。其中第65個頁目錄項就是我們要找的內容,用「xp /w 0+64*4」檢視可知
0x00000100:0x00fa2027
頁表所在物理頁框號為0x00faa,即頁表在物理記憶體的0x00faa000位置。從該位置開始查詢3號頁表項,得到(xp /w 0x00fa2000+3*4):0x00fa200c:0x00fa1067
線性位址0x10003004對應的物理頁框號為0x00fa1,和頁內偏移0x004接到一起,得到0x00fa1004,這就是變數i的實體地址
xp /w 0x00fa1004
驗證可得正確
備註:page 0x10003004」,可以得到資訊:「linear page 0x10003000 maps to physical page 0x00fa7000」這樣可以直接獲得對應實體地址,不需要查詢頁目錄表!
《作業系統 位址對映(邏輯 物理的理解)》
是指由程式產生的與段相關的偏移位址部分。例如,你在進行c語言指標程式設計中,可以讀取指標變數本身值 操作 實際上這個值就是邏輯位址,它是相對於你當前程序資料段的位址,不和絕對實體地址相干。只有在intel實模式下,邏輯位址才和實體地址相等 因為實模式沒有分段或分頁機制,cpu不進行自動位址轉換 邏輯...
作業系統記憶體對映
簡單地說可訪問記憶體總數是由cpu 北橋 記憶體控制器 主機板佈線 如果js偷工減料的話 的位址匯流排寬度和作業系統來決定的。奔騰以後的cpu至少有36條位址匯流排,所以奔騰以上的32位cpu至少在64g是沒問題的 但由於暫存器是32位的,所以可線性訪問的只有4g,其他的需要通過頁面切換 pae 才...
作業系統實驗
一 實驗目的 理解vi的三種執行模式及其切方法。學會使用vi的各種操作命令進行文字檔案的編輯。用vi編寫linux下c程式,會用gcc編譯。二 實驗環境 一台裝有linux的機器 這裡預設是red hat linux 9 系統裡面有gcc編譯器。三 實驗內容 寫出主要的內容 首先用合法使用者登入系統...