时间:2009-08-12 点击: 次 来源:本站原创 作者:佚名 - 小 + 大
| 小型操作系统开发 1 学习目地:查找资料,踏出毕业设计的第一步。 2 参考书目:《自己动手写操作系统》作者:于渊 出版社:电子工业出版社。下文中所提到的书除特别说明,都为这本《自己动手写操作系统》。 3 主要内容:在网上搜了不少关于开发操作系统的资料,这本由于渊写的《自己动手写操作系统》算是一本通俗易懂的,不防就先从这里入手,在弄清楚开发操作系统所需知识的同识,也许,可以给自己一点信心。 虽然这是我的毕业设计,但我选择“小型操作系统”这一题目更多的是出于自己的兴趣,所以学习过程是以实践为主,遇到问题再寻找解决的办法。 3.1 环境搭建万事开头难,回想一个月前我刚刚学习LINUX内核知识,每一步都是那么的难走。首先是开发环境。 按书中所说,在硬件方面,一台计算机(有软驱),空白软盘。现在(2006-10-12)看看自己周围,想找一个有软驱的电脑还真是不容易,不过即然有虚拟光驱的存在,想找找虚拟软驱也不会有什么难的。vFloppy V1.5这就是一款虚拟软驱的软件。 软件,汇编编译器选择NASM,可在http://sourceforge.net/中搜索并下载到。其它工具在书附光盘中有提供,以后使用中再一点点学。 3.2 “10分钟完成的操作系统”------------------------------------------- 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, 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 ; 结束标志 --------------------------------------------------------------- 也许自信心就是这么建立起来的:我用书中提供的一个名为FloppyWriter的工具把这段代码编译并拷贝到软盘(镜像)中,并通过虚拟软驱启动电脑。计算机没有像以往一样提示我插入系统启动盘,而是显示了红色的“Hello,OS world!”。我兴奋不已,于是重新回到了Windows下面,将这段代码改了一下: BootMessage: db "Solo is the best!" 哈哈,第一步走的很顺利,一个有我自己属名的计算机引导盘。虽然,它看上去还什么都做不了。 我喜欢在激动的时候立刻冷静下来,这更能让我看清楚事实真像。继续读书中的文字,这样写着:“你可能还没有从刚刚的兴奋中走出来,可是我不得不告诉你,实际上,你刚刚所完成的并不是一个完整的OS,而仅仅是一个最最简单的引导扇区(Boot Sector)。”和我想像的一样,这一小段代码怎么可能是会是一个“操作系统”。我对引导扇区这个名词早有耳闻,可是它的内部究竟是怎样的。有了在实践中找出的问题,我对理论知识产生了兴趣。 3.3 计算机的启动过程“计算机电源被打开时,它会先进行加电自检(post),然后寻找启动盘(或许就是我刚刚写的那个东西?),如果是从软盘启动,计算机就会检查软盘的0面0磁道1扇区,如果发现它以0xAA55结束,则BIOS认为这是一个引导扇区,也就是我们说的Boot Sector。…… 好了,一旦BIOS发现了Boot Sector,就会将这扇区的内容装载到内存的0000:7c00处,然后跳转到0000:7c00处将控制权彻底交给这段引导代码。由此开始,计算机就受我们所写的操作系统来控制了。” 刚刚运行代码时,我不明不白了改了一个字符串,不过现在回过头来对比看看代码,和上面这段文字,仿佛有很多地方都开使变得明朗起来,我已经迫不急代的想知道那段代码究竟做了什么。 3.4 代码解释现在,我不得不承认我汇编没有好好学了,上面这段代码,在一个月前我是弄了好久 才看懂的。程序的主体是从第2行到第6行,通过三个mov指令初始化ds和es两个段寄存吕指向与cs相同的段,然后调用了DispStr子函数来显示一个字符串,最后通过jmp $进入无限循环。 $:表示当前语句所在的地址 $$:表示当前语句所在的段地址 最后还想说说这两句代码: times 510-($-$$) db 0 dw 0xaa55 “填充剩余空间,使生成的二进制代码恰好为512字节”为什么是512呢?因为BIOS加载的Boot Sector的大小固定为512字节,并且以511和512两字节内容是否为AA55来判断引导扇区,所以,通过times 510-($-$$) db 0填充0值,并设置511和512两个字节的值为AA55。这样,便构造了一个引导扇区。 3.5 搭建虚拟环境如果每次写完一段代码都要重启电脑,那开发操作系统的时间可大多浪费在重启电脑上了。选择一个虚拟机还是很有必要的。常用的虚拟机有VMware、Virtual PC。下图是上面写的引导代码在Virtual PC中的运行效果。 512字节毕竟还是太小了很明显,一个引导扇区只有512字节,不管怎样的操作系统都不可能在这么小的空间内做什么大的文章。所以,在如何引导了计算机这一问题解决了之后,我们应该想想,怎样能够突破512字节的限制。 4 学习总结这一次学习笔记将一个月来的准备,以及总分学习内容总结了一下,感觉写的还算蛮详细的。其中不少概念都不是当时就能想清楚的。不过随着接触的时间多了,一点点的都解开了。操作系统可大可以,大的如Unix,Windows,Linux,需要装一张CD,甚至是DVD,小的如MenuetOS,DOS,只要一张或几张软盘。不过怎么说,都少不了一个512K的引导扇区。 原文网址: http://hi.baidu.com/wmsnet/blog/item/8aa5152ae8eba9385243c1c9.html |
上一篇:引导型病毒分析-第2章
下一篇:DEBUG百度百科