lihanchuan125 发表于 2016-1-6 15:04:04

VMWare Server+Bochs 构建 XP 下的 RabbitOS 开发环境

  本文专门为用 Windows 系统开发 RabbitOS 而又因系统资源有限不想开 X 的同志而写。当然,开发其他的 OS 也是可以的。假如用的是 Linux,那大可以略过本文。
我们开发的 RabbitOS,有很大一部分代码是用 C 来完成的,而且用到的是 gcc,可以很方便地配合 GDB 进行调试。Bochs 提供一个 gdbstub 远程调试功能。
VMWare Server 请到 www.vmware.com 下载,免费。为什么选用 VMWare Server,除了它是免费之外,还因为它可以直接在后台以服务的形式运行,也支持开机自动启动虚拟机,这样我们就可以在虚拟机中装上一个 Linux 来进行“远程”开发了。相对来说,后台运行虚拟机,前台用 XShell 等工具 SSH 到虚拟机上开发,也比直接开一个虚拟机窗口来开发更方便、省资源。代码的存放、编辑、编译、调试都会在虚拟机中进行。
Bochs 请到 bochs.sf.net 下载。但是要注意的是下载的 Windows 版本的 bochs 并不带 gdbstub,所以请自行参照网站上的文档编译一个带 gdbstub 的版本。或者直接 google 一下带gdbstub 的版本。由于我们的虚拟机中的 Linux 系统并没有装 X,所以它是无法运行 Bochs 的,因此我们的 Bochs 是运行在宿主机中的,只提供一个运行平台。
Windows 下的 VMWare Server 安装比较简单,这里不再赘述。Linux 的安装也不再赘述。虚拟机的网络连接方式选择 NAT (其他方式也是可以的,大家请自行变通)。这里假设宿主机的 IP 是 HOSTIP,虚拟机的 IP 是 GUESTIP,虚拟机网关的 IP 是 GWIP。
宿主机和虚拟机中信息的传递通过简单的 Windows 文件共享即可。这一共享文件夹只用作在宿主机和虚拟机之中传递一下软盘镜像,然后 Bochs 用这一镜像启动,并开启远程调试功能,我们就可以在虚拟机中调用 GDB 进行远程调试了。
下面是具体操作步骤:

1. 共享文件夹设置
  宿主机中建立 osdev_image 文件夹,并设置网络共享可写。

2. 虚拟机设置
  在虚拟机中,修改 /etc/fstab,虚拟机启动就自动挂载 osdev_image 到虚拟机中。

//HOSTIP/osdev_image   /mnt    cifs    uid=500,guest   0 0

  uid= 选项后面的数值请替换为你的用户的 uid,这样就可以直接用该用户去写挂载上的文件夹,guest 选项的作用是挂载时不用再提示输入密码。
  这样虚拟机启动之后,宿主机中的 osdev_image 文件夹就会自动挂载到 /mnt 目录。之后可以用一个工具脚本把编译生成的 floppy.img 镜像文件拷贝到 /mnt 中,这个镜像就可以为宿主机中的 Bochs 所用了。

3. Bochs 的配置
  目前我用的 bochsrc 内容如下,供大家参考。

#32MB内存
megs: 32
#虚拟软盘
floppya: 1_44=f:/osdev_image/floppy.img, status=inserted
boot: a
#log文件
log: bochsout.txt
mouse: enabled=0
#开启gdbstub,默认端口是1234
gdbstub: enabled=1
  还有一个 run.bat 去启动虚拟机。

cd "d:\Bochs-2.3.6\ros"
..\bochs-gdbstub -q -f bochsrc.bxrc
  启动用的 floppy.img 正是虚拟机中生成的 floppy.img。在一切正常的情况下运行 run.bat,成功后会在 Bochs for Windows - Console 窗口中显示:

Waiting for gdb connection on port 1234
  这表示 Bochs 已经启动成功,下面就可以进行调试。

4. 在虚拟机中运行 gdb 运行调试
  在第 3 步成功之后,在虚拟机中运行

gdb kernel
  kernel 是编译生成的内核文件,也是放在 floppy.img 中的 kernel 文件。
  进入 gdb 的界面之后,再执行如下的命令连接到远程的 Bochs

(gdb) target remote GWIP:1234
  成功之后会出现

Remote debugging using GWIP:1234
  下面按照一般的 gdb 调试程序的方法去做就可以了。
  

要注意的问题

虚拟机的时间误差
  时间戳对于版本控制来说是一个很关键的信息,但是 VMWare 中虚拟机的时间一般来说比较难与宿主机完全同步,大家可以参照下面的文章去配置自己的虚拟机。
  http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1420
  除了进行上面文章中的设置之外,更保险的方法是每过一段时间与国家授时中心的 NTP 服务器对时一次。我的 /etc/crontab 中加入了如下一行:

05 * * * * ntp 210.72.145.44
  每 5 分钟对时一次。
页: [1]
查看完整版本: VMWare Server+Bochs 构建 XP 下的 RabbitOS 开发环境