建立计算机操作系统就像编织锦缎,这两种工作的最终成品都是一个和谐一致、大型、复杂的人造系统。且在以上两种工作中,最后的人造成品都是经由细微、精巧的步骤所构造的。在编织锦缎时,细节至关重要,因为一点点不协调的瑕疵都很容易被观察到。就像锦缎里的缎面一样,加入操作系统里的每个新组件都需要与整体设计相协调。因此,将不同组件组装起来的机械加工只是整个建造过程中的一小部分,一个大师级产品必须以某个模式为蓝本,所有参与系统设计的工作人员都必须遵循这个模式。
具有讽刺意味的是,现有的操作系统教材或课程很少对底层的模式和原理进行解释,而这些模式和原理正是操作系统构造的基础。在学生看来,操作系统似乎是一个暗箱,而现有的教材则加深了这种误解,因为这些教材所解释的不过是操作系统的特性,其关注的也只是操作系统各种功能的使用。更为重要的是,学生在学习操作系统时采取的是从操作系统外面来查看的方式,从而常常导致这样一种感觉:操作系统由一组接口函数组成,这些接口下的功能由一大堆晦涩神秘的代码连接在一起,而这些神秘的代码本身还包含着许多与机器硬件直接相关的、无规律可循的奇技巧术。
令人惊奇的是,学生一旦从大学毕业,就马上觉得与操作系统有关的研究工作已经结束,自己不再需要理解或学习操作系统了,因为由商业公司和开源社区所构造的现有操作系统足以应付各种需要—没有什么比这种想法离真理更远了。与之相反,尽管为个人计算机设计传统操作系统的公司数量比以前更少了,但社会和行业对操作系统专门技术的需求却在增长,许多公司雇佣学生来从事操作系统方面的工作。这些需求增长主要源于更便宜的微处理器,而这些便宜的微处理器被广泛嵌入在智能手机、视频游戏产品、无线传感器、线缆和机顶盒以及打印机等设备中。
在与嵌入式系统打交道时,有关原理和结构的知识非常关键,因为程序员可能需要在现有的操作系统内部构造某种新的机制,或者对现有操作系统进行修改以便可以在新的硬件平台上运行。此外,为嵌入式设备编写应用程序需要理解底层操作系统。如果不理解操作系统设计的各种细微之处,则不可能充分开发小型嵌入式处理器的功能。
本书的目的是揭开操作系统设计的神秘面纱,将方方面面的材料整合为一个系统化的整体。本书对操作系统的主要系统组件进行了详细阐述,并以一种层次架构的设计范例来组织这些组件,从而以一种有序、可理解的方式来展开内容。与其他尽可能多地提供不同方案的评述性书籍不同的是,本书引导读者使用实用的、直截了当的原语来构造一个传统的基于进程的操作系统,从裸机开始,一步一步地设计和实现一个小型但优雅的操作系统。这个名为Xinu的操作系统将成为系统设计的一个样板和模式。
虽然Xinu操作系统的规模较小,可以完全容纳在本书中,但是该系统包含了构成一个普通操作系统的全部组件:内存管理、进程管理、进程协调和同步、进程间通信、实时时钟管理、设备无关的I/O、设备驱动、网络协议和文件系统。本书将这些组件组织成一个多层次架构,这使得它们之间的相互连接清晰可见、设计过程浅显易懂。尽管规模小,Xinu却拥有大型系统的大部分功能。此外,Xinu并不是一个“玩具”系统,它在很多商业产品中得到了应用。使用该系统的厂商包括Mitsubishi、Lexmark、HP、IBM、Woodward(woodward.com)、Barnard Software和Mantissa公司。读者通过本书可以学到的重要一课是:不管是小型嵌入式系统还是大型系统,好的系统设计都一样重要,而好的设计是通过选择好的抽象方法来实现的。
本书所覆盖的议题都以一种特定的次序排列,这种次序就是设计人员在构建操作系统时所遵守的工作次序。本书的每一章描述了设计架构里的一个组件,并提供示例软件来演示该层架构所提供的功能。使用这种方式具有如下优点:第一,每一章所解释的操作系统的功能子集均比上一章所讨论的功能子集更大,这种安排使得我们在考虑一层特定架构的设计和实现时不用关心后续层的实现。第二, 一个特定章节的细节描述在第一次阅读时可以跳过去,读者只需要理解该层所提供的服务即可,而不是这些服务是如何实现的。第三,如果按次序阅读本书,读者可以先理解某个功能,然后再应用该功能。第四,有智力挑战的议题(如对并发的支持)出现在书的较前面,高层次的操作系统服务则在后面展示。在本书中,读者将看到大多数核心功能仅仅用几行代码就可以完成,这样我们就可以将大体量的代码(网络和文件系统)放到书的较后面,在读者已经做好充分的思想准备后再进行讲解。
如前所述,与许多其他关于操作系统的书籍不同,本书并不试图对每个系统组件的每种实现方案进行评估,也不对现有的商业系统进行综述,而是对一组使用广泛的操作系统原语的实现细节进行阐述。例如,在讨论进程协调的一章,我们解释的是信号量(使用最广泛的进程协调原语),而将其他原语(如监视器)的讨论放至练习中。我们的目的是展示如何在传统硬件上实现原语,消除其神秘感。学生一旦理解了一组特定原语的魔力,其他原语的实现也就容易掌握了。
本书展示的Xinu代码可以运行在多种硬件平台上。我