很多人觉得开发底层系统用BOCHS会更好一些,能够跟踪每个指令的执行,不过我觉得开发过程中,需要利用EMULATER一步步跟踪指令的时间并不长,在设置了IDT表,启动了MONITOR功能之后就不需要了,而VMWARE提供的直接硬盘访问,串口互联等功能可能是BOCH都不具备的功能。(当然,最主要的原因是我还不太会用BOCHS)
环境需求:
(1) 内存:在256M以上
我的机器是512M, 推荐这个数值或更大,因为在运行时需要同时启动两个虚拟系统, 以128M/64M来分配的话,就要占用192M的物理内存,再加上VMWARE本身占用的内存,在256M的机器上,我是调整成96M/32M才能同时启动(不是最大),虽然可行,但内存少也会导致虚拟系统运行效率降低。
(2) 操作系统:XP或NT2000
需要能够运行VMWARE软件,所以WIN95/98都不行。
使用LINUX作为宿主操作系统也行,但我没试过。
(3) 虚拟软件:VMWARE 4.0/4.5
再低的版本没试,所以不知道是否可行,当然版本越高越好。
(4) 其它软件:Linux安装盘(映象文件)
对LINUX的版本没什么要求,但要注意,我们要用到里面的开发/编译工具,版本越新,提供的工具版本也越新。另外该LINUX最好提供GRUB的安装.
(5) 有足够的硬盘空间,最好是有两块硬盘,而且有一个硬盘的某些分区是没使用的。
除了在虚拟机上跑,应该还希望在实机上跑跑看吧。
如果只用一个硬盘也可以,但要求你会使用GRUB引导WINDOWS.
搭建步骤:
(0) 安装VMWARE
(1) 在VMWARE上建立两个VM。一个用于编译/跟踪(develop_vm),一个用于运行(run_vm)
(2) develop_vm的创建
Guest OS选择LINUX
内存可以设大一些,因为在这上面要跑Linux,还要完成软件的编译和跟踪。
硬盘可以采用Virtual Disk,容量可以设大一些。
* 进入Advance设置
* 设备连接点连到IDE 0:0
需要安装网卡,采用Host-only模式即可。
(3) 在develop_vm上安装LINUX,安装模式随自已,但必需包含开发工具,
即gcc, binutils,make等软件是必需安装的。minicom也应该有。安装后要注意安装VMWare Tools
(4) run_vm的创建
Guest OS选择LINUX
内存可以小一些,视内存情况而定,要确保deveop_vm和run_vm能同时运行。
硬盘采用直接物理硬盘方式,可以激活所有分区。
* 进入Advance设置
* 设备连接点连到IDE 0:0
* 在MODE中,选中Independent. 并选择Persistent。
(5) 在run_vm上安装LINUX, 选择最小模式安装.
实际上run_vm并不需要安装任何操作系统,但我们利用LINUX安装可以实现两个目标
* 将一个分区格式化成EXT2(EXT3)格式系统。
* 在引导扇区和文件系统上安装GRUB
安装LINUX时建议如下:
* 使用GRUB作BOOT LOADER, 安装到MBR上
* 不需要安装多个分区目录,只要建立"/"分区即可。甚至SWAP也可以没有.
(6) 分别在develop_vm和run_vm上分别添加串口(Serial)
属性选择"使用命名管道"(Use named pipe)
两个VM中的管道名需要一致。
在develop_vm中选择“This end is the server",在run_vm中选择"This end is the client"
都选择"The other end is a virtual machine.
(7) 在run_vm中启动Linux,修改Boot loader的引导配置文件. 我使用的是GRUB. 下面只以GRUB为例
% cd /boot/grub
% vi grub.conf
文件改成如下内容:
#grub.conf
default=0
timeout=1
title Self Develop OS
root (hd0,0)
kernel /boot/xxxx-0.1 ro root=/dev/hda1
#eof
关于kernel那一行,root=??? 需要根据你在run_vm的安装的分区情况页定。
(8) 在develop_vm上,执行添加硬盘设备操作。
* 选择直接物理硬盘方式(该硬盘即run_vm使用的硬盘)
* 启用Advance设置
* 将该硬盘挂到IDE0:1
* 在MODE中,选中Independent. 并选择Persistent.
(9) 在develop_vm上启动LINUX, 创建目录/mnt/devos
目录名其实是随意的,我只是举例。
(10) 如果你习惯使用SourceInsight或VC等的编辑工具(不习惯vi),可以将源码建在WINDOWS中的某个目录下,然后使用VMWARE的Shared Folders功能将其MOUNT到develop_vm中。(注意只有在develop_vm上安装了VMWare Tools之后才能有这个功能),
这样就可以在WINDOWS下写代码,在develop_vm虚拟机下编译,在run_vm虚拟机上测试运行了。
开发事项和疑问解答:
(1) 使用gcc/gas作为开发的编译工具
linux是开发操作系统最好的借鉴代码,所以gcc/gas应该是最合适的工具。
(2) 遵守MultipleBoot规范。可以参考GRUB的文档,非常简单!
(3) 使用root帐号进行编译,在MAKEFILE中,添写将执行程序COPY到run_vm中的过程
#......
xxxxos-0.1: ?????
......
mount /dev/hdb? /mnt/devos <- 注意这里的hdb?和run_vm的hda?是对应的!
cp -f xxxxos-0.1 /mnt/devos/boot/xxxxos-0.1
umount /mnt/devos
执行mount时,会有警告提示,完全可以忽略不管。
(4) 如果你想用实机测试,那么只需要用run_vm使用的硬盘引导就OK了。
(5) 如果宿主机使用LINUX, 是不是就不需要设置两个虚拟机了
develop_vm除了用来编译之外,另一个功能是通过minicom(或其它串口应用)让develp_vm与run_vm通信互联。宿主机使用LINUX,可以完成编译的功能,但无法完成与run_vm通信的功能。
(6) develop_vm和run_vm之间用串口互联的目的是什么。
在开发初期,这个串口可以用来作为标准输入输出,实现基本的交互(要比实现KEYBOARD/VGA简单)。 但我更倾向于利用这个串口作MONITOR. 这样就可以对代码进行跟踪了(这样才能替代BOCHS的优势)。
使用串口不是必需的,但如果有,而且实现了Monitor功能,你就能体会到它的好处。
(7) 为什么不将编译的代码放到develop_vm上,在run_vm用网络引导的模式。
如果只是开发操作系统那样用。但这种模式不只可用开发编写操作系统,也可以用开发BOOT LOADER,适用性更强些。