调试环境的搭建(三)

        上节博客中我们写了一个主引导程序,运行的还算完美,已经正确的实现了我们想要的功能。那么问题来了,它只是显示一个字符串,如果在字符串没有显示出来程序就挂掉了,那么我们此时应如何去查证?换句话说,如何调试主引导区的代码?今天我们便来介绍下另一款优秀的虚拟机软件(Bochs)。

        先来看看 Bochs 的一些特点:1、专业模拟 x86 架构的虚拟机;2、它是开源并且可移植度较高,源码是由 C++ 编写的;3、支持操作系统开发过程中的断点调试;4、通过简单的配置就能够运行于绝大多数主流的操作系统。

        那么支持调试功能的 Bochs 版本怎样进行配置呢?步骤如下

        1、下载源码:https://sourceforge.net/projects/bochs/files/

        2、解压缩 bochs-2.x.x.tar.gz 得到 bochs-2.x.x 文件夹

        3、进入源码目录:cd bochs-2.x.x

        4、进行配置:./configure --enable-debugger --enable-disasm

        5、make

        6、make install

        

        经过以上六步就完成了 Bochs 的环境搭建了,值得注意的是博主在搭建过程中出现了一个错误,在第五步 make 的时候出现了:/usr/bin/ld: gui/libgui.a(gtk_enh_dbg_osdep.o): undefined reference to symbo 的错误以导致不能继续执行下去,经过搜查资料,解决办法是在 bochs-2.x.x 文件夹里的 Makefile,在92行左右找到 LIBS =。。。,在这一行最后面添加 -lpthread 就 ok 了。注:修改完成之后不能重新configure,不然添加的-lpthread会消失,添加后直接make就可以了。

        在搭建好环境之后我们便需要来配置一个启动文件 bochsrc.txt ,文件内容如下

图片.png

        关于上面启动文件的中的几个路径确定方法如下:1、确定 bochs 的安装路径:which bochs;2、安装 vgabios,确定的它的路径:whereis vgabios。

        下来我们来看看启动 bochs 虚拟机的方法,分为两种:显示启动和隐式启动

        a> 显示启动:bochs -f bochsrc_file;

        b> 隐式启动:bochs

        图片.png

        那么如何来验证调试环境呢?我们启动 bochs 后按 6 来模拟启动,然后输入 continue,如果出现的模拟终端显示出我们所要打印的字符串,那便算是我们已经成功安装 bochs 虚拟机了。下来看看最后的效果图

图片.png

        我们在输入 bochs 隐式启动方式后,然后再输入 6 来进行模拟启动终端,效果如下

图片.png

        我们看到在输入 continue 后终端成功的出现我们自己的输出的字符串,证明此时我们的 bochs 环境已经搭建成功了。那么我们如何来进行 bochs 的调试(类似与 Linux 中的 GDB 调试)呢? bochs 常用的一些调试命令如下

图片.png

        我们来尝试下设置断点,如下

图片.png

        我们看到在设置断点 0x7c00 之后,info 看下断点信息,确实是在 0x7c00 处打了个断点。继续 continue 执行,发现这时的虚拟机 bochs 已经上电成功。我们看到接下来它要执行的是 mov ax, cs 这条指令,是不是我们当时所写的 start 的第一条指令呢?确实是的,那么它后面的 8cc8 是什么意思呢?它指的是这条指令所对应地址的数据,下来我们继续执行 continue,看看最后效果

图片.png

        我们看到已经成功执行了我们自己编写的主引导程序。下来我们执行下单步调试,看看结果

图片.png

        我们看到 step 单步调试执行的结果和我们之前所编写的主引导程序的代码是一样的。通过今天对调试环境 bochs 的搭建,总结如下:1、bochs 是一款专业模拟 x86 架构的虚拟机;2、从源码安装 bochs 可以获得调试功能的支持;3、bochs 的启动配置文件是正确运行关键;4、bochs 支持断点调试,其调试命令与 GDB 调试类似。

猜你喜欢

转载自blog.51cto.com/12810168/2172408