Linux 的根源可以追溯到 Unix TM 的起源。1969 年,贝尔实验室研究小组的 Ken Thompson 开始在一个闲置的 PDP-7 上试验多用户、多任务操作系统。他很快加入了 Dennis Richie,他们两人以及研究小组的其他成员制作了早期版本的 Unix TM。Richie 受到早期项目 MULTICS 的强烈影响,Unix TM 这个名称本身就是对名称 MULTICS 的双关语。早期版本是用汇编代码编写的,但第三个版本是用一种新的编程语言 C 重写的。C 是 Richie 专门为编写操作系统而设计和编写的编程语言。这次重写使得 Unix TM 能够转移到当时 DIGITAL 生产的更强大的 PDP-11/45 和 11/70 计算机上。正如他们所说,剩下的就是历史了。Unix TM 走出了实验室,进入了主流计算领域,很快大多数主要的计算机制造商都在生产自己的版本。
Linux 是解决一个简单需求的方案。Linux 的作者和主要维护者 Linus Torvalds 唯一能负担得起的软件是Minix. Minix是一个简单的、类似 Unix TM 的操作系统,广泛用作教学辅助工具。Linus 对其功能不太满意,他的解决方案是编写自己的软件。他以 Unix TM 为模型,因为那是他在日常学生生活中熟悉的操作系统。他从一台基于 Intel 386 的 PC 开始编写。进展迅速,Linus 对此感到兴奋,并通过新兴的全球计算机网络(当时主要供学术界使用)向其他学生提供了他的成果。其他人看到了该软件并开始做出贡献。许多新的软件本身就是对其中一位贡献者遇到的问题的解决方案。不久之后,Linux 就变成了一个操作系统。重要的是要注意,Linux 不包含任何 Unix TM 代码,它是一个基于已发布的 POSIX 标准的重写版本。Linux 是使用自由软件基金会在马萨诸塞州剑桥市生产的许多 GNU(GNU's Not Unix TM)软件构建和使用的。
大多数人将 Linux 用作一个简单的工具,通常只是安装许多优秀的基于 CD-ROM 的发行版之一。许多 Linux 用户使用它来编写应用程序或运行其他人编写的应用程序。许多 Linux 用户如饥似渴地阅读 HOWTO1,当系统的某些部分配置正确时,他们会感到成功的喜悦,而当配置不正确时,他们会感到失败的沮丧。少数人敢于编写设备驱动程序并向 Linux 内核的创建者和维护者 Linus Torvalds 提供内核补丁。Linus 接受来自任何地方的任何人对内核源代码的添加和修改。这听起来可能像是无政府状态的配方,但 Linus 实施严格的质量控制,并将所有新代码合并到他自己的内核中。但在任何时候,只有少数人向 Linux 内核贡献源代码。
大多数 Linux 用户不关注操作系统的运行方式,以及它是如何组合在一起的。这很遗憾,因为研究 Linux 是了解操作系统如何工作的一个非常好的方法。它不仅编写精良,而且所有源代码都免费提供供您查看。这是因为尽管作者保留对其软件的版权,但他们允许根据自由软件基金会的 GNU 通用公共许可证自由再分发源代码。但乍一看,源代码可能会令人困惑;您会看到名为kernel, mm和net的目录,但它们包含什么,这些代码是如何工作的?需要的是对 Linux 的整体结构和目标的更广泛的理解。简而言之,这就是本书的目标:促进对 Linux(操作系统)工作原理的清晰理解。提供一个思维模型,让您能够想象当您将文件从一个位置复制到另一个位置或阅读电子邮件时,系统内部正在发生的事情。我清楚地记得当我第一次意识到操作系统实际上是如何工作时的兴奋之情。我希望将这种兴奋之情传递给本书的读者。
我参与 Linux 是在 1994 年末,当时我拜访了 Jim Paradis,他正在进行 Linux 到基于 Alpha AXP 处理器的系统的移植工作。自 1984 年以来,我一直在 Digital Equipment Co. Limited 工作,主要从事网络和通信方面的工作,1992 年我开始为新成立的 Digital Semiconductor 部门工作。该部门的目标是全面进入商业芯片供应商市场,销售芯片,特别是 Alpha AXP 系列微处理器,以及 Digital 以外的 Alpha AXP 系统板。当我第一次听说 Linux 时,我立刻看到了一个获得乐趣的机会。Jim 的热情具有感染力,我开始帮助进行移植工作。随着我在这方面的工作,我越来越欣赏不仅是操作系统,还有生产它的工程师社区。
然而,Alpha AXP 只是 Linux 运行的众多硬件平台之一。大多数 Linux 内核都在基于 Intel 处理器的系统上运行,但越来越多的非 Intel Linux 系统变得越来越普遍。其中包括 Alpha AXP、ARM、MIPS、Sparc 和 PowerPC。我本可以使用任何一个平台来编写本书,但我的背景和使用 Linux 的技术经验是基于 Alpha AXP 上的 Linux,以及在较小程度上基于 ARM 上的 Linux。这就是为什么本书有时使用非 Intel 硬件作为示例来说明一些关键点的原因。必须指出的是,大约 95% 的 Linux 内核源代码对于它运行的所有硬件平台都是通用的。同样,本书大约 95% 的内容是关于 Linux 内核的机器无关部分。
我特意没有用以下术语来描述内核的算法,即它的做事方法routine_X()调用routine_Y()它递增了foo字段的bar数据结构。您可以阅读代码来找出这些内容。每当我需要理解一段代码或向其他人描述它时,我通常从在白板上绘制其数据结构开始。因此,我相当详细地描述了许多相关的内核数据结构及其相互关系。
每个章节都是相当独立的,就像它们各自描述的 Linux 内核子系统一样。但是,有时也存在联系;例如,如果不了解虚拟内存的工作原理,就无法描述进程。
硬件基础知识章节(第 hw-basics-chapter 章)简要介绍了现代 PC。操作系统必须与充当其基础的硬件系统紧密合作。操作系统需要某些只能由硬件提供的服务。为了充分理解 Linux 操作系统,您需要了解底层硬件的基础知识。
软件基础知识章节(第 sw-basics-chapter 章)介绍了基本的软件原理,并介绍了汇编和 C 编程语言。它介绍了用于构建像 Linux 这样的操作系统的工具,并概述了操作系统的目标和功能。
内存管理章节(第 mm-chapter 章)描述了 Linux 处理系统中物理和虚拟内存的方式。
进程章节(第 processes-chapter 章)描述了什么是进程,以及 Linux 内核如何在系统中创建、管理和删除进程。
进程彼此之间以及与内核进行通信,以协调它们的活动。Linux 支持多种进程间通信 (IPC) 机制。信号和管道是其中的两种,但 Linux 也支持以 System V IPC 机制命名的 Unix TM 版本,它们首次出现在该版本中。这些进程间通信机制在第 IPC-chapter 章中描述。
外围组件互连 (PCI) 标准现已牢固确立为 PC 的低成本、高性能数据总线。PCI 章节(第 PCI-chapter 章)描述了 Linux 内核如何初始化和使用系统中的 PCI 总线和设备。
中断和中断处理章节(第 interrupt-chapter 章)介绍了 Linux 内核如何处理中断。虽然内核具有用于处理中断的通用机制和接口,但一些中断处理细节是硬件和架构特定的。
Linux 的优势之一是它对现代 PC 的许多可用硬件设备的支持。设备驱动程序章节(第 dd-chapter 章)描述了 Linux 内核如何控制系统中的物理设备。
文件系统章节(第 filesystem-chapter 章)描述了 Linux 内核如何维护其支持的文件系统中的文件。它描述了虚拟文件系统 (VFS) 以及如何支持 Linux 内核的真实文件系统。
网络和 Linux 几乎是同义词。在非常真实的意义上,Linux 是互联网或万维网 (WWW) 的产物。它的开发人员和用户使用网络交换信息、想法、代码,Linux 本身通常用于支持组织的联网需求。第 networks-chapter 章描述了 Linux 如何支持统称为 TCP/IP 的网络协议。
内核机制章节(第 kernel-chapter 章)介绍 Linux 内核需要提供的一些通用任务和机制,以便内核的其他部分有效地协同工作。
模块章节(第 modules-chapter 章)描述了 Linux 内核如何在需要时动态加载函数,例如文件系统。
处理器章节(第 processors-chapter 章)简要介绍了 Linux 已移植到的一些处理器。
源代码章节(第 sources-chapter 章)描述了您应该从 Linux 内核源代码中的哪些位置开始查找特定的内核函数。
衬线字体 | 标识要键入的命令或其他文本 |
由用户字面输入。 | |
等宽字体 | 指数据结构或字段 |
在数据结构中。 |
在整个文本中,都引用了 Linux 内核源代码树中的代码片段(例如,与此文本相邻的方框边注)。提供这些内容是为了方便您查看源代码本身,所有文件引用都相对于/usr/src/linux。以foo/bar.c为例,完整的文件名将是/usr/src/linux/foo/bar.c如果您正在运行 Linux(您应该这样做),那么查看代码是一次有益的体验,您可以使用本书作为理解代码的辅助工具,并作为其许多数据结构的指南。
Caldera、OpenLinux 和“C”徽标是 Caldera, Inc. 的商标。
Caldera OpenDOS 1997 Caldera, Inc.
DEC 是 Digital Equipment Corporation 的商标。
DIGITAL 是 Digital Equipment Corporation 的商标。
Linux 是 Linus Torvalds 的商标。
Motif 是 The Open System Foundation, Inc. 的商标。
MSDOS 是 Microsoft Corporation 的商标。
Red Hat、glint 和 Red Hat 徽标是 Red Hat Software, Inc. 的商标。
UNIX 是 X/Open 的注册商标。
XFree86 是 XFree86 Project, Inc. 的商标。
X Window System 是 X Consortium 和 Massachusetts Institute of Technology 的商标。
我于 1957 年出生在英格兰北部,就在人造卫星发射前几周。我第一次接触 Unix 是在大学里,一位讲师在教授内核、调度和其他操作系统知识时将其作为一个例子。我喜欢使用新交付的 PDP-11 来完成我的毕业设计项目。毕业后(1982 年获得计算机科学一等荣誉学位),我曾在 Prime Computers (Primos) 工作,然后在几年后在 Digital (VMS, Ultrix) 工作。在 Digital,我从事过许多工作,但在那里的最后 5 年,我在半导体部门从事 Alpha 和 StrongARM 评估板的工作。1998 年,我搬到了 ARM,在那里我有一个由工程师组成的小组,负责编写底层固件和移植操作系统。我的孩子们(Esther 和 Stephen)形容我是个极客。
人们经常在工作和在家时向我询问 Linux,我非常乐意效劳。我在专业和个人生活中使用 Linux 的次数越多,我就越成为 Linux 狂热者。您可能会注意到我使用了“狂热者”而不是“顽固分子”这个词;我将 Linux 狂热者定义为认识到存在其他操作系统但不喜欢使用它们的爱好者。正如我的妻子 Gill(她使用 Windows 95)曾经说过的那样,“我从没意识到我们会拥有他和她的操作系统”。对我这个工程师来说,Linux 完全适合我的需求。它是一个卓越、灵活且适应性强的工程工具,我在工作和家庭中使用它。大多数免费提供的软件都可以轻松地在 Linux 上构建,我通常可以简单地下载预构建的可执行文件或从 CD-ROM 安装它们。否则我还能用什么免费学习 C++、Perl 编程或学习 Java 呢?
我必须感谢许多抽出时间给我发电子邮件,对本书提出意见的人。我已尝试将这些意见纳入我制作的每个新版本中,我非常乐意接受意见,但请注意我的新电子邮件地址。
许多讲师写信给我,询问他们是否可以使用本书的部分或全部内容来教授计算机。我的回答是肯定的;这正是我特别希望本书实现的一个用途。谁知道呢,班上可能坐着另一个 Linus Torvalds。
特别感谢 John Rigby 和 Michael Bauer,他们对整本书进行了全面、详细的审查。这不是一件容易的任务。Alan Cox 和 Stephen Tweedie 耐心地回答了我的问题 - 谢谢。我使用了 Larry Ewing 的企鹅来让章节更生动一些。最后,感谢 Greg Hankins 接受本书加入 Linux 文档项目并将其发布到他们的网站上。
1 HOWTO 正如其名称所示,是一份描述如何做某事的文档。已经为 Linux 编写了许多 HOWTO,所有这些都非常有用。