《一个操作系统的实现》(二):使用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挺像的~


前两章到此结束,第三章内容好像不少的样子。。去看第三章了~

你可能感兴趣的:(《一个操作系统的实现》(二):使用Bochs调试操作系统)