博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何编写自己的操作系统(1)

Posted on 2011-11-26 18:57  天地玄黄  阅读(36329)  评论(6编辑  收藏  举报

      我也是自己一步一步学着别人的方法来编写一个操作系统。把一些重点记下来。教程在这里:http://www.brokenthorn.com/Resources/OSDevIndex.html

 

1、准备工作

      一台32位Intel的电脑就可以了,使用Windows操作系统。然后下载一些软件安装上:

 

软件名 下载地址 说明
NASM http://nasm.sourceforge.net/ nasm –f bin Boot4.asm –o Boot4.bin
PartCopy http://www.brokenthorn.com/Resources/Programs/pcopy02.zip partcopy Boot4.bin 0 200 -f0

VFD - Virtual Floppy Drive

http://sourceforge.net/projects/vfd/

How to use VFD

Bochs Emulator

http://bochs.sourceforge.net/

How to use Bochs

 

      NASM和PartCopy需要设置一下环境变量,在Path中添加指向其.exe目录的文件夹即可。其它问题如果有什么不明白的,可以参看这里

   VFD启动时注意使用管理员权限启动,否则会报“没有权限”的错误。

2、Bootloader

      好了,我们直接进入启动程序。整个程序如下:

Boot4.asm

 

 

      这个程序经过NASM编译之后会形成一个大小恰好为512B的文件,我们使用下面的命令来编译这个名为Boot4.asm的文件(为什么叫Boot4.asm?因为测试这个程序时正好是这个编号:)

nasm -f bin Boot4.asm -o Boot4.bin

 

      启动VFD,创建一个虚拟软盘,命名为A盘。然后使用PartCopy把Boot4.bin这个文件拷贝到软盘的第一个扇区:

partcopy Boot4.bin 0 200 –f0


      现在在软盘的第一个扇区就是我们的这个启动程序。计算机启动时会按顺序检查BIOS设定的所有启动设备(比如按照软驱、光驱、磁盘的顺序来检测是否在其中有可以启动的设备)。在这里,我们把Boot4.bin写入了磁盘的第一个扇区(磁盘的每个扇区为512B),并且这个文件的末尾为0xaa55,这个特殊的字节序列表示这是一个可以启动的文件。BIOS就把这个文件放到内存的 0x7c00:0 这个地址,去执行这个文件。大致过程可以参看这里(计算机按下电源后发生了什么)

      有关这个汇编程序Boot4.asm的详细解释我们后面再做。下面我们编写一个超级简单的操作系统Stage2.asm

3、一个超级简单的操作系统Stage2.asm

      不用任何解释,直接给出这个操作系统的代码。它的主要功能就是在屏幕上打印出 “Preparing to load operating system...”这个字符串

Stage2.asm

 

      之所以把这个文件叫做Stage2.asm,是因为这是系统启动的第二个阶段,这个操作系统是由Boot4.bin从磁盘中读取出来并且加载到内存中的这个文件会被加载到0x7c00:0x0200这个内存地址上。现在我们使用NASM把这个文件编译成一个二进制文件:

nasm -f bin Stage2.asm KRNLDR.SYS

 

 

 

 

 

      之所以把它编译成为KRNLDR.SYS,是因为在Boot4.asm中,我们设定了 ImageName db "KRNLDR  SYS" 这个语句。现在只要知道有这么回事就可以了。这个文件名不能随便改。

      下面我们把KRNLDR.SYS拷贝到磁盘A中:

copy KRNLDR.SYS A:\

 

      这时候,检查A盘,就会发现里面多出了一个KRNLDR.SYS这个文件。

4、设置模拟器

      下面我们使用Bochs这个模拟器来模拟系统的启动。首先安装这个模拟器。然后建立一个文件,名字叫做bochsrc.bxrc,里面的内容为:

bochsrc.bxrc


      保存好后,运行这个文件,就可以看到模拟器启动了。最后稳定之后的界面应该是这个样子的:

image

      好了,到现在为止,我们的操作系统就已经运行完成了,打印出了一个字符串。如果你忘了把KRNLDR.SYS文件拷贝到A盘,它还会提示你出错。

      按一下这个界面上面的Power键,就可以结束这次模拟了。

 

      好了,有关代码的具体介绍,请参看这里