昨天晚上有空下载到了《自己动手写操作系统》--于渊,这本书。感觉他用的语言和比喻很好,所以一口气读了两章,把hello os读完了,我手也痒痒力,自己也搭一个平台,试试吧。在大三的时候上操作系统课,就像做一做操作系统的实验,但是由于自己的懒惰和一些列的借口,总之没有能做成,现在补回来吧。
在ubuntu10.10正式发布还有5天的时候,我将我的10.04升级到了10.10,也没有什么特殊的感受。下面进入正题吧:
1.安装bochs
bochs是一款开源软件,由于其强大的可移植性,在各种机器和操作系统下都可以安装。这里对于它的历史就不多做介绍了。说命令吧。
sudo apt-get install bochs
然后apt包管理会自动解决依赖,下载该下的,安装该装的包。ok,安装完成。
我们该测试好不好使了。
2.编写hello os 汇编程序
org 07c00h ;告诉编译器程序加载到7c00处 mov ax, cs mov ds, ax mov es, ax call DispStr ;调用显示字符串例程 jmp $ ;无限循环 DispStr: mov ax, BootMessage mov bp, ax mov cx, 16 mov ax, 01301h mov bx, 000ch mov dl, 0 int 10h ;10h 中断 ret BootMessage: db "Hello OS world!" times 510-($-$$) db 0 ;填充剩下的空间,使生成的二进制代码恰好>为512字节 dw 0xaa55 ;结束标志
将其保存为boot.asm(汇编代码啊,第一次正式编译,虽然以前在xp下写过更笨的,有点小兴奋)
编译汇编代码:
nasm boot.asm -o boot.bin //怎么样,感觉跟gcc的用法差不多啊,:-)
没有错误的话就好了,有了的话就仔细调一下,注意汇编注释用semicolon(分号而不是冒号),我在这还错了。
3.让我们的程序泡在bochs上
首先我们要想到,bochs是一个虚拟机,它给我们虚拟出了一个机器硬件环境,下面怎么运行就看我们的指令了。对于我们实际的机器,如果让它运行,要么用软盘,要么用光盘,要么用硬盘,你总得挑一个可以让它启动的,这里我们把上面些的hello os程序做成一个img文件,就是一个软盘格式的文件,让bochs挂载上这个虚拟软盘,我们就可以让bochs运行了。
将上面生成的bin文件转换成img文件的方法:
dd命令:
dd if=boot.bin of=boot.img bs=512 count=1 conv=notrunc
其中要注意的是,注意inputfile的路径可以是相对的也可以是绝对的。这个命令在鸟哥的私房菜中有点印象,现在都忘了,网上搜的。
好了,下面就是挂载这个文件,这个虚拟软盘了。
所以我们接下来要做的就是告诉bochs:嘿,我有一个软盘,你给我从这里启动,运行我写的程序。
我们怎么告诉它呢,当然是配置文件了。
对于bochs,有一个默认的配置文件在:/etc/bochs-init/bochsrc
网上的前辈们都说最好对于每个特定的应用,自己单独创建一个bochsrc配置文件,反正又不费时。好,我们写一下适合我们的bochsrc文件。
megs: 32 romimage:file=$BXSHARE/BIOS-bochs-latest vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest floppya: 1_44=boot.img, status=inserted boot: floppy
bochsrc文件里的格式有严格的要求,所以照着原始的那个照猫画虎就可以搞定了。我相信里面的东西不用多解释了吧。
megs: 32说明了最大允许内存
romimage:bios的二进制文件,软件带的,不用管
vgaromimage:vga显示的二进制文件,软件自带的,不用管
floppya: 就是虚拟出的软驱a,后面说了软驱的型号:1_44即1.44M的那种,后面就是软驱文件的位置和名称了,状态,已经插入。
boot:告诉bochs从哪里启动。还用问吗,我们当然是从软驱启动了。
ok,一切顺利的话,我们就可以运行了:
bochs -f bochsrc
我的是看到了下面的漂亮画面:
有一点需要注意就是关于一个环境变量的问题:BXSHARE,我的好像没有自己加上去的,但是我没有让它生效,它也好使了,我没有用source命令,也没有重启,未知中,不管了,好使就行。
你是不是也看到自己的成果了呢?
好,晚上,继续努力!!!
附件中有我的hello os文件夹,包括hello os的源码和bochsrc的配置文件