自己动手写操作系统--"Hello, OS world!"

自己动手写操作系统--"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的软盘的镜像。

 


========================================================================
                                bximage
                  Disk Image Creation Tool for Bochs
        $Id: bximage.c,v 1.32 2006/06/16 07:29:33 vruppert Exp $
========================================================================

Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] fd

Choose the size of floppy disk image to create, in megabytes.
Please type 0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, or 2.88.
 [1.44]
I will create a floppy image with
  cyl=80
  heads=2
  sectors per track=18
  total sectors=2880
  total bytes=1474560

What should I name the image?
[a.img] boot.img

Writing: [] Done.

I wrote 1474560 bytes to boot.img.

The following line should appear in your bochsrc:
  floppya: image="boot.img", status=inserted
(The line is stored in your windows clipboard, use CTRL-V to paste)

Press any key to continue


3、创建自己的引导程序boot.asm

org 07c00h ; 告诉编译器程序加载到 7c00处

                      mov ax, cs

                      mov ds, ax

                      mov es, ax
                      
                      call DispStr ; 调用显示字符串例程

                      jmp $ ; 无限循环

                DispStr:

                      mov ax, BootMessage
                      
                      mov bp, ax ; es:bp = 串地址

                      mov cx, 16 ; cx = 串长度

                      mov ax, 01301h ; ah = 13, al = 01h
                      
                      mov bx, 000ch ; 页号为 0(bh = 0) 黑底红字(bl = 0Ch,高亮)

                      mov dl, 0
                      
                      int 10h ; 10h 号中断

                      ret

                BootMessage: db "Hello, OS world!"
                
                     times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为

                                                    ; 512字节
                      dw 0xaa55 ; 结束标志

          
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”修改后的文件如下:

###############################################################
# bochsrc.txt file for zieckey's first OS boot disk image.
###############################################################

# how much memory the emulated machine will have
megs: 32

# filename of ROM images
romimage: file=../BIOS-bochs-latest, address=0xf0000
vgaromimage: file=../VGABIOS-lgpl-latest

# what disk images will be used
floppya: 1_44=boot.img, status=inserted
#floppyb: 1_44=floppyb.img, status=inserted

# hard disk
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
#ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17

# choose the boot disk.
boot: floppy

# default config interface is textconfig.
#config_interface: textconfig
#config_interface: wx

#display_library: x
# other choices: win32 sdl wx carbon amigaos beos macintosh nogui rfb term svga

# where do we send log messages?
log: bochsout.txt

# disable the mouse, since DLX is text only
mouse: enabled=0

注意上面的几个重要修改地方:
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以及我自己的小操作系统的。下面就是我们要用到的最基本的选项:

# 在一行的最前面加上“#”表示这一行是注释行。
# 内存,以MB为单位,对于dos来说最大可以访问16MB
# 的内存,所以我就给了他16MB,你可以根据自己的机器来调
# 整
megs: 16
# 下面两句一般是不可以改的,至于干什么用的就不用我说
# 了。从他们的文件名就可以看出来。
romimage: file=../BIOS-bochs-latest, address=0xf0000
vgaromimage: file=../VGABIOS-lgpl-latest
# 这个还用说吗?当然是软驱了,我想我们写操作系统肯定是先
# 把操作系统放在软盘(或映像)里面吧?在BOCHS里面是可
# 以使用任意大小的软驱映像的。可以是1.44或2.88,我一般使
# 用2.88。还有就是BOCHS里面可以使用两个软驱。不过好像
# 我们并不经常这样做。
floppya: 2_88=test.img, status=inserted
#floppyb: 1_44=floppyb.img, status=inserted
# 下面是硬盘,很简单,还有就是BOCHS也是可以支持多个硬
# 盘的。那么,硬盘文件是怎么生成的呢?我们可以发现硬盘是
# img格式的。你注意没有在BOCHS文件夹里有一个工具叫
# bximage.exe,我想你应该猜出来了。他就是用来生成这个硬盘
# 文件的工具。我在这儿还想说的是硬盘分三种格式的,最好选
#用growing类型。这种有一个好处就是节省硬盘空间,不过使用
#这种类型的硬盘还需要在下面加上mode = growing这个选项。
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="dos.img", cylinders=306, heads=4, spt=17
# 下面这个就是光驱,没什么好说的。如果你想使用物理光驱,
# 只要让path=E:(我们假设E盘是光驱)
ata0-slave: type=cdrom, path="dos.iso", status=inserted
# 这个是启动设备,可以使用cdrom(光驱)、c(硬盘)或floppy(软
# 驱)。
#boot: cdrom
boot: c
#boot: floppy
# 这一句可以不要,他只是指定用来保存日志的文件。如果不指定的
# 话他就会输出到命令控制台上。
log: bochsout.txt
# 这一句是设置在开机时是否激活鼠标,BOCHS对于鼠标的控制不是
# 很好。建议如果不是特别需要的话不要激活他。在运行期间也可以点窗口右上角的鼠标图标来激活他。
mouse: enabled=0

 

以上这些设置就可以让你的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个参数(除了第三个),基本上就能应付大多数的了。

 

你可能感兴趣的:(Linux)