自己动手写操作系统--"Hello, OS world!"
作者:zieckey([email protected])
1、开发环境与工具
开发环境:winxp+sp2
必须安装Bochs-2.3,nasm,UltraEdit.
下载nasm后,添加nasm所在目录到到path目录,建议直接将nasm放到windows或system32目录,方便从命令行调用.
下载地址:http://sourceforge.net/projects/nasm
2、准备
下载并解压缩bochs后,安装和一般的windows软件安装一样,注意为了方便学习,安装时选择完全安装,即要选择那个dlxlinux。你可以在它的目录中找到一个名为bximage.exe的程序,这个程序可以为我们创建磁盘镜像文件,我们可以在这些磁盘镜像文件上尝试我们的操作系统,而不必实际改动我们的硬盘或是软盘上的数据,毕竟,在没有实际把握之前,我们不愿意给我们的计算机带来什么不可恢复的伤害。
下面的表格显示了一次bximage.exe的运行。它为我们创建了一个名为boot.img的文件,这个文件是一张容量为1.44m的软盘的镜像。
|
3、创建自己的引导程序boot.asm
|
4、编译源文件并复制到软驱镜像文件中
我的Bochs安装在“D:/SoftTools/Bochs-2.3” ,在该目录下创建一个HelloOS的目录,
以便为后的工作做好准备。将boot.asm保存在“D:/SoftTools/Bochs-2.3/HelloOS” ,
同时将上面创建的“boot.img”也保存到“HelloOS”下。
下面我们利用上面提到的汇编编译器nasm将上面的汇编程序编译下:
C:/Documents and Settings/apple>d:
D:/>cd D:/SoftTools/Bochs-2.3/HelloOS
D:/SoftTools/Bochs-2.3/HelloOS>nasmw boot.asm -o boot.bin
D:/SoftTools/Bochs-2.3/HelloOS>
这之后,你将得到一个名为boot.bin的纯二进制文件,大小正好为512字节。
用UltraEdit编辑器打开这个文件,你可以看到这个文件中有一半以上的字节为0,最后两个字节为55和aa。
然后,用你的编辑器打开boot.img,把boot.bin中的内容全部复制到其中。
值得注意的是,你应该把内容复制到boot.img的开始处,也就是说,复制后的内容占用了boot.img的0x000到0x1ff字节。
值得一提的是,如果复制数据不一样,请确保选择:UltraEdit编辑器 -〉编辑-〉剪贴板-〉用户剪贴板1,
这样应该就不会有什么问题了。
5、写配置文件
为了配置的简单起见,将“D:/SoftTools/Bochs-2.3/dlxlinux”目录下的“bochsrc.bxrc”和“run.bat”
两个文件复制到“HelloOS”下。我们只要稍微的修改下“bochsrc.bxrc”和“run.bat” 这两个文件就好了。
“bochsrc.bxrc”修改后的文件如下:
|
注意上面的几个重要修改地方:
1) 注释掉带有"hd10meg.img" 的行,这是
# hard disk
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
#ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17
2) 启动项应该为软驱启动,这与我们前面做的软驱镜像一直
# choose the boot disk.
boot: floppy
“run.bat”修改后的文件如下:
cd "D:/SoftTools/Bochs-2.3/HelloOS"
../bochs -q -f bochsrc.bxrc
6、运行我们的第一个简陋的操作系统(或者说系统引导程序)
双击“bochsrc.bxrc”或者“run.bat”,这时候会跳出两个窗口,其中一个应该是这样的:
Hello, OS world!Bios 0.6a 19 Aug 2006
This VGA/VBE Bios is released under the GNU LGPL
Please visit :
. http://bochs.sourceforge.net
. http://www.nongnu.org/vgabios
Bochs VBE Display Adapter enabled
Bochs BIOS - build: 08/11/06
$Revision: 1.166 $ $Date: 2006/08/11 17:34:12 $
Options: apmbios pcibios eltorito
Booting from Floppy...
第一行的“Hello, OS world!”就是我们要看到的结果。
7、下面对Bochs的用法作一个简单的说明
bochs用法 BOCHS是一个开源的虚拟机。它可以实现vpc和vmware的大部分功能。你也可以像使用vmware一样的在BOCHS里面安装操作系统。但是,由于它是全模拟的。所以,速度要远远慢于vmware.这样看来BOCHS好像没有什么优势.是这样吗?在应用方面的确如此。但是,在其他一个方面它是处于绝对优势的。那就是它具有调试功能!这是一个让人振奋的功能。这个功能在你调试操作系统或者其他一些在裸机上运行的程序时候,会让你有一种在写 windows下运行的应用程序的感觉。有时候它是我们的救命稻草。没了它,也能活,但是肯定要糟糕的多。好了我们开始切入正题。
一、 配置BOCHS
实际上配置BOCHS是很简单的,为什么很多人不会配置呢?我觉的就是因为他使用和配置方式和普通程序不一样——配置文件。实际上配置文件是和ini文件、bat文件类似的。bochs没有给我们提供图形界面的配置工具。这就需要我们自己来修改配置文件。简单的配置就可以让你的操作系统在BOCHS里面跑起来。用BOCHS跑完整的linux和windows是不现实的。实在是太慢了。一般我们也只能把他当成调试器来使用。现在,我们先看一下如何让 dos在他里面跑起来。
如果你细心的话你会发现在BOCHS文件夹里面有一个bochsrc-sample.txt的文本文件。里面包含了所有了BOCHS参数的信息。这个是官方的教程。可惜是英文的,而且我也没有找到有中文的教程(不然也没有我这篇文章)。在这里我们仅仅介绍最简单的配置选项。好了,废话就不多说了。我们现在就开始。
我们以一个例子来说明,这个例子是我用来跑dos以及我自己的小操作系统的。下面就是我们要用到的最基本的选项:
|
以上这些设置就可以让你的DOS或自己的小操作系统在BOCHS里面跑起来了。至于其他的一些高级支持,你可以查看bochsrc-sample.txt里面的说明。不要害怕他,其实很简单。关键是抛弃恐惧。
有几个重要的参数再做详细说明:
第一个参数:floppya这是A驱动器的参数,当然,自然也是模拟的。通常所用的软驱是1。44MB的,因此后面跟的参数是1_44=/dev/fd0 注意,这个/dev/fd0必须是你的软驱的镜像,比方说咱们的msdos就是msdos.img,你把/dev/fd0改成1_44= msdos.img就可以,当然,也可以模拟其它的软驱,如2。88M,720K,360K的,这非常的有用!你装minix1.5版的时候就知道了,网站上download的都是360K,说明那是360K的磁盘,你可以模拟除360K的软驱使用。后面的参数status标明软驱的状态,只能有两个 inserted(软盘插入软驱),ejected(软盘未插入软驱)。完整的就是floppya: 1_44=msdos.img, status=inserted,别的软驱如B类似。
第二个参数:boot,这是启动的驱动器,它的频率也比较高。它可以带的参数有floppy(软驱启动),disk(磁盘启动),cdrom(光驱启动)。
这两个参数是最最常用的,几乎是必用吧。嗯~~下面的参数是关于硬盘的,有些麻烦,也算是比较常用吧。
第三个参数:ata0,ata1,ata2,ata3,这应该算是四个参数吧,没事别改它,反正我是没改过它,还常常吧后面的ata1,ata2,ata3给注释掉,仅仅留ata0。至于参数吗,你自己看看吧,不常用,我后面说。
第四个参数:ATA[0-3]-MASTER,ATA[0-3]-SLAVE,这就有用了,指定硬盘或光盘的参数,并指明它是主盘还是从盘。标准的参数是 ata0-master: type=disk, mode=flat, path="30M.sample", cylinders=615, heads=6, spt=17,type参数只能是两者,disk(硬盘),cdrom(光盘),mode这个参数镜像类型,它仅仅是针对磁盘才有效,有几种,flat (一个文件的布局)concat(多个文件的布局)external(开发者指定的,通过C++的类BOCHS就是C++开发的)dll(开发者指定的,通过dll文件)vmware3(wmware3使用的硬盘镜像)。还有几个其它的不介绍;path是指定硬盘或是光盘镜像的文件。Cylinders, Heads,Spt这几个参数通过这名字就能知道了。注意,这通常来说也不算是太重要,但是某些时候,则是特别重要,比如以前我装minix1.5的时候,用bximage这个bochs自带的创建磁盘工具创建了个硬盘,然后就指明路径就运行,结果分区的时候一直出错,查了半天才发现这几个参数没有设置好,bximage创建的硬盘的Heads和Spt似乎是固定的,和模板自带的不一样,结构分区的时候,自然按配置文件里的计算,和实际的自然不符。
知道这3个参数(除了第三个),基本上就能应付大多数的了。