前言 纸上得来终觉浅,绝知此事要躬行。 ——陆游 本书适合谁读 本书是一本操作系统开发实践的技术书籍,对于操作系统技术感兴趣、想要亲身体验编写操作系统过程的实践主义者,以及Minix、Linux源代码爱好者,都可以在本书中了解到实践所需的知识和思路。 本书以“动手写”为指导思想,只要是跟“动手写”操作系统有关的知识,都进行讨论,从开发环境的搭建到保护模式,再到IBM PC中有关芯片的知识,最后到操作系统本身的设计实现,都能在本书中找到相应介绍。所以,如果你也想亲身实践的话,本书可以使你的学习过程事半功倍。在读完本书后,你不但对于操作系统有一个初步的感性认识,并且对IBM PC的接口、IA架构的保护模式,以及操作系统整体框架都会有一定程度的了解。 当你读完本书之后,再读那些纯理论性的操作系统书籍,体验将会完全不同,因为那些对你而言已不再是海市蜃楼了! 对于想阅读Linux源代码的操作系统爱好者来说,本书可以提供阅读前所必需的知识储备,这些知识也是很多Linux书籍没有提到的。 特别要说明的是,对于想通过Andrew S. Tanenbaum和Albert S. Woodhull所著的《操作系统:设计与实现》来学习操作系统的读者,本书尤其适合作为引路指南,因为它详细地介绍了初学者入门时所必需的知识,而这些知识在《操作系统:设计与实现》一书中是没有涉及的。笔者本人把该书作为写操作系统的主要参考书籍之一,所以在写作本书时对它多有借鉴。 你需要具备的基础 在本书中所用到的计算机编程语言只有两种:汇编语言和C语言。所以,只要你具备汇编语言和C语言的知识,就可以阅读本书。除对操作系统有常识性的了解(比如知道中断、进程等概念)之外,本书不假定读者具备其他任何经验。 如果你学习过操作系统的理论课程,就会发现本书是针对理论知识的补充,它是从实践的角度为你展现一幅操作系统画面。 书中涉及到Intel CPU保护模式、Linux命令等内容。如果笔者认为某些内容可以通过其他教材系统学习,会在书中加以说明。 另外,本书只涉及Intel x86平台。 统一思想——让我们在这些方面达成共识 道篇 ? 有效而愉快地学习 你大概依然记得,在亲自敲出第一个“Hello world”程序并运行成功时的喜悦,那样的成就感点燃了你对编写程序的浓厚兴趣。随后你不断地学习,每学到新的语法都迫不及待地在计算机上调试运行,在调试的过程中克服困难,又学到新知识,并获得新的成就感。 可现在请你设想一下,假如课程不是这样安排的,而是先试图告诉你所有的语法,中间没有任何实践的机会,试问这样的课程你能接受吗?我想惟一的感受就是索然无味。 原因何在?因为你体会不到通过不断实践而带来的一次一次的成就感。而成就感是学习过程中快乐的源泉。没有了成就感,学习效率将大打折扣。 每个人都希望有效且愉快地学习,可不幸的是,我们见到的操作系统课程十之八九都是在喋喋不休地讲述着进程管理、存储管理、I/O控制、调度算法,我们到头来也没有一点的感性认识。我们好像已经理解却又好像一无所知。很明显,没有成就感,一点也没有。笔者厌烦这样的学习过程,也绝不会重蹈这样的覆辙。让读者获得成就感将是本书的灵魂! 其实,本书完全可以称做一本回忆录,记载了笔者从一开始(不知道保护模式为何物)到最后(形成一个小小的操作系统)的全过程。回忆录性质保证了章节安排完全遵从操作的时间顺序,于是也就保证了每一步的可操作性。毫无疑问,顺着这样的思路走下来,每一章的成果都需要努力但又近在眼前。步步为营是我们的战术,不断获取成就感是我们的宗旨。 我们将从20行代码开始,使最最简单的操作系统婴儿慢慢长大,长成一位翩翩少年。而其中的每一步,都可以在书的指导下自己完成。不仅仅是可以看到,而且是自己能够做到!你将在不断的实践中获得不断的成就感,笔者真心希望在阅读本书的过程中,你的学习过程可以变得愉快而有效。 ? 学习的过程应该是从感性到理性的提升过程 在你没有登过泰山之前,无论书中怎样描写它的样子,你都无法想像出它的真实面目,即便配有插图,你对它的了解也仍是支离破碎的。毫无疑问,一千本描述泰山的书都比不上你一次登山的经历。文学家的描述是华丽而优美的,可这样的描述最终产生的效果是促使你非去亲自登泰山不可。反过来呢?假如你已 经登过泰山,这样的经历所产生的效果会使你想读尽天下所有描述泰山的书吗?恰恰相反,你可能再也不想去看那些文字描述了。 是啊,再好的讲述也比不上亲身的体验。人们的认知规律本来如此,有了感性的认识,才能上升为理性的思考。反其道而行之只能是事倍功半。 如果操作系统是一座这样的大山,本书愿做你的导游,引领你进入其中。传统的操作系统书籍仅仅是给你讲述这座大山的故事,你只是在听讲,并没有身临其境。而随着本书去亲身体验,则好像置身于山门之内,你不但可以看见眼前的每一个细节,更是具有了走完整座大山的信心。 要强调一点,本书旨在引路,不会带领你走完整座大山,但是有兴趣的读者完全可以在本书最终形成的框架的基础上轻松地实现其他操作系统书籍中讲到的各种原理和算法,从而对操作系统有个从感性到理性的清醒认识。 ? 暂时的错误并不可怕 当我们对一件事情的全貌没有很好地理解的时候,很可能会对某一部分产生理解上的误差,这就是所谓的断章取义。很多时候断章取义是难免的,但是,在不断学习的过程中,我们会逐渐看到更多,了解更多,对原先事物的认识也会变得深刻甚至完全不同。 对于操作系统这样复杂的事物来说,要想了解所有的细节无疑是非常困难的。所以,在实践的过程中,可能在很多地方会有一些误解产生。这都没有关系,随着了解的深入,这些误解总会得到澄清,到时你会发现,自己对某一方面已经非常熟悉了,这时的成就感,一定会让你备感愉悦。 本书内容的安排,遵从的是代码编写的时间顺序,它更像是一本开发日记,所以在书中一些中间过程中不完美的产物被有意保留了下来,并会在以后的章节中对它们进行修改和完善。因为笔者认为,精妙的背后一定隐藏着很多中间产物,一个伟大的发现在很多情况下可能不是天才们刹那间的灵光一闪,背后也一定有着我们没有看到的不伟大甚至是谬误。笔者很想追寻前辈们的脚步,重寻他们当日的足迹。做到这一点无疑很难,但即便不足以做到,只要能引起读者们的一点思索,也是莫大的欣慰。 ? 挡住前路的,往往不是大树,而是小藤 如果不是亲身去做,你可能永远都不知道什么是困难。就好像你买了一台功能很全的微波炉回家,研究完整本说明书,踌躇满志地想要烹饪的时候,却突然发现家里的油盐已经用完。而当时已经是晚上11点,所有的商店都已经关门,你气急败坏,简直想摸起铁勺砸向无辜的微波炉。 研究说明书是没有错的,但是在没开始之前,你永远都想不到让你无法烹饪的原因居然是10块钱1瓶的油,以及更加微不足道的1块钱1袋的盐。你还以为困难是微波炉面板上密密麻麻的控制键盘! 其实做其他事情也是一样的,比如写一个操作系统,即便一个很小的可能受理论家们讥笑的操作系统雏形,仍然可能遇到一大堆你没有想过的问题,而这些问题在传统的操作系统书籍中根本没有提到,本书详述了这一大堆可能遇到却想不到的问题。所以,惟一的办法便是亲自去做,只有实践了,才知道是怎么回事! 术篇 ? 用到什么再学什么 我们不是在考试,只是出于自己的兴趣,所以,就让我们忠于自己的喜好吧,不必为了考试而看完所有的章节。让我们马上投入实践,遇到问题再寻觅解决的办法。笔者非常推崇这样的学习方法: 实践→遇到问题→解决问题→再实践 由于我们知道我们为什么学习,所以才会非常投入;由于我们知道我们的目标是解决什么问题,所以才会非常专注;由于我们在实践中学习,所以才会非常高效。最有趣的是,最终你会发现你并没有因为选择这样的学习方法而少学到什么,相反,你会发现你用更少的时间学到了更多的东西,并且格外扎实。 ? 只要用心,就没有学不会的东西 笔者还清楚地记得刚刚下载完Intel Architecture Software Developer Manual那3个可怕的PDF文件时的心情,那时心里暗暗嘀咕,什么时候才能把这些东西读懂啊!可是突然有一天,当这些东西真的已经被读完的时候,我想起当初的畏惧,算来时间其实并没有过去多久。 所有的道理都是相通的,我们所做的并非创造性的工作,所有的问题前人都曾经解决过,所以我们更应无所畏惧。更何况不仅有书店,而且有因特网,动动手就能找到需要的资料,我们只要认真研究就够了。所以当遇到困难时,请静下心来,慢慢研究,只要用心,就没有学不会的东西。 ? 适当地囫囵吞枣 如果囫囵吞枣仅仅是学习的一个过程而非终点,那么它并不一定就是坏事。大家都应该听说过鲁迅先生学习英语的故事,他建议在阅读的过程中遇到不懂的内容可以掠过,等到过一段时间之后,这些问题会自然解决。 在本书中,有时候可能先列出一段代码,告诉你它能完成什么,这时你也可以大致读一下,因为下面会有对它详细的解释。第一遍读它的时候,你只要了解大概就够了。 本书的原则 ? 宁可啰嗦一点,也不肯漏掉细节 在书中的有些地方,你可能觉得有些很“简单”的问题都被列了出来,甚至显得有些啰嗦。因为笔者自己在读书的时候有一个体验,就是有时一个问题怎么也想不通,经过很长时间终于弄明白的时候才发现原来是那么“简单”。可能该书的作者认为它足够简单以至于可以跳过不提,但读者未必一下子就能弄清楚。所以,本书在很多地方将尽量地细节阐述得很清楚,以节省、读者理解的时间。 在本书后面的章节中,如果涉及的细节是前面章节提到过的,就会有意地略过。举个非常简单的例子,开始时本书会提醒读者增加一个源文件之后不要忘记修改Makefile,到后来就假定读者已经熟悉了这个步骤,就不再提及了。 ? 努力做到平易近人 笔者更喜欢把本书称做一本笔记或者学习日志,不仅仅是因为它基本是真实的学习过程的再现,而且笔者不想让它有任何居高临下甚至是晦涩神秘的感觉。如果哪怕有一个地方你觉得书中没有说清楚以至于你没有弄明白,请你告诉我,我会在以后做出改进。 ? 代码注重可读性,但不注重效率 本书的代码力求简单易懂,在此过程中很少考虑运行的效率。一方面因为书中的代码仅仅供学习之用,暂时并不考虑用做实际用途;另一方面,笔者认为当我们对操作系统足够了解之后再考虑效率也不迟。 光盘说明 书后所附光盘中有本书用到的所有源代码。源代码并不是只有一份,而是每增加一部分模块就有一份,后一部分所附代码是在前一部分基础上完成的,所以读者在阅读本书的时候可以做到彻底的步步为营,你不必从一大堆不必要的代码中找出自己想要的部分。 在书的正文引用的代码中会标注出出自哪个文件。以在Windows下为例,如果光盘的盘符是“F:”,则“\chapter5\b\bar.c”表示文件的绝对路径为“F:\Tinix\ chapter5\b\bar.c”。 另外,光盘中还有一些必要的小工具,以供读者方便地使用。 光盘内容摘要请见下表。 位 置 内 容 说 明 \Tinix 书中涉及的全部源代码 书中的章节和代码对照表请见附录 其中很多目录中除了包含源代码(*.asm、*.inc、*.c、*.h)外,还有其他类型的一些文件 boot.bin 引导扇区(Boot Sector),可通过FloppyWriter写入软盘(或软盘映像) loader.bin Loader,直接复制至软盘(或软盘映像)根目录 kernel.bin 内核(Kernel),直接复制至软盘(或软盘映像)根目录 bochsrc.bxrc Bochs配置文件,如果系统中安装了Bochs 2.1.1可直接双击运行它。其他细节请见2.7节 godbg.bat 调试时可使用此批处理文件。它假设Bochs 2.1.1安装在D:\Program Files\Bochs-2.1.1\中 TINIX.IMG 软盘映像,可直接通过Bochs或者Virtual PC运行 *.com 可以在DOS(必须为纯DOS)下运行的文件 \Tools 一些小工具(在VC 6下编译通过) DescParser 描述符分析器,输入描述符的值,可以得出其基址、界限、属性等信息 ELFParser ELF文件分析器,可以列出一个ELF文件的ELF Header、Program Header、Section Header等信息 FloppyWriter 用以写引导扇区,支持软盘和软盘映像 KrnlChecker 用以检查一个Tinix内核加载后位置是否正确 读者与作者技术交流,可上书友论坛:http://forum.broadview.com.cn。 意见反馈请发邮件至:editor@broadview.com.cn或jsj@phei.com.cn。 ================== 虽然看不懂,但是实在是羡慕能写操作系统的~~、 无光盘,光盘内容的软件可以根据上面的名称 上网查 http://www.jsharer.com/blog/344406.htm 网盘下载 |
欢迎光临 世界之窗论坛 (http://bbs.theworld.cn/) | Powered by Discuz! 7.2 |