引言
在OS的开发中,为了测试代码的正确性,需要用编写完成的代码去频繁的启动目标计算机;同时新的OS代码在目标机器上运行时由于缺少调试环境的支持也极大地增加了OS开发的难度。虚拟机软件是一种在现有OS平台上利用软件模拟的方法虚拟出一台计算机的软件系统,通常大家使用虚拟机软件都是为了同时使用多个操作系统,比方说在windows环境下使用linux。《BOCHS》就是这样的一款虚拟机软件,《BOCHS》能虚拟出各种层次的x86计算机。通过软件模拟,《BOCHS》可以解释从开机到热启动过程中的每一条指令,并且按照使用自己的驱动模型支持各种PC外设,使得运行在《BOCHS》上的任何一款软件都“确信”自己是运行在一台真正的计算机上。因此,如果能将新编写的OS代码运行在虚拟机上,将显著地缩短OS开发周期,并降低OS开发的难度。
配置硬件资源
《BOCHS》的正常运行需要一个名为“bochsrc”的文本格式的配置文件, bochs虚拟机的各种硬件资源都由这个文件确定。bochs虚拟机没有独占的硬件资源,它和宿主机共享很多外设资源比方说显示器,键盘等。在OS开发中最重要的OS代码的载体:软盘和硬盘资源在bochs虚拟机中是使用宿主机的文件系统来模拟的。
1、在“bochsrc”可以指定一个不大于1.44M的连续文件“floppya.img”作为软盘的磁盘镜像文件:
floppya: 1_44=floppya.img, status=inserted
在OS开发初期,把OS代码按512bytes每扇区的大小单位写入文件“floppya.img”,在计算机启动后,bochs虚拟机的BIOS会利用19#中断把启动软盘上的启动扇区(第0头第0道第1扇区)读入内存,这个过程中使用道了一种称为CHS->LBA的转换算法,使得《BOCHS》可以使用一个连续文件模拟出软盘的工作方式。
2、在“bochsrc”可以指定一个足够大小的连续文件作为硬盘文件镜像要使用硬盘。首先要确定硬盘的ATA通道和端口号和中断号:
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
然后再指定连续文件“harddisk.img”作为硬盘的磁盘镜像文件
ata0-master: type=disk, path=harddisk.img, mode=flat, cylinders=306, heads=4, spt=17, translation=none
调试OS
代码
在众多的虚拟机软件中选择《BOCHS》的最大优势就是《BOCHS》提供了强大的命令行单步调试功能,《BOCHS》的调试命令行提供了九大类命令,常用分别是执行控制类、断点类、内存操作类、信息查看类、寄存器操作类
1、 执行控制类命令可以控制代码单步执行或者控制代码执行到断点处停止;
2、 断点类命令可以在内存的任何地址(物理速度,线性地址,虚拟地址)处设置断点或者取消断点;
3、 内存操作类命令可以按要求显示或修改任何内存物理地址处的数据,可以设置显示格式及显示数量等;
4、 寄存器操作类命令可以直接显示或修改CPU各寄存器的值;
5、 信息查看类指令可以显示当前CPU的执行状态信息以及当前的断点设置情况等调试信息。
实例应用
1、
利用winimage工具将dos启动软盘复制到一个连续文件“dosboot.img”中,利用《BOCHS》的工具bximage工具创建一个10M大小的硬盘文件“jcinx.hd”,分别设置为bochsrc中的软盘和硬盘文件,并从软盘启动bochs虚拟机,利用dos的磁盘工具将该虚拟硬盘分区格式化。
2、
将新创建的OS代码利用winimage软件创建一个连续文件“jcinx.fd”,注意启动扇区代码占该文件最开始的512字节,并将该文件设置为启动软盘。
3、
在OS代码中利用LBA->CHS的算法计算需访问的逻辑扇区的cylinder、head、sector的值。
4、
在VC的集成开发环境下利用工具菜单下自定义工具启动一个批处理文件,利用《BOCHS》的命令行调试工具bochsdbg.exe调试OS代码的执行。
5、
在物理地址0x07c00处设置断点,使用“C”命令运行到断点处,即运行到启动扇区代码开始处,然后就可以使用“S”命令单步调试OS代码了
参考文献:
1、 http://bochs.sourceforge.net/doc/docbook/user/book1.html
2、http://www.nondot.org/sabre/os/files/Disk/CHSTranslation.txt