自己动手写操作系统--"Hello, OS world!"
2007-05-15 14:32
771 查看
自己动手写操作系统--"Hello, OS world!"
作者:zieckey(zieckey@yahoo.com.cn)
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个参数(除了第三个),基本上就能应付大多数的了。
作者:zieckey(zieckey@yahoo.com.cn)
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 |
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 ; 结束标志 |
我的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 |
有几个重要的参数再做详细说明:
第一个参数: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个参数(除了第三个),基本上就能应付大多数的了。
相关文章推荐
- 自己动手写操作系统--"Hello, OS world!"
- 自己动手写操作系统--"Hello, OS world!"http://blog.csdn.net/zieckey/archive/2007/05/15/1609908.aspx
- 自己动手写操作系统--"Hello, OS world!"
- 自己定义Gradle插件之"Hello World"
- 教程:使用 Xcode 编写 Mac OS X 下的"Hello, World!"
- 一个简单的"Hello World"
- 17种"Hello World"!
- 自己动手实现操作系统引导程序(OS bootloader)——借助QEMU/GDB/losetup/dd等工具
- 结合"hello world"探讨gcc编译程序的过程
- Win10操作系统下,Java环境变量的配置&&Java入门小程序“hello,world”的编译
- 开发一个应用程序的思路:"Hello World"
- 动手写自己的第一个"操作系统"
- char *s1 = "hello"和char s2[]="world"的区别
- 利用开发人员命令提示输出"Hello world"
- char str[] = "hello world";和char *str = "hello world";区别
- Anjuta- c++ "hello world"
- <自己动手写操作系统>第三章——pmtest3源码解析:使用LDT
- directshow的"hello world"(from sdk sample)
- ./HelloWorld line 1: syntax error: "(" unexpected问题解决
- "Hello World " —— 深入理解程序从编译到运行