第1章 简介和概述

操作系统不仅是信息技术中非常吸引人的一部分,而且还是公众争论的主题1。在此发展过程中,Linux发挥了举足轻重的作用。然而仅仅10年前,学术用操作系统和商用操作系统还是有着严格区分的:前者相对简单而且可获得源代码;对后者而言,虽然不同的操作系统性能各不相同,但其源代码一直都是受到良好保护的秘密。现在,任何人都可以从因特网下载Linux(或任何其他自由操作系统)的源代码进行研究。

1 本书不打算参与意识形态上的讨论,诸如Linux是否是一个真正的操作系统。当然它事实上只是一个内核,没有其他组件是无法正常运转的。在我谈到Linux操作系统而没有明确地提及类似工程的简称时,这并不意味着我没有意识到该工程的重要性。这里的类似工程主要是指GNU工程,如果在名称上使用Linux而不是GNU/Linux,该工程的人士一般会很敏感。我的理由简单而实用。我们需要建立何种界限,才能在引用时不产生像GNU/IBM/RedHat/HP/KDE/Linux这样冗长的结构呢?如果读者觉得这个脚注没有意义,可以参考网页www.gnu.org/gnu/linux-and-gnu.html,该文总述了GNU工程的地位。在澄清了所有的意识形态问题之后,我保证在本书其余的部分不会再出现长达半页的脚注了。

Linux现在已经安装到了数百万台电脑上,无论是家庭用户还是专业人员,都可以在Linux上执行各种任务。无论是手表中的微型嵌入式系统,还是大规模并行大型机,Linux都可以在无数领域大展身手。而这使得Linux的源代码非常有趣。一个合理可靠、基础牢固的概念(UNIX操作系统)结合了强大的创新以及学术性操作系统所缺乏的解决问题的强烈倾向,这就是为什么Linux具备如此强大吸引力的原因。

本书描述了内核的主要功能,解释了其内部的结构,并研究了其实现。由于所讨论主题的复杂性,我假定读者已经对操作系统和C语言系统程序设计有一定的基础(当然,对Linux系统的熟悉是不言而喻的)。我会简要介绍与常见操作系统问题相关的几个基础概念,但本书主要的内容则集中于Linux内核的实现。市场上有许多讲述操作系统基础概念的教材,对某一特定主题不熟悉的读者,可以找一本看看。例如,Tanenbaum写的两本杰出的入门书籍([TW06]和[Tan07])。

本书要求读者有牢固的C语言程序设计基础。因为内核使用了C语言的许多高级技巧,尤其是GNU C编译器的许多专门特性。附录C讨论了C语言的一些精微之处,即使优秀的程序员可能也未必熟悉这些。由于Linux必然与系统硬件(特别是CPU)有非常直接的交互,因此了解一点计算机结构的基础知识是很有用的。该主题也有很多入门书籍可用,在参考文献章节中列出了一些相关书籍。在深入讲解CPU的知识时(大多数情况下,我都以IA-32或AMD64体系结构为例,因为Linux在这些体系结构上很常用),我会解释相关硬件的细节。在讨论不常见的机制时,我会解释机制背后的一般性概念,但对于某个特定的特性如何在用户空间中使用,则需要读者查询书中指明的手册页。

本章将概述内核所涉及的各种领域,并在后续章节中对相应的子系统进行长篇阐述之前,先行说明其基本关系。

由于内核的演变比较快速,读者很自然会问本书内容涵盖了哪一个内核版本。我选择了2.6.24版本的内核,该版本发布于2008年1月末。内核开发的动态性意味着,在阅读本书时,新版本的内核应该已经发布,所以某些细节很自然会有所改变,这是不可避免的。如果不是这样,那Linux将会成为一个死气沉沉、毫无乐趣的系统,读者也很可能就不会选择本书了。尽管一些细节将会发生变化,但书中描述的概念在本质上是不变的。对于2.6.24版本来说,这一点特别正确。因为与更早的版本比较,该版本有一些根本性的改动。很自然,开发者也无法隔一夜就折腾一些此类特性出来。

目录