《一個操作系統的實現》(二):使用Bochs調試操作系統

在輸入bochs -f bochsrc後,還有幾個選項,只需要輸入6然後回車或直接按回車即可啓動操作系統,不過它仍然停在那裏而不是立刻執行。這時會出現<bochs:1>,等待我們操作。

首先按照書上給的例子模擬一遍過程。

<bochs:1> b 0x7c00 (在程序入口處設置斷點)

<bochs:2>c(執行到斷點位置,這時雖然Bochs上有內容,但是"Hello, OS world!"還未顯示)

<bochs:3>dump_cup(不知道早些的版本是否能執行這個,反正我的Bochs2.6.1中這個命令已經不能用了,會提示:3: syntax error at 'dump_cpu',用info cpu、r、fp、sreg、creg命令來代替。而且我在使用info cpu命令時,會提示The CPU doesn't support AVX state !,從Bochs源碼中可以看到如果BX_SUPPORT_AVX值爲假,會打印此條語句。相關內容可參考此文章

<bochs:4>x /64xb 0x7c00 (查看線性地址內容)

<bochs:5>n(單步執行)

<bochs:6>trace-reg on(開啓“每執行一條指令就打印CPU信息”選項)

<bochs:7>n(繼續單步執行)

<bochs:8>c(繼續執行,會發現"Hello, OS world!"顯示出來了)


輸入help或h,然後回車,Bochs會打印如下內容:

h|help - show list of debugger commands
h|help command - show short command description
-*- Debugger control -*-
    help, q|quit|exit, set, instrument, show, trace, trace-reg,
    trace-mem, u|disasm, ldsym, slist
-*- Execution control -*-
    c|cont|continue, s|step, p|n|next, modebp, vmexitbp
-*- Breakpoint management -*-
    vb|vbreak, lb|lbreak, pb|pbreak|b|break, sb, sba, blist,
    bpe, bpd, d|del|delete, watch, unwatch
-*- CPU and memory contents -*-
    x, xp, setpmem, writemem, crc, info,
    r|reg|regs|registers, fp|fpu, mmx, sse, sreg, dreg, creg,
    page, set, ptime, print-stack, ?|calc
-*- Working with bochs param tree -*-
    show "param", restore

網上有許多講bochs調試命令的文章,我把書上的內容以及解釋列在下面:

部分bochs調試指令
行爲 指令 舉例
在某物理地址設置斷點 b addr b 0x30400
顯示當前所有斷點信息 info break info break
繼續執行,直到遇上斷點 c c
單步執行 s s
單步執行,遇到函數則跳過 n n
查看寄存器信息 info cpu
r
fp
sreg
creg
info cpu
r
fp
sreg
creg
查看堆棧 print-stack print-stack
查看內存物理地址內容 xp /nuf addr xp /40bx 0x9013e
查看線性地址內容 x /nuf addr x /40bx 0x13e
反彙編一段內存 u start end u 0x30400 0x3040D
反彙編執行的每一條指令 trace-on trace-on
每執行一條指令就打印CPU信息 trace-reg trace-reg on
在查看寄存器信息中,r爲通用寄存器,fp應該就是fp寄存器吧,sreg爲段寄存器,creg爲控制寄存器。

在xp和x命令中,nuf表示指定打印多少信息。

其實bochs調試跟gdb挺像的~


前兩章到此結束,第三章內容好像不少的樣子。。去看第三章了~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章