文章目录

Bochs 模拟器

Bochs 是一个轻量级的硬件模拟器,相对于 Vmware, VirtualBox 这些软件,它显得轻巧得多。更重要的是,它有着强大的调试系统,因此成为广大操作系统编程人员的好工具。

之前在相关实验中使用过,但是是基于一键脚本完成安装的,并不是了解其中过程。而且是基于 Ubuntu 的,而本人使用 Arch Linux 较多,因此尝试将环境搭建到 Arch Linux 系统中。

下载 Linux0.11 开发工具包

地址: http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-060625.zip

最新版的开发包中的 Bochs 是 2.2.1 版本。

Bochs 编译

正常情况下,Arch Linux 可以使用 pacman 进行安装。但是,安装的 Bochs 是最新版,对老版的配置文件不太支持。因此需要手动编译 bochs2.2.1 版。

源码下载

地址: https://master.dl.sourceforge.net/project/bochs/bochs/2.2.1/bochs-2.2.1.tar.gz

编译

在解压之后,运行里面的 configure 文件生成 Makefile 配置文件:

./configure
make

这里会出现问题:

../iodev/harddrv.h:290:8: 错误:有多余的限定‘sparse_image_t::’在成员‘get_physical_offset’上 [-fpermissive]
  290 |        sparse_image_t::
      |        ^~~~~~~~~~~~~~
../iodev/harddrv.h:295:8: 错误:有多余的限定‘sparse_image_t::’在成员‘set_virtual_page’上 [-fpermissive]
  295 |        sparse_image_t::

可能是编译器语法的不兼容导致的问题,查看对应的文件的行号:

#ifndef PARANOID
       sparse_image_t::
#endif
                       get_physical_offset();
 void
#ifndef PARANOID
       sparse_image_t::
#endif
                       set_virtual_page(uint32 new_virtual_page);

可以看到,当定义 PARANOID 宏时会加上多余的限定,导致出错。直接删除这里的限定即可。

Debugger 模式

如果在 configure 的时候启用了 debugger 模式,那么需要 hash_map 的支持。这个应该是 STL 中的扩展,或许还不是校准的一部分。又或者以前是,而现在不是了。总之,在我的机器上的 std 命名空间中找不到了。但是,经过测试,发现 hash_map__gnu_cxx 命名空间中,也就是说成了 GNU CXX 拓展的一部分了。

暂时不管这些,能找到 hash_map 就行。 在 bx_debug/dbg_main.cc 文件前面引用 __gnu_cxx 即可:

using namespace __gnu_cxx;

安装

sudo make install

测试

进入 linux-0.11 开发工具包的根目录,执行以下命令:

bochs -q -f bochsrc-hd.bxrc

如果在编译的时候启用了 deugger ,那么启动的时候是 debug 模式,需要在命令调试窗口执行 c 命令,否则只能看到一个空白窗口。