[059][x86匯編語言]16.6 bochs調(diào)試 creg、 page、info tab 、x + 線性地址

學(xué)習(xí)筆記

《x86匯編語言:從實(shí)模式到保護(hù)模式》
http://www.itdecent.cn/p/d481cb547e9f

代碼運(yùn)行

http://www.itdecent.cn/p/e82aa7112812

零、從加載程序mbr到內(nèi)核程序core

http://www.itdecent.cn/p/7a4f07810789

<bochs:1> s
Next at t=1
(0) [0x0000000fe05b] f000:e05b (unk. ctxt): xor ax, ax
<bochs:2> b 0x7c00
<bochs:3> c
<bochs:4> b 0x7d38
<bochs:5> c
(0) Breakpoint 2, 0x0000000000007d38 in ?? ()
Next at t=17414844
(0) [0x000000007d38] 0010:0000000000000138 (unk. ctxt): jmpf ds:[edi+16]
<bochs:6> s
Next at t=17414845
(0) [0x000000040df1] 0038:0000000000000399 (unk. ctxt): mov ecx, 0x00000030

一、creg :查看 CR3寄存器 的值

1、從bochs里面讀出選擇子
2、從文件c16_core.lst里面找出偏移量;
3、按照如下的順序執(zhí)行bochs指令;
<bochs:6> s
Next at t=17414845
(0) [0x000000040df1] 0038:0000000000000399 (unk. ctxt): mov ecx, 0x00000030

<bochs:7> b 0x0038:0x00493
<bochs:8> c
(0) Breakpoint 3, 0x0000000000040eeb in ?? ()
Next at t=17427260
(0) [0x000000040eeb] 0038:0000000000000493 (unk. ctxt): mov eax, 0x00020000

<bochs:9> b 0x0038:0x04A3
<bochs:10> c
(0) Breakpoint 4, 0x0000000000040efb in ?? ()
Next at t=17427264
(0) [0x000000040efb] 0038:00000000000004a3 (unk. ctxt): mov cr0, eax

<bochs:11> s
Next at t=17427265
(0) [0x000000040efe] 0038:00000000000004a6 (unk. ctxt): mov ebx, 0xfffff000
4、CR3寄存器,此時(shí)已寫入了物理地址,使用指令creg,查看其內(nèi)容;
<bochs:12> creg
CR0=0xe0000011: PG CD NW ac wp ne ET ts em mp PE
CR2=page fault laddr=0x0000000000000000
CR3=0x000000020000
    PCD=page-level cache disable=0
    PWT=page-level write-through=0
CR4=0x00000000: pke smap smep osxsave pcid fsgsbase smx vmx osxmmexcpt umip osfxsr pce pge mce pae pse de tsd pvi vme
CR8: 0x0
EFER=0x00000000: ffxsr nxe lma lme sce
<bochs:13>

  • CR0寄存器PE 以及PG位 均是大寫,表示值為1;
  • CR3寄存器的值是 當(dāng)前任務(wù) 頁目錄表 的 物理地址,CR3=0x000000020000
一 1、查看CR3寄存器的值.PNG

二、page : 查看線性地址對應(yīng)的物理頁信息

1、 由.lst文件可以讀出偏移量0x04A3
995 000004A3 0F22C0  mov cr0,eax   ;開啟分頁機(jī)制
2、page指令需要在開啟分頁機(jī)制之后才能奏效;
3、那么至少需要bochs執(zhí)行到 b 0x0038:0x04A3 并且s,確保mov cr0, eax被執(zhí)行完畢!
<bochs:7> b 0x0038:0x4A3
<bochs:8> c
(0) Breakpoint 3, 0x0000000000040efb in ?? ()
Next at t=17427264
(0) [0x000000040efb] 0038:00000000000004a3 (unk. ctxt): mov cr0, eax              ; 0f22c0
<bochs:9> s
Next at t=17427265
(0) [0x000000040efe] 0038:00000000000004a6 (unk. ctxt): mov ebx, 0xfffff000       ; bb00f0ffff
4、page 指令查看 與線性地址對應(yīng)的物理頁信息
<bochs:10> page 0x7e08
 PDE: 0x0000000000021003    ps         a pcd pwt S W P
 PTE: 0x0000000000007003       g pat d a pcd pwt S W P
linear page 0x0000000000007000 maps to physical page 0x000000007000
<bochs:11>
  • page 0x7e08 中的 0x7e08線性地址;
  • PDE: 0x0000000000021003 ,頁目錄表表項(xiàng),內(nèi)容是0x21003(最后的3是頁屬性),即,頁表的物理地址0x21000;
  • PTE: 0x0000000000007003頁表表項(xiàng),內(nèi)容是0x7003(最后的3是頁屬性),即,物理頁的物理地址0x7000;
  • 因此,與線性地址0x7e08對應(yīng)的物理頁物理地址0x7000;

三、info tab : 查看當(dāng)前任務(wù)的頁表信息

1、初次進(jìn)入分頁模式
2、info tab 查看當(dāng)前任務(wù)的頁表信息:初次進(jìn)入分頁模式后的頁表信息
<bochs:11> info tab
cr3: 0x000000020000
0x00000000-0x000fffff -> 0x000000000000-0x0000000fffff
0xffc00000-0xffc00fff -> 0x000000021000-0x000000021fff
0xfffff000-0xffffffff -> 0x000000020000-0x000000020fff
  • 復(fù)習(xí):如何訪問頁目錄表自己的表項(xiàng)以及訪問頁表自己的表項(xiàng)(即,為什么頁目錄表起始線性地址0x FFFF F000、頁表起始線性地址0xFFC0 0000

http://www.itdecent.cn/p/d6b534560669

  • 第一行:0x00000000-0x000fffff -> 0x000000000000-0x0000000fffff
虛擬內(nèi)存空間的低端1MB,即,線性地址 0x00000000-0x000fffff
對應(yīng)著物理地址 0x00000000-0x000fffff
一模一樣
這是正確的,因?yàn)樵诔醮芜M(jìn)入分頁模式時(shí),
就是要建立低端1MB內(nèi)存空間與物理地址的的一一對應(yīng),
就是要使這部分線性地址與物理地址相同。
低端1MB 內(nèi)存示意圖
  • 第二行:0xffc00000-0xffc00fff -> 0x000000021000-0x000000021fff
見復(fù)習(xí)部分
可以知道 線性地址 0xffc00000 是頁表自己的起始線性地址;

為了用線性地址來訪問和修改頁表自己的內(nèi)容,
我們把頁表當(dāng)成普通的頁,把頁目錄表當(dāng)成頁表用。

在這種情況下,頁表的線性首地址是  0xffc00000 ;
因此 0xffc00000-0xffc00fff 這段4KB的線性地址區(qū)間
對應(yīng)的是頁表實(shí)際物理地址 0x000000021000-0x000000021fff
(可見上方內(nèi)存示意圖)
  • 第三行:0xfffff000-0xffffffff -> 0x000000020000-0x000000020fff
見復(fù)習(xí)部分
可以知道 線性地址 0xfffff000 是頁目錄表自己的起始線性地址;

為了用線性地址來訪問和修改頁目錄表自己的內(nèi)容,
頁目錄表的最后一個(gè)目錄項(xiàng),登記的是頁目錄表自己的物理地址;

因此,頁目錄表自己的起始線性地址是 0xfffff000;
即,0xfffff000-0xffffffff  的4KB的線性地址區(qū)間對應(yīng)的
實(shí)際物理地址區(qū)間是 0x000000020000-0x000000020fff
(可以見上方內(nèi)存示意圖)
3、進(jìn)入用戶程序 ,就可以查看用戶程序的頁表信息
  • b 0x0038:0x0613 跳轉(zhuǎn)到內(nèi)核程序的任務(wù)切換指令;
  • s 通過單步調(diào)試進(jìn)入用戶程序;
<bochs:13> b 0x0038:0x0613
<bochs:14> c
(0) Breakpoint 4, 0x000000008004106b in ?? ()
Next at t=17806152
(0) [0x00000004106b] 0038:0000000000000613 (unk. ctxt)
<bochs:15> s
Next at t=17806153
(0) [0x00000013585b] 0007:000000000001f85b (unk. ctxt)

<bochs:16> info tab
cr3: 0x000000141000
0x00000000-0x00000fff -> 0x00000002f000-0x00000002ffff
0x00001000-0x00001fff -> 0x000000031000-0x000000031fff
0x00002000-0x00002fff -> 0x000000033000-0x000000033fff
0x00003000-0x00003fff -> 0x000000035000-0x000000035fff
0x00004000-0x00004fff -> 0x000000037000-0x000000037fff
0x00005000-0x00005fff -> 0x000000101000-0x000000101fff
0x00006000-0x00006fff -> 0x000000103000-0x000000103fff
0x00007000-0x00007fff -> 0x000000105000-0x000000105fff
0x00008000-0x00008fff -> 0x000000107000-0x000000107fff
0x00009000-0x00009fff -> 0x000000109000-0x000000109fff
0x0000a000-0x0000afff -> 0x00000010b000-0x00000010bfff
0x0000b000-0x0000bfff -> 0x00000010d000-0x00000010dfff
0x0000c000-0x0000cfff -> 0x00000010f000-0x00000010ffff
0x0000d000-0x0000dfff -> 0x000000111000-0x000000111fff
0x0000e000-0x0000efff -> 0x000000113000-0x000000113fff
0x0000f000-0x0000ffff -> 0x000000115000-0x000000115fff
0x00010000-0x00010fff -> 0x000000117000-0x000000117fff
0x00011000-0x00011fff -> 0x000000119000-0x000000119fff
0x00012000-0x00012fff -> 0x00000011b000-0x00000011bfff
0x00013000-0x00013fff -> 0x00000011d000-0x00000011dfff
0x00014000-0x00014fff -> 0x00000011f000-0x00000011ffff
0x00015000-0x00015fff -> 0x000000121000-0x000000121fff
0x00016000-0x00016fff -> 0x000000123000-0x000000123fff
0x00017000-0x00017fff -> 0x000000125000-0x000000125fff
0x00018000-0x00018fff -> 0x000000127000-0x000000127fff
0x00019000-0x00019fff -> 0x000000129000-0x000000129fff
0x0001a000-0x0001afff -> 0x00000012b000-0x00000012bfff
0x0001b000-0x0001bfff -> 0x00000012d000-0x00000012dfff
0x0001c000-0x0001cfff -> 0x00000012f000-0x00000012ffff
0x0001d000-0x0001dfff -> 0x000000131000-0x000000131fff
0x0001e000-0x0001efff -> 0x000000133000-0x000000133fff
0x0001f000-0x0001ffff -> 0x000000135000-0x000000135fff
0x00020000-0x00020fff -> 0x000000139000-0x000000139fff
0x00021000-0x00021fff -> 0x00000013b000-0x00000013bfff
0x00022000-0x00022fff -> 0x00000013d000-0x00000013dfff
0x00023000-0x00024fff -> 0x00000013f000-0x000000140fff
0x80000000-0x800fffff -> 0x000000000000-0x0000000fffff
0x80100000-0x80100fff -> 0x000000029000-0x000000029fff
0x80101000-0x80101fff -> 0x00000002b000-0x00000002bfff
0x80102000-0x80102fff -> 0x000000137000-0x000000137fff
0xff800000-0xff800fff -> 0x00000002d000-0x00000002dfff
0xffa00000-0xffa00fff -> 0x000000021000-0x000000021fff
0xffbfe000-0xffbfefff -> 0x000000141000-0x000000141fff
0xffbff000-0xffbfffff -> 0x000000020000-0x000000020fff
0xffc00000-0xffc00fff -> 0x00000002d000-0x00000002dfff
0xffe00000-0xffe00fff -> 0x000000021000-0x000000021fff
0xffffe000-0xffffefff -> 0x000000141000-0x000000141fff
0xfffff000-0xffffffff -> 0x000000020000-0x000000020fff
<bochs:17>

用戶程序 整個(gè)內(nèi)存空間的 映射關(guān)系.png
第十六章 全局內(nèi)存示意圖.png

四、x :使用線性地址查看內(nèi)存信息

使用bochs 指令 x + 線性地址 查看內(nèi)存信息.png
  • 進(jìn)入用戶程序后,使用bochs指令 x + 線性地址可以查看內(nèi)存信息;
  • x 0x00 查看用戶程序的第一個(gè)雙字,即用戶程序長度;
  • x 0x04 查看用戶程序的第二個(gè)雙字,即標(biāo)號start的線性地址,用戶程序的入口線性地址;
  • 復(fù)習(xí),使用xp + 物理地址查看內(nèi)存內(nèi)容,可見這里的p代表的就是physical 物理的意思

http://www.itdecent.cn/p/e4df2d0cfdd5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容