30天自制操作系统

第0天

着手开发之前

??前言 ??何谓操作系统

??开发操作系统的各种方法 ??无知则无畏 ??如何开发操作系统 ??操作系统开发中的困难

??学习本书时的注意事项(重要!) ??各章内容摘要

11

前言

现在,挑选自己喜欢的配件来组装一台世界上独一无二的、个性化的PC(个人电脑)对我们 来说已不再困难。不仅如此,只要使用合适的编译器①,我们就可以自己编写游戏、制作自己的 工具软件;使用网页制作工具,我们还可以轻而易举地制作主页;如果看过名著《CPU制作法》② 的话,就连自制CPU也不在话下。

然而,在―自制领域‖里至今还有一个无人涉足的课题——自己制作操作系统(OS)③,它 看起来太难以至于初学者不敢轻易挑战。电脑组装也好,游戏、工具软件制作也好,主页也好, CPU也好,这些都已经成为初学者能够尝试的项目,而唯独操作系统被冷落在一边,实在有些遗 憾。―既然还没有这样的书,那我就来写一本。‖这就是笔者撰写本书的初衷。

也许是因为面向初学者的书太少的缘故吧,一说起操作系统,大家就会觉着那东西复杂得不 得了,简直是高深莫测。特别是像Windows和Linux这些操作系统,庞大得一张光盘都快装不下 了,要是一个人凭着兴趣来开发的话,不知道需要历经多么漫长的过程才能完成。笔者也认为, 像这么复杂的操作系统,单凭一个人来做,一辈子都做不出来。

——————————

① 英文为compiler,指能够将源代码编译成机器码的软件。

②《CPU制作法》,渡波郁著,每日Communications出版公司,ISBN 4-8399-0986-5。

③ Operating System的缩写,汉语译作―操作系统‖。Windows、Linux、MacOS、MS-DOS等软件的总称。

2 …… 第 0 天:着手开发之前

不过大家也不必担心太多。笔者就成功地开发过一个小型操作系统,其大小还不到80KB①。 麻雀虽小,五脏俱全,这个操作系统的功能还是很完整的。有人也许会怀疑:―这么小的操作系 ②③统,是不是只有命令行窗口 啊?要不就是没有多任务 ?‖不,这些功能都有。

怎么样,只有80KB的操作系统,大家不觉得稍作努力就可以开发出来吗?即使是初学者,

恐怕也会觉得这不是件难事吧?没错,我们用一个月的时间就能写出自己的操作系统!所以大家 不用想得太难,我们轻轻松松地一起来写写看吧。

以本书作者为主角开发的操作系统OSASK④

大家一听到编译后的文件大小为80KB可能会觉得它作为程序来讲已经很小了,不过曾

经编过程序的人可以查一查自己编的程序(.exe文件)的大小,这样就能体会到80KB到底是 难是易了。

——————————

① kilobyte,程序及数据大小的度量单位,1字节(byte)的1024倍。一张软盘的容量是1440KB。顺便提一下,1024KB 等于1MB(兆字节)。1字节是8个比特,正好能记录8位0和1的信息。B到底是指字节(byte),还是指比特(bit), 有时容易混淆。这里根据一般的规则,用大写B表示字节,小写b表示比特。

② console,通过键盘输入命令的一种方式,基本上只用文字进行计算机操作,是MS-DOS等老式操作系统的主流操 作方式。

③ 在操作系统的世界里,运行中的程序叫做―任务‖ 而同时执行多个任务的方式就被称为,―多任务‖ multitask)(。 ④ 笔者与他人一起合作开发的操作系统(趁机宣传一下)。虽然只有小小的78KB,不过为了做它也花了好几年的 时间。而这次能在短时间内开发完成操作系统,是因为我们较好地总结了开发操作系统所必要的知识。也就是 说,如果笔者在年轻时可以看到现在这本书的话,可能在短时间内就能开发出OSASK了,所以笔者很羡慕大 家呀。

2 何谓操作系统 …… 3

没编过程序的人也可以下载一个看上去不是很复杂的自由软件,看看它的可执行文件有 多大。Windows 2000的计算器程序大约是90KB,大家也可以根据这个想象一下。

本书对于不打算自己写操作系统,甚至连想都没想过这个问题的人来说也会大有裨益。举个 例子,读本自己组装PC的书就能知道PC是由哪些组件构成的,PC的性能是由哪些部分决定的; 读本如何编写游戏的书,就能明白游戏是怎样运行的;同理,读了本书,了解了操作系统的开发 过程,就能掌握操作系统的原理。所以说,对操作系统有兴趣的人,哪怕并不想自己做一个出来, 也可以看看这本书。

阅读本书几乎不需要相关储备知识,这一点稍后还会详述。不管是用什么编程语言,只要是 曾经写过简单的程序,对编程有一些感觉,就已经足够了(即使没有任何编程经验,应该也能看 懂),因为这本书主要就是面向初学者的。书中虽然有很多C语言程序,但实际上并没有用到很高 深的C语言知识,所以就算是曾经因为C语言太难而中途放弃的人也不用担心看不懂。当然,如 果具备相关知识的话,理解起来会相对容易一些,不过即使没有相关知识也没关系,书中的说明 都很仔细,大家可以放心。

0 3 20 21 22 7 8 9 10 11 12

本书以IBM PC/AT兼容机(也就是所谓的Windows个人电脑)为对象进行说明。至于其他机 型 ①,比如Macintosh(苹果机)或者PC-9821等,虽然本书也参考了其中某些部分,但基本上无 法开发出在这些机型上运行的操作系统,这一点还请见谅。严格地说,不是所有能称为AT兼容 机的机型都可以开发我们这个操作系统,我们对机器的配置要求是CPU高于386(因为我们要开 发32位操作系统)。换句话说,只要是能运行Windows 95以上操作系统的机器就没有问题,况且 现在市面上(包括二手市场)恐怕都很难找到Windows 95以下的机器了,所以我们现在用的机型 一般都没问题。

另外,大家也不用担心内存容量和硬盘剩余空间,我们需要使用的空间并不大。只要满足以 上条件,就算机器又老又慢,也能用来开发我们的操作系统。

22

何谓操作系统

13 14 15

说老实话,其实笔者也不是很清楚。估计有人会说:―连这个都不懂,还写什么书?‖不好

意思……笔者见过很多种操作系统,有的功能非常多,而有的功能特别少。在比较了各种操作系 统之后,笔者还是没有找到它们功能的共同点,无法下定义。结果就是,软件作者坚持说自己做 的就是操作系统,而周围的人也不深究,就那样默认了,以至于什么软件都可以算是操作系统。 笔者现在就是这么认为的。

既然就操作系统而言各有各的说法,那笔者也可以反过来利用这一点,一开始就根据自己的 需要来定义操作系统,然后开发出一个满足自己定义条件的软件就可以了。这当然也算是开发操 ——————————

① 本书所讲的操作系统内容仅用Macintosh是开发不了的,并且开发出的操作系统也不能直接在Macintosh上运行。 但是在PC上开发的操作系统,可以通过模拟器在Macintosh上运行。

15 16

4 …… 第 0 天:着手开发之前

作系统了。哪怕做一个MS-DOS那样的,在一片漆黑的画面上显示出白字,输入个命令就能执行 的操作系统也可以,这对笔者来说很简单。

但这样肯定会让一些读者大失所望。现在初学者也都见多识广,一提到操作系统,大家就会 联想到Windows、Linux之类的庞然大物,所以肯定期待自制操作系统至少能任意显示窗口、实 现鼠标光标控制、同时运行几个应用程序,等等。所以为了满足读者的期待,我们这次就来开发 一个具有上述功能的操作系统。

33

开发操作系统的各种方法

开发操作系统的方法也是各种各样的。

笔者认为,最好的方法就是从既存操作系统中找一个跟自己想做的操作系统最接近的,然后 在此基础上加以改造。这个方法是最节省时间的。

但本书却故意舍近求远,一切从零开始,完完全全是自己从头做起,这是因为笔者想向各位 读者介绍从头到尾开发操作系统的全过程。如果我们找一个现成的操作系统,然后在此基础上删 删改改的话,那这本书就不能涉及操作系统全盘的知识了,这样肯定无法让读者朋友满意。不过 由于是全部从零做起,所以篇幅长些,还请读者朋友们耐下心来慢慢看。

要开发操作系统,首先遇到的问题就是使用什么编程语言,这次我们想以C语言为主。―啊, C语言啊?‖笔者仿佛已经听到大家抱怨的声音了(苦笑)―这都什么年代了,。用C语言多土啊‖、 ―用C++多好呀‖―还是Java好‖―不,我就喜欢Delphi‖―我还是觉得Visual Basic最好‖……大、、、 家个人喜好习惯各不相同。这种心情笔者都能理解,但为了讲解时能简单一些,笔者还是想用C 语言,请大家见谅。C语言功能虽不多,但用起来方便,所以用来开发操作系统刚好合适。要是 用其他语言的话,仅讲解语言本身就要花很长时间,大家恐怕就没兴趣看下去了。

在这里先向大家传授一个从零开始开发操作系统的诀窍,那就是不要一开始就一心想着要开 发操作系统,先做一个有点操作系统样子的东西就行了。如果我们一上来就要开发一个完整的操 作系统的话,要做的东西太多,想想脑袋都大了,到时恐怕连着手的勇气也没有了。笔者就是因 为这个,几年间遇到了很多挫折。所以在这本书里,我们不去大张旗鼓地想着要开发一个操作系 统,而是编写几个像操作系统的演示程序①就行了。其实在开发演示程序的过程中大家就会逐步 发现,演示程序不再是简单的演示程序,而是越来越像一个操作系统了。

44

无知则无畏

当我们打算开发操作系统时,总会有人从旁边跳出来,罗列出一大堆专业术语,问这问那, 像内核怎么做啦,外壳怎么做啦,是不是单片啦,是不是微内核啦,等等。虽然有时候提这些问 ——————————

① 演示程序的英文是demonstration。指不是为了使用,而是为了演示给人看的软件。

联系客服:779662525#qq.com(#替换为@)