萝卜甲@ZJU 2004 yujiazi@gmail.com
转载请保留以上信息
当年Windows NT的设计师David Cutler带领他的团队在一个星期之内搞定了一个bootable kernel后放出了句:"Who can write an OS in a week?",真是牛气冲天啊,不过我们也要尝试着来"write a bootable kernel in a week"来杀杀David的锐气!呵呵,说笑了。其实我写本文的目的是为了让OS初学者和爱好者能够更加深入了解一个OS kernel的设计,实现和运作过程,其中列举了很多实例而不至于太过于枯燥。不过本人水平有限,疏漏在所难免,希望大家能够多多指教。如果这篇文章能够起到抛砖引玉的作用,那么我的目的也就达到了。
不过说起写一个OS kernel还真不是一件容易的事,因为太过于庞杂以至于无法下手。先不要着急,我们先来看看OS到底是个什么东西。OS在很多书上被定义为有两个作用:
1 为应用程序提供一个虚拟的运行平台
2 管理和分配计算机资源
这两条看起来很抽象,其实细究起来也很简单,第一条的目的是让应用程序只需要关心操作系统提供的虚拟平台而不用关心很多杂七杂八的硬件操作和其他的事务,比如应用程序调用了操作系统图形功能中的一个DrawRectangle()来画一个矩形,而不必关心操作系统是怎么完成的,也不必关心这个机器用的是什么显卡,ATI的Radeon还是nVidia 的TNT还是其他什么显卡,没有人希望在写一个游戏的时候还得自己写一个DrawRectangle()并且要为每种显卡都设计一个不同版本的DrawRectangle()以适应不同的硬件细节,不光是显卡,还有声卡,网卡等等怎么办?所以懒惰的应用程序设计者就把这些杂活全部交给OS设计者来完成了。虚拟平台的还有一个内容就是很多应用程序在同时运行的时候,每个程序都感觉自己是在一台独立的机器上运行而不会感觉到其他程序的存在(进程间通信除外),这就是所谓的多进程系统。在多进程系统中,每个程序都感觉自己拥有一个独立的CPU,一个独立的很大的内存空间以及一些独立的硬件资源。所以OS要做到很好地"骗"应用程序,让他感觉很爽就对了。
第二条其实是建立在第一条基础上的,既然有很多进程在同时运行,那么硬件资源就不可能都给一个进程而需要分配给不同的进程使用,这就涉及到资源的分配和管理。看到这儿,不知道各位有何感受,既然OS命苦,要做很多杂活,不过其实作OS也是很爽的,因为计算机的所有资源你说了算,你说给A进程1M的内存就给他1M的内存,你说不给就不给,怎么样?有没有掌控一切的感觉?这就对了!有失必有得嘛!
搞了半天终于把OS的基本面貌搞清楚了,接下来就是怎么实现一个OS了。OS的种类有很多,设计方法也很多,不过我在这里介绍一种比较简单也比较容易理解的单一内核(Mono-kernel)结构,传统的Unix和Linux都是采用这种结构。单一内核结构优点是运行速度快,结构简单,容易实现。其他的内核结构如微内核(Micro-kernel)等比较麻烦,暂时先不要理他了。选好了OS内核结构以后,要选定目标硬件。就是你的OS是要在常见的Intel x86 PC机上跑呢,还是在掌上电脑上,或者你别出心裁想让你的OS在你的Nokia手机上跑呢?不过出于开发和调试的方便,我们暂且选定最常见的Intel x86 PC上,因为只要你有一台像样的电脑,你就拥有了很完善的实验室,不需要任何其他设备。
接下来就要定位我们的OS了,我们写这个OS是用来商业应用呢,还是自己捣鼓着玩呢,是随便自己定义的API呢还是要跟Windows或者*nix兼容呢(汗),是多任务系统呢还是单任务呢,是不是有图形界面呢,是不是支持多路CPU呢,是不是支持磁盘阵列呢,分布式....(貌似越来越离谱了 -_-!)。OK,既然我们要在一个星期之内搞定,那么先不要把目标定得太高吧,一步一步来,我们暂时定的目标是:
1 多进程,多线程
2 字符界面
3 简单的虚拟存储
4 单CPU
5 是否支持硬盘看时间吧
今天是Write An OS In A Week的第一天,所以先要准备好一些接下来要用的工具。我把它归结如下:
编译器:VC or GCC both ok。 VC的话推荐用VC7,也就是VS.net 带的那个编译器。GCC如果你的windows用户的话可以用gcc的DOS版,djgpp(http://www.delorie.com/djgpp/),他的最新版用的是gcc 3.3.2。不推荐用Mingw,因为它在编译的时候会加入很多不必要的因素,使得编译出来的内核经常有问题。汇编器我推荐NASM(http://nasm.sourceforge.net/),Intel的语法,支持浮动代码生成以及多种obj输出格式,绝对的OS开发利器。
编辑器:这个就看个人喜好了。windows下有VS.net, EditPlus很多,不过我相信你不会bt到用Notepad。Linux下可以用vi,Emacs等编辑器一大堆,
虚拟机:虚拟机是个很重要的OS调试和测试工具,如果你的OS每次都在真机上跑的话,一定会让你苦不堪言。虚拟机有很多,Virtual PC,VMware,Bochs等,前面两个差不多,都是速度比较快的虚拟机,但都不带Debugger,bochs虽然慢了点,但是自带debugger,所以是必备。
其他:16进制编辑器Win Hex 磁盘映像工具Win Image,版本控制CVS。*nix下可以用dd等。
要获得以上的工具很简单,很多都是open source的。OK!万事俱备,让我们期待Write An OS In A Week的第二天吧!