我用的是bochs 2.6.11 首先进入bochs的调试模式使用的是
,打开bochsdbg。同理他也会让你选择配置文件。
选择完了配置文件,弹出两个窗口,一个是调试命令行,一个是操作系统窗口
最初的时候,他会显示一些日志,然后注意:
显示了下一条指令的所在地和指令内容。我们观察因为实模式下 BIOS的引导代码实在 0xf000:0xfff0这里,也就是机器一加电后,cs和ip的初始化内容,我们可以看到他要跳转到 0xf000:e05b这里,这个时候才是我们真正的BIOS代码。
之后查看 0x7c00:0000这里,发现他的内容是0000,这个是正常的,毕竟我们的mbr是需要BIOS加载到对应位置的,这个时候BIOS还没有运行呢。
下面引入一下实模式的内存布局,方便没有了解过的小伙伴们学习。
接着引入bochs的调试方法
首先是xp命令 (提示:bochs下的一个字 是 四个字节)
xp/ 这后面可以跟 b h w g 分别对应的是 字节 两个字节 一个字 两个字
之后跟内存地址
(注意上面指令指定了一次显示内存单元的大小之后再次查看内存单元就是以一个字节来访问的了, xp/4 0x7c00 xp之后跟数字就是连续查看几个单元,所以应该是查看4个字节)
之后是 u命令 用来将内存数据反汇编成指令
u后面加需要反汇编的指令数和起始地址,例如:
u [num] [start] [end] 用来反汇编start 到end这段内存之间的指令,如果不加指明,那么就反汇编 ip指向的内容
之后是set指令 设置寄存器的值
set reg = value 可以设置通用寄存器和段寄存器
也可以设置每次停止执行时 是否反汇编指令 set u on|off
show指令
shou mode 每次切换模式的时候提示 保护模式和实模式之间切换
show int 每次有中断的时候提示 包括三种中断 softint 软件中断 extint 外部设备中断 iret
show call 有函数调用的时候提示
指令 c|coutinue 如果没有断点,那么一直执行下去。
指令 s|step [count] 执行count条指令
指令 n|next 执行下一条指令
指令 vb [段:偏移] 给对应的地址添加断点
指令 lb [线性地址] 给线性地址添加断点 (至于线性地址和虚拟地址,他们就是一个用的段基址一个不用段基址)
指令 pb [物理地址] 给物理地址添加断点
之后是以指令数下断点
sb [count] 表示执行count条指令后下断点
sba [count] 表示cpu从运行开始,执行第count条指令的时候 下断点
之后是读写断点
watch r [addr] 如果物理地址addr有读操作,那么下断点停止 相对应的是 w
watch显示所有的独写断点
unwatch 清楚所有的断点
unwatch [addr] 清除这个物理地址上的断点
blist 显示所有的断点 相同与 info b
bpd|bpe [n] 禁用|启动断点 n是断点号
d [n] 删除某断点
指令 r 显示所有的寄存器的值
ptime-stack [num] 显示堆栈,num表示堆栈数
来源:CSDN
作者:ping ping
链接:https://blog.csdn.net/abc767234318/article/details/104044581