自己动手写操作系统--"Hello, OS world!"
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。还有
- 1
- 2
前往页