本书是一本有关Linux操作系统内核基本工作原理的入门读物。 本书的主要目标 本书的主要目标是使用尽量少的篇幅,对完整的Linux内核源代码进行解剖,使读者对操作系统的基本功能和实际实现方式获得全方位的理解。 本书读者应是知晓Linux系统的一般使用方法或具有一定的编程基础,但比较缺乏阅读目前最新内核源代码的基础知识,又急切希望能够进一步理解UNIX类操作系统内核工作原理和实际代码实现的爱好者。这部分读者的水平应该界于初级与中级水平之间。目前,这部分读者人数在Linux爱好者中所占的比例是很高的,而面向这部分读者以比较易懂和有效的手段讲解内核的书籍资料不多。 现有书籍不足之处 目前已有的描述Linux内核的书籍,均尽量选用最新Linux内核版本(例如Fedora 8使用的2.6.24稳定版等)进行描述,但由于目前Linux内核整个源代码的大小已经非常大(例如2.2.20版就已具有268万行代码!),因此这些书籍仅能对Linux内核源代码进行选择性或原理性的说明,许多系统实现细节被忽略。因此并不能使读者对实际Linux内核有清晰而完整的理解。 Scott Maxwell的《Linux内核源代码分析》基本上是面对Linux中、高级水平的读者,需要较为全面的基础知识才能完全理解。而且可能是由于篇幅所限,该书并没有对所有Linux内核代码进行注释,略去了很多内核实现细节,例如内核中使用的各个头文件(*.h)、生成内核代码映像文件的工具程序、各个make文件的作用和实现等均没有涉及。因此对于处于初、中级水平之间的读者来说阅读该书有些困难。 John Lions的《莱昂氏UNIX源代码分析》虽然是一本学习UNIX类操作系统内核源代码很好的书,但是由于其采用的是UNIX V6版,其中系统调用等部分代码是用早已废弃的PDP-11系列机的汇编语言编制的,因此在阅读和理解与硬件部分相关的源代码时就会遇到较大的困难。 A. S. Tanenbaum的《操作系统:设计与实现》是有关操作系统内核实现很好的入门书籍,但该书所叙述的MINIX系统是一种基于消息传递的内核实现机制,与Linux内核的实现有所区别。因此在学习该书之后,并不能很顺利地即刻着手进一步学习较新的Linux内核源代码实现。 在使用这些书籍进行学习时会有一种“盲人摸象”的感觉,不容易真正理解Linux内核系统具体实现的整体概念,尤其是对那些Linux系统初学者,或刚学会如何使用Linux系统的人在使用那些书学习内核原理时,内核的整体运作结构并不能清晰地在脑海中形成。这在本人多年的Linux内核学习过程中也深有体会。在1991年10月,Linux的创始人Linus Torvalds在开发出Linux 0.03版后写的一篇文章中也提到了同样的问题。在这篇题为《Linux--a Free unix-386 Kernel》 的文章中,他说:“开发Linux是为了那些操作系统爱好者和计算机科学系的学生使用、学习和娱乐”。“自由软件基金会的GNU Hurd系统如果开发出来就已经显得太庞大而不适合学习和理解。”而现今流行的Linux系统要比当年GNU的Hurd系统更为庞大和复杂,因此同样也已经不适合作为操作系统初学者的入门学习起点。这也是作者基于Linux早期内核版本写作本书的动机之一。 阅读早期内核的其他好处 目前,已经出现不少基于Linux早期内核而开发的专门用于嵌入式系统的内核版本,如DJJ的x86操作系统、mClinux等(在www.linux.org上有专门目录),世界上也有许多人认识到通过早期Linux内核源代码学习的好处,目前国内也已经有人正在组织人力注释出版类似本文的书籍。因此,通过阅读Linux早期内核版本的源代码,的确是学习Linux系统的一种行之有效的途径,并且对研究和应用Linux嵌入式系统也有很大的帮助。 在对早期内核源代码的注释过程中,作者发现,早期内核源代码几乎就是目前所使用的较新内核的一个精简版本。其中已经包括了目前新版本中几乎所有的基本功能原理的内容。正如《系统软件:系统编程导论》一书的作者Leland L. Beck在介绍系统程序以及操作系统设计时,引入了一种极其简化的简单指令计算机(SIC)系统来说明所有系统程序的设计和实现原理,从而既避免了实际计算机系统的复杂性,又能透彻地说明问题。这里选择Linux的早期内核版本作为学习对象,其指导思想与Leland是一致的。这对Linux内核学习的入门者来说,是最理想的选择之一。 对于那些已经比较熟悉内核工作原理的人,为了能让自己在实际工作中对系统的实际运转机制不产生一种空中楼阁的感觉,因此也有必要阅读内核源代码。 当然,使用早期内核作为学习的对象也有不足之处。所选用的Linux早期内核版本不支持虚拟文件系统(VFS)和网络系统也不包含对现有内核中复杂子系统的说明,而仅支持a.out执行文件。但由于本书是作为Linux内核工作机理实现的入门教材,因此这也正是选择早期内核版本的优点之一。通过学习本书,可以为进一步学习这些高级内容打下坚实的基础。 阅读完整源代码的重要性和必要性 正如Linux系统的创始人在一篇新闻组投稿上所说的,要理解一个软件系统的真正运行机制,一定要阅读其源代码。系统本身是一个完整的整体,具有很多看似不重要的细节,但是若忽略这些细节,就会对整个系统的理解带来困难,并且不能真正了解一个实际系统的实现方法和手段。 虽然阅读一些操作系统原理经典书籍如M. J. Bach的《UNIX操作系统设计》,能够对UNIX类操作系统的工作原理有一些定了解,但实际上对操作系统的真正组成和内部关系实现的理解仍不是很清晰。正如Tanenbaum所说的,“许多操作系统教材都是重理论而轻实践”,“多数书籍和课程为调度算法耗费大量的时间和篇幅而完全忽略I/O。其实,前者通常不足一页代码,而后者往往要占到整个系统三分之一的代码总量。”内核中大量的重要细节均未提到。因此并不能让读者理解一个真正的操作系统实现的奥妙所在。只有在详细阅读过完整的内核源代码之后,才会对系统有一种豁然开朗的感觉,对整个系统的运作过程有深刻的理解。以后再选择最新的或较新内核源代码进行学习时,也不会遇到大问题,基本上都能顺利地理解新代码的内容。 如何选择要阅读的内核代码版本 那么,如何选择既能达到上述要求,又不被太多的内容而搞乱头脑,学习效率又高呢?作者通过对大量内核版本进行比较和选择后,最终选择了与目前Linux内核基本功能较为相近,又非常短小的0.12版内核作为入门学习的最佳版本。下图是对一些主要Linux内核版本行数的统计。 目前的Linux内核源代码量都在几百万行的数量上,2.6.0版内核代码行数约为592万行,极其庞大,对这些版本进行完全注释和说明几乎是不可能的。而0.12版内核不超过2万行代码量,因此完全可以在一本书中解释和注释清楚。麻雀虽小,五脏俱全。为了对所研究的系统有感性的了解,并能利用实验来加深对原理的理解,作者还专门重建了基于该内核的可运行的Linux 0.12系统。由于其中含有GNU gcc编译环境,因此使用该系统也能做一些简单的开发工作。 另外,使用该版本可以避免涉及较新内核版本中已经变得越来越复杂的各子系统(如VFS、ext2或ext3文件系统、网络子系统、新的复杂的内存管理机制等)。 阅读本书需具备的基础知识 在阅读本书时,读者必须具备一些基本的C语言知识和Intel CPU汇编语言知识。有关C语言最佳的参考资料仍然是Brian W. Kernighan和Dennis M. Ritchie编写的《The C Programming Language》一书。而汇编语言的资料则可以参考任意一本讲解与Intel CPU相关的汇编语言教材。另外,还需要一些嵌入式汇编语言的资料。有关嵌入式汇编的权威信息都包含在GNU gcc编译器手册中。我们也可以从Internet上搜索到一些有关嵌入式汇编的比较有价值的短文。本书中也包含了一些关于嵌入式汇编的基本语法说明。 除此之外,还希望读者具备以下一些基础知识或者有相关的参考书籍在身边。其一是有关80x86处理器结构和编程的知识或资料。例如,可以从网上下载的80x86编程手册(80386 Programmer''s Reference Manual);其二是有关80x86硬件体系结构和接口编程的知识或资料(有关这方面的资料很多);其三还应具备使用Linux系统的简单技能。 另外,由于Linux系统内核的实现最早是根据M. J. Bach的《UNIX操作系统设计》一书的基本原理开发的,源代码中许多变量或函数的名称都来自该书,因此在阅读本书时若能适当参考该书,会更易于理解内核源代码。 Linus在最初开发Linux操作系统时,参照了MINIX操作系统。例如,最初的Linux内核版本完全照搬了MINIX 1.0文件系统。因此,在阅读本书时,Tanenbaum的《操作系统:设计与实现》也具有较大的参考价值。但Tanenbaum的书描述的是一种基于消息传递在内核各模块之间进行通信(信息交换)的工作机制,这与Linux内核不一样,因此可以仅参考其中有关一般操作系统工作原理章节和文件系统实现的内容。 使用早期版本是否过时 表面看来,本书对Linux早期内核版本注释的内容犹如Linux刚公布时Tanenbaum就认为其已经过时(Linux is obsolete)的想法一样,但通过学习本书内容,你就会发现,利用本书学习Linux内核,由于内核源代码量短小而精干,因此会有极高的学习效率,能够做到事半功倍,快速入门。并且对进一步选择新内核部分源代码的学习打下坚实的基础。在学习完本书之后,你将对系统的运作原理有一个非常完整而实际的概念。这种完整概念能使人很容易地进一步选择和学习新内核源代码中的任何部分,而不需要再去啃读代码量巨大的新内核中完整的源代码。 Ext2文件系统与Minix文件系统 目前,Linux系统上所使用的Ext2(或最新的Ext3)文件系统是在内核1.x之后开发的。其功能详尽并且性能也非常稳定,是目前Linux操作系统上默认的标准文件系统。但是,作为对Linux操作系统完整工作原理入门学习所使用的部分,原则上是越精简越好。为了对一个操作系统有完整的理解,并且不受其中各子系统中复杂和过多的细节的干扰,在选择学习剖析用的内核版本时,只要系统的部分代码内容能说明实际工作原理,就越简单越好。 Linux内核0.12版仅包含最为简单的MINIX 1.0文件系统,对于理解一个操作系统中文件系统的实际组成和工作原理已经足够。这也是选择Linux早期内核版本进行学习的主要原因之一。 在完整阅读本书之后,相信您定会发出这样的感叹:对于Linux内核系统,我现在终于入门了!此时,您应该有十分的把握去进一步学习最新Linux内核中各部分的工作原理和过程了。 本书与《Linux内核完全剖析》的主要区别 本书采用了Linux 0.12版内核作为学习和剖析对象,而作者的《Linux内核完全剖析》(机械工业出版社,2006)则是围绕着Linux 0.11内核版本进行描述的。Linux 0.12版内核发布于1992年年初,它改正了0.11版中存在的一些错误,并提供了一些新的功能。Linux 0.12版内核增加的新功能主要有:符号链接、虚拟终端支持、select()函数支持和数学协处理器模拟代码实现。由于该版本内核在稳定性方面的出色表现,Linus曾提及0.12版内核是他在内核开发过程中最为满意的版本之一。 本书包含《Linux内核完全剖析》的所有内容,并在此基础上添加了一些与0.12版内核新功能相关的硬件信息。例如本书提供了比较完整的有关数学协处理器的资料。在写作布局和风格上本书保持着与《Linux内核完全剖析》相同的风格。书中章节设置顺序和注释风格没有变化。 当然,本书也改正了《Linux内核完全剖析》中的一些明显错误。这要感谢读者对本书提供的反馈以及热情的支持。 同济大学 赵炯 博士
Linux内核完全剖析——序
书名: Linux内核完全剖析
作者: 赵炯
出版社: 机械工业出版社
副标题: 基于0.12内核
出版年: 2008.10
页数: 945
定价: 99.00元
装帧: 平装
ISBN: 9787111250470