bochs一般用法
bochs是一个开源x86 虚拟机软件。在它的实现中定义了各种数据结构来模拟硬件,用软件模拟硬件缺点是速度比较慢,毕竟全是软件来模拟,您想,虚拟机还要在软件中模拟各种中断,能不慢吗。不过它的功能非常强大,咱们应该感激bochs开发人员所做的贡献,真的不能抱怨,有的用就不错了是不^-^。其优点是可移植性强,原则上只要gcc支持某个平台,这个平台上就可以有bochs,从而保证了bochs在各平台上的畅通无阻。由于它是虚拟机,所以支持硬件级别上的调试。
bochs的硬件调试体现在:
- 1. 调试时可以查看页表、gdt、idt等数据结构
- 2. 可以查看栈中数据。
- 3. 可以反汇编任意内存。
- 4. 实模式、保护模式互相变换时提醒。
- 5. 中断发生时提醒。
这种在硬件级别上的调试给我们提供了更大的灵活性,以后您会发现,这种硬件调试有时候会帮我们大忙。
好在bochs的调试风格是参照gdb来设计的,这对于习惯gdb调试的同学无疑减少了学习成本,不熟悉gdb调试器的同学也不必感到沮丧,我们常用的调试命令并不多,而且bochs的调试方法做得很人性化,发挥一下想像力也能摸索个所以然来。本书中使用的bochs版本是2.6.2,以下就此版本对bochs的使用做大致介绍。
闲话少说,咱们先进入bochs,看看大概有哪些内容。如图
第一行ls命令后,显示的是我安装的bochs下的文件,bin和share这两个目录是bochs安装时创建的,boc是bochs运行过程中的日志文件,它是在配置文件中指定的,而在本例中,bochs的配置文件是boc。是用bin/bximage命令创建出来的虚拟硬盘,它也需要在boc中指定后才能使用。
第二行是启动bochs。由于我们的配置文件并不是这三个标准名称:.bochsrc、bochsrc、boc,所以我们需要用-f来指定我们的配置在哪里。其实用-f来指定是有好处的,这样我们清晰的知道哪个才是我们的配置。
如图3-16,进入bochs后,我们要确定下一步做什么,由于bochs已经将选项[6]做为默认的行为,这里直接回车就好了
像很多提供控制台的软件一样,直接键入help会显示帮助信息。进入bochs后,键入命令help后回车,看看bochs给我们准备了什么礼物。Help命令的输出如图:
根据第二行的提示,“help+命令”,可以显示命令的简短描述信息。那咱们就试一下。
在“cpu and memory contents”类中,有x、xp命令。这两个命令是用来查看内存的,它们的区别是,x命令后接线性地址,xp命令是后接physical物理地址。在目前的实模式中,只能通过物理地址来查看内存,先看看xp命令是怎么用的,一会咱们用xp命令来做个测试。键入help xp回车,如图
说明一下,bochs中用到的“字”并不是2字节,而是4字节。在图3-17的倒数第4行,提示用b,h,w,g来选择一个“显示单元”的大小。如b是指一字节。h是指半个字,2个字节。w是指一个字,4个字节。g是指双字,8字节。用xp或x指令查看内容是以“显示单元”为单位,不是以字节。所以如果不指定数据单位大小,默认是以4字节为单位来显示。如xp 0x7c00,将显示从0x7c00开始的4个字节。
bochs中支持8进制,10进制,16进制的数字。8进制按照以0开头的写法即可,10进制自然不用多说,对于16进制却有点限制,只支持0x前缀的形式,不支持h后缀的形式。如:
8进制:011
10进制:11
16进制:0x11
在咱们调试过程中最常用的还是16进制,它的每一位直接和字节中的每4位对应,观察起来还是较方便一些。
继续看xp指令“xp /nuf <addr>”,nuf是指一个数字序列,这是三个参数,n用来分别指定要显示的“显示单元”数,u指“显示单元”大小,f是指要用哪种进制显示。最终要显示几个字节,是以“显示单元大小u*显示单元个数n”来决定的。addr可以是以上三种进制的数字。即使不明白,看着有点晕也没有关系,后面我们还会对此命令继说。
图中尝试了用b和w来显示内存,大家可以看出,指定了显示单元后,以后的输出就以此显示单元为准,不会自动恢复为默认的4字节。
此处的0x7c00是空值0,这是因为MBR还没有被加载到此地址,MBR是由bios来加载的,bios目前还没有运行呢。
先到这里,【再续】