无论是一般的技术还是专业性很强的计算机,对于试图了解它们的人们来说都同样具有不可思议的魔力。技术的发展推动着对已确立的框架和曾经模糊的陈旧概念的重新评估。Linux操作系统已经对促进工业变革和商业营销方式做出了巨大贡献。GNU公共许可证的采用,以及与GNU软件的互动,使围绕开源的各种争论有了共同的标准。开源操作系统如此强大,Linux无疑是一个极其成功的典范,它以无法想像的魔力吸引着世界各地的程序员。.
对于数量庞大的计算机用户来说,越来越多的人使用了Linux。有了各种各样的发布版,社团的支持,以及工业后盾,Linux的应用也找到了安全的港湾,它的身影出现在大学、工业应用以及数以千万计的家庭用户中。
使用大潮促进了技术支持和新功能需求的日益增长。这样一来,愈来愈多的程序员发现自己对Linux内核的内幕感兴趣,因为大量现有的(还有快速增长的)军工企业需要支持不同的体系结构和种类繁多的新设备。
Linux操作系统的繁荣和发展归功于把内核移植到了Power体系结构,它覆盖了从高端的服务器到低端的嵌入式系统。随着各公司倾向于购买基于Power PC的系统来运行Linux,想知道Linux在该体系结构上运行机理的愿望就显得日益强烈。
适合的读者
本书可供不同级别的系统程序员、Linux爱好者以及应用程序开发者阅读,这些开发者渴望更好地理解自己的程序到底是如何工作的。只要有C知识,熟悉基本的Linux使用基础,还想知道Linux是如何工作的,那么你就会发现这本书提供了进行这种理解基本而必要的概念,可以说,本书是理解Linux内核如何工作的初级读本。
不管你是编写过在Linux上运行的小程序,还是已开发过系统但正在寻求对某个子系统特性的理解,本书所编写的内容都是你所期待的。
内容组织
本书分为三部分,每部分都提供必要的知识,让读者能顺畅地钻研Linux内幕。
第一部分提供必要的工具,并理解对Linux内幕所进行的探索。
第1章“概述”,叙述Linux和UNIX的历史,罗列很多发布版,并从用户空间的观点简述各种内核子系统。
第2章“内核探索工具集”,描述Linux内核中常用的数据结构和语言的用法,介绍x86和PowerPC体系结构的汇编语言,并简述一些工具和实用程序,从而可以获取理解内核内幕所需的信息。
第二部分介绍了在每个内核子系统中所涉及的基本概念,并分析了执行子系统功能的必要代码。
第3章“进程:程序执行的基本模型”,涵盖了进程模型的实现。解释了为何引入进程,并讨论了用户空间到内核空间的控制流,也讨论了内核空间到用户空间的控制流。我们还讨论了进程在内核中是如何实现的,并描述了所有与进程执行相关的数据结构。本章还涵盖了中断和异常,描述了这些硬件机制在每种体系结构中是如何发生的,它们与Linux内核又是如何交互的。
第4章“内存管理”,描述了Linux内核如何追踪和管理用户空间进程的可用内存和内核的可用内存。本章描述了内核对内存分类的方式,以及如何决定分配和释放内存,也详细描述了缺页机制以及它是怎样在硬件上执行的。..
第5章“输入/输出”,描述了处理器是如何与其他设备进行交互的,内核又是如何响应和控制这些交互的。本章还涵盖了各种设备及其在内核中的实现。
第6章“文件系统”,概述文件和目录如何在内核中实现。本章引入了虚拟文件系统,它是用于支持多文件系统的抽象层。本章还跟踪了文件相关操作的执行,如打开和关闭文件。
第7章“调度和内核同步”,描述调度程序的操作,调度程序让多个进程运行起来就像只有一个进程在系统中运行一样。本章详细描述了内核如何选择一个任务运行,进程切换时如何与硬件进行交互。本章还叙述了什么是内核抢占,它又是怎样执行的。最后,描述了系统时钟的工作原理,内核怎样使用它计时。
第8章“内核引导”,描述电源开和关时都发生些什么。本章对各种处理器装入内核的方式进行了跟踪,包括对BIOS、Open Firmware和bootloaders的描述。然后,考察了内核启动和初始化时的线性顺序,涵盖了前面章节中讨论的所有子系统。
第三部分,描述如何构建内核并与内核进行交互的多种途径。
.第9章“构建Linux内核”,涵盖了编译内核所必需的工具和执行的目标文件的格式。还详细描述了内核源代码编译(Kernel Source Build)系统是如何操作的,怎样把配置选项加到内核编译系统中。
第10章“向内核添加代码”,描述了/dev/random操作,这在所有的Linux系统中都可以看到。就像对熟悉的设备进行描述一样,本章还从更实战的观点触及了曾经描述过的概念。最后,还描述了如何给自己的设备编写代码。
探索方法
本书向读者介绍了理解内核的必要概念。我们遵循自顶向下的方式来组织内容,具体体现在以下两个方面:
首先,我们把内核的工作和用户空间所执行的操作关联起来,因为读者对后者更熟悉,并渴望以这样的方式理解内核的工作原理。在可能的情况下,我们会从用户空间的例子说起,并跟踪代码的执行到内核。但有时,这种跟踪方式并不总是可行,因为子系统的数据类型和底层结构必须在解释其工作原理之前引入。在这些情况下,我们把对内核子系统的解释和它与用户空间程序如何联系的具体例子结合起来。有双重意图:其一,当内核一方面与用户空间打交道,另一方面与硬件打交道时突出了在内核看到的层面;其二,通过跟踪代码和事件发生的顺序来解释子系统的工作原理。我们相信,这将有助于读者把内核的工作原理与自己所知道的知识相关联,也有利于让读者看到,一个特定的功能是怎样与操作系统的其他部分相
联系的。
其次,我们采用自顶向下的方法,考察针对子系统操作的主要数据结构,并观察其怎样与系统管理的执行行为相联系。我们尽力描述针对子系统操作的结构,并像追踪子系统的操作一样持续关注这些数据结构。...