Linux内核源代码分析-第一章 linux介绍

第1章 Linux 简介
让用户很详细地了解大多数现有操作系统的实际工作方式是不可能的,因为大多数操作系
统的源代码都是严格保密的。除了一些研究用的及为操作系统教学而设计的系统外。尽管
研究和教学目的都很好,但是这类系统很少能够通过对正式操作系统的小部分实现来体现
操作系统的实际功能。对于操作系统的一些特殊问题,这种折衷系统所能够表现的就更是
少得可怜了。
在以实际使用为目标的操作系统中,让任何人都可以自由获取系统源代码,无论目的是要
了解、学习还是改进,这样的现实系统并不多。本书的主题就是这些少数操作系统中的一
个:Linux。
Linux的工作方式类似于Uinx,它是免费的,源代码也是开放的,符合标准规范的32位(
在64位CPU上是64位)操作系统。Linux拥有现代操作系统的所具有的内容,例如:
* 真正的抢先式多任务处理,支持多用户。
* 内存保护。
* 虚拟内存。
* 支持对称多处理机SMP(symmetric multiprocessing),即多个CPU机器以及通常的单
CPU(UP)机器。
* 符合POSIX标准。
* 联网。
* 图形用户接口和桌面环境(实际上桌面环境并不只一个)。
* 速度和稳定性。
严格说来,Linux并不是一个完整的操作系统。当我们在安装通常所说的Linux时,我们实
际安装的是很多工具的集合。这些工具协同工作以组成一个功能强大的实用系统。Linux
本身只是这个操作系统的内核,是操作系统的心脏、灵魂、指挥中心(整个系统应该称为
GNU/Linux,其原因在本章的后续内容中将会给以介绍)。内核以独占的方式执行最底层
任务,保证系统正常运行—协调多个并发进程,管理进程使用的内存,使它们相互之间不
产生冲突,满足进程访问磁盘的请求等等。
在本书中,我们给大家揭示的就是Linux是如何完成这一具有挑战性的工作的。
1.1 Linux和Unix的简明历史
为了让大家对本书所讨论的内容有更清楚的了解,让我们先来简要回顾一下Linux的历史
。由于Linux是在Unix的基础上发展而来的,我们的话题就从Unix开始。
Unix是由AT&T贝尔实验室的Ken Thompson和Dennis Ritchie于1969年在一台已经废弃了的
PDP-7上开发的;它最初是一个用汇编语言写成的单用户操作系统。不久,Thompson和
Ritchie成功地说服管理部门为他们购买更新的机器,以便该开发小组可以实现一个文本
处理系统,Unix就在PDP-11上用C语言重新编写(发明C语言的部分目的就在于此)。它果
真变成了一个文本处理系统—不久之后。只不过问题是他们先实现了一个操作系统而已…

最终,他们实现了该文本处理工具,而且Unix(以及Unix上运行的工具)也在AT&T得到广
泛应用。在1973年,Thompson和Ritchie在一个操作系统会议上就这个系统发表了一篇论
文,该论文引起了学术界对Unix系统的极大兴趣。
由于1956年反托拉斯法案的限制,AT&T不能涉足计算机业务,但允许它象征性地收取费用
发售该系统。就这样,Unix被广泛发布,首先是学术科研用户,后来又扩展到政府和商业
用户。
伯克利加州大学是学术用户中的一个。在这里,Unix得到了计算机系统研究小组(CSRG)
的广泛应用。并且在这里所进行的修改引发了Unix的一大系列,这就是广为人知的伯克利
软件开发(BSD)Unix。除了AT&T所提供的Unix系列之外,BSD是最有影响力的Unix系列。
BSD在Unix中增加了很多显著特性,例如TCP/IP网络,更好的用户文件系统(UFS),工作
控制,并且改进了AT&T的内存管理代码。
多年以来,BSD版本的Unix一直在学术环境中占据主导地位,但最终发展成为System V版
本的AT&T的Unix则成为商业领域的领头羊。从某种程度上来说,这是有社会原因的:学校
倾向于使用非正式但通常更好用的BSD风格的Unix,而商业界则倾向于从AT&T获取Unix。

在用户需求和用户编程改进特性的促进下,BSD风格的Unix一般要比AT&T的Unix更具有创
新性,而且改进也更为迅速。但是,在AT&T发布最后一个正式版本System V Release 4(
SVR4)时,System V Unix已经吸收了BSD的大多数重要的优点,并且还增加了一些自己的
优势。这部分由于从1984年开始,AT&T逐渐可以将Unix商业化,而伯克利Unix的开发工作
在1993年BSD4.4版本完成以后就逐渐收缩,以至终止了。然而,BSD的进一步改进由外界
开发者延续下来,到今天还在继续进行。正在进行的Unix系列开发中至少有四个独立的版
本是直接起源于BSD4.4,这还不包括几个厂商的Unix版本,例如惠普的HP-UX,都是部分
地或者全部基于BSD而发展起来的。
实际上Unix的变种并不止BSD和System V。由于Unix主要使用C语言来编写,这就使得它移
植到新的机器上相对比较容易,它的简单性也使其重新设计与开发相对比较容易。Unix的
这些特点大受商业界硬件供应商的欢迎,比如Sun、SGI、HP、IBM、DEC、Amdahl等等;
IBM还不止一次对Unix进行了再开发。厂商们设计开发出新的硬件,并简单地将Unix移植
到新的硬件上,这样新的硬件一经发布便具备一定的功能。经过一段时间之后,这些厂商
都拥有了自己的专有Unix版本。而且为了占有市场,这些版本故意以不同的侧重点发布出
来,以更好地占有用户。
版本混乱的状态促进了标准化工作的进行。其中最主要的就是POSIX系列标准,它定义了
一套标准的操作系统接口和工具。从理论上说,POSIX标准代码很容易移植到任何遵守
POSIX标准的操作系统中,而且严格的POSIX测试已经把这种理论上的可移植性转化为现实
。直到今天,几乎所有的正式操作系统都以支持POSIX标准为目标。
现在让我们回顾一下,在1984年,杰出的电脑黑客Richard Stallman独立开发出一个类
Unix的操作系统,该操作系统具有完全的内核、开发工具和终端用户应用程序。在GNU(
“GNU�s Not Unix”首字母的缩写)计划的配合下,Stallman开发这个产品有自己的技术
理想:他想开发出一个质量高而且自由的操作系统。Stallman使用了“自由”(free)这
个词,不仅意味着用户可以免费获取软件;而且更重要的是,它将意味着某种程度的“解
放”:用户可以自由使用、拷贝、查询、重用、修改甚至是分发这份软件,完全没有软件
使用协议的限制。这也正是Stallman创建自由软件基金会(FSF)资助GNU软件开发的本意
(FSF也在资助其他科研方面的开发工作)。
15年来,GNU工程已经吸收、产生了大量的程序,这不仅包括Emacs、gcc(GNU的C编译器
)、bash(shell命令),还有大部分Linux用户所熟知的许多应用程序。现在正在进行开
发的项目是GNU Hurd内核,这是GNU操作系统的最后一个主要部件(实际上Hurd内核早已
能够使用了,不过当前的版本号为0.3的系统在什么时候能够完成,还是未知数)。
尽管Linux大受欢迎,但是Hurd内核还在继续开发。原因有几个方面,其一是Hurd的体系
结构十分清晰地体现了Stallman关于操作系统工作方式的思想,例如,在运行期间,任何
用户都可以部分地改变或替换Hurd(这种替换不是对每个用户都是可见的,而是只对申请
修改的用户可见,而且还必须符合安全规范)。另一个原因是据介绍Hurd对于多处理器的
支持比Linux本身的内核要好。还有一个简单的原因是兴趣的驱动,因为程序员们希望能
够自由地进行自己所喜欢的工作。只要有人希望为Hurd工作,Hurd的开发就不会停止。如
果他们能够如愿以偿,Hurd有朝一日将成为Linux的强劲对手。不过在今天,Linux还是自
由内核王国里无可争议的统治者。
在GNU发展的中期,也就是1991年,一个名叫Linus Torvalds的芬兰大学生想要了解Intel
的新CPU—80386。他认为比较好的学习方法是自己编写一个操作系统的内核。出于这种目
的,加上他对当时Unix变种版本对于80386类机器的脆弱支持十分不满,他决定要开发出
一个全功能的、支持POSIX标准的、类Unix的操作系统内核,该系统吸收了BSD和System V
的优点,同时摒弃了它们的缺点。Linus(虽然我知道我应该称他为Torvalds,但是所有
人都称他为Linus)独立把这个内核开发到0.02版,这个版本已经可以运行gcc、bash和很
少的一些应用程序。这些就是他开始的全部工作了。后来,他又开始在因特网上寻求广泛
的帮助。
不到三年,Linus的Unix—Linux,已经升级到1.0版本。它的源代码量也呈指数形式增长
,实现了基本的TCP/IP功能(网络部分的代码后来重写过,而且还可能会再次重写)。此
时Linux就已经拥有大约10万用户了。
现在的Linux内核由150多万行代码组成,Linux也已经拥有了大约1000万用户(由于Linux
可以自由获取和拷贝,获取具体的统计数字是不可能的)。Linux内核GNU/Linux附同GNU
工具已经占据了Unix 50%的市场。一些公司正在把内核和一些应用程序同安装软件打包在
一起,生产出Linux的发行版本,这些公司包括Red Hat和Caldera 公司。现在的
GNU/Linux已经备受瞩目,得到了诸如Sun、IBM、SGI等公司的广泛支持。SGI最近决定在
其基于Intel的Merced的系列机器上不再搭载自己的Unix变种版本IRIX,而是直接采用
GNU/Linux;Linux甚至被指定为Amiga将要发布的新操作系统的基础。
1.2 GNU通用公共许可证
这样一个如此流行的操作系统当然值得我们学习。按照通用公共许可证(GPL,General
Public License)的规定,Linux的源代码可以自由获取,这满足了我们学习该系统的强烈
愿望。GPL这份非同寻常的软件许可证,充分体现了上面提到的Stallman的思想:只要用
户所做的修改是同等自由的,用户可以自由地使用、拷贝、查询、重用、修改甚至重新发
布这个软件。通过这种方式,GPL保证了Linux(以及同一许可证保证下的大量其他软件)
不仅现在自由可用,而且以后经过任何修改之后都仍然可以自由使用。
请注意这里的自由并不是说没有人靠这个软件盈利,有一些日益兴起的公司,比如发行最
流行的Linux发行版本的Red Hat就是一个例子(Red Hat自从上市以来,市值已经突破数
十亿美元,每年盈利数十万美元,而且这些数字还在不断增长)。但是任何人都不能限制
其他用户涉足本软件领域,而且所做的修改不能减少其自由程度。
本书的附录B中收录了GNU通用公共许可证协议的全文。
1.3 Linux开发过程
如上所述,由于Linux是一个自由软件,它可以免费获取以供学习研究。Linux之所以值得
学习研究,是因为它是相当优秀的操作系统。如果Linux操作系统相当糟糕,那它就根本
不值得我们使用,也就没有必要去研究相关的书籍。Linux是一个十分优秀的操作系统还
在于几个相互关联的原因。
原因之一在于它是基于天才的思想开发而成的。在学生时代就开始推动整个系统开发的
Linus Torvalds是一个天才,他的才能不仅展现在编程能力方面,而且组织技巧也相当杰
出。Linux的内核是由世界上一些最优秀的程序员开发并不断完善的,他们通过Internet
相互协作,开发理想的操作系统;他们享受着工作中的乐趣,而且也获得了充分的自豪感

Linux优秀的另外一个原因在于它是基于一组优秀的概念。Unix是一个简单却非常优秀的
模型。在Linux创建之前,Unix已经有20年的发展历史。Linux从Unix的各个流派中不断吸
取成功经验,模仿Unix的优点,抛弃Unix的缺点。这样做的结果是Linux 成为了Unix系列
中的佼佼者:高速、健壮、完整,而且抛弃了历史包袱。
然而,Linux最强大的生命力还在于其公开的开发过程。每个人都可以自由获取内核源程
序,每个人都可以对源程序加以修改,而后他人也可以自由获取你修改后的源程序。如果
你发现了缺陷,你可以对它进行修正,而不用去乞求不知名的公司来为你修正。如果你有
什么最优化或者新特点的创意,你也可以直接在系统中增加功能,而不用向操作系统供应
商解释你的想法,指望他们将来会增加相应的功能。当发现一个安全漏洞后,你可以通过
编程来弥补这个漏洞,而不用关闭系统直到你的供应商为你提供修补程序。由于你拥有直
接访问源代码的能力,你也可以直接阅读代码来寻找缺陷,或是效率不高的代码,或是安
全漏洞,以防患于未然。
除非你是一个程序员,否则这一点听起来仿佛没有多少吸引力。实际上,即使你不是程序
员,这种开发模型也将使你受 匪浅,这主要体现在以下两个方面:
* 可以间接受益于世界各地成千上万的程序员随时进行的改进工作。
* 如果你需要对系统进行修改,你可以雇用程序员为你完成工作。这部分人将根据你的需
求定义单独为你服务。可以设想,这在源程序不公开的操作系统中将是什么样子。
Linux这种独特的自由流畅的开发模型已被命名为bazaar(集市模型),它是相对于
cathedral(教堂)模型而言的。在cathedral模型中,源程序代码被锁定在一个保密的小
范围内。只有开发者(很多情况下是市场)认为能够发行一个新版本,这个新版本才会被
推向市场。这些术语在Eric S. Raymond的《教堂与集市》(The Cathedral and the
Bazaar)一文中有所介绍,大家可以在http://www.tuxedo.org/~esr/writings/找到这篇
文章。bazaar开发模型通过重视实验,征集并充分利用早期的反馈,对巨大数量的脑力资
源进行平衡配置,可以开发出更优秀的软件。(顺便说一下,虽然Linux是最为明显的使
用bazaar开发模型的例子,但是它却远不是第一个使用这个模型的系统。)
为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。一个树是稳定树
(stable tree),另一个树是非稳定树(unstable tree)或者开发树(development
tree)。一些新特性、实验性改进等都将首先在开发树中进行。如果在开发树中所做的改
进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。
按照Linus的观点,一旦开发树经过了足够的发展,开发树就会成为新的稳定树,如此周
而复始的进行下去。
源程序版本号的形式为x.y.z。对于稳定树来说,y是偶数;对于开发树来说,y比相应的
稳定树大一(因此,是奇数)。截至到本书截稿时,最新的稳定内核版本号是2.2.10,最
新的开发内核的版本号是2.3.12。对2.3树的缺陷修正会回溯影响(back-propagated)
2.2树,而当2.3树足够成熟的时候会发展成为2.4.0。(顺便说一下,这种开发会比常规
惯例要快,因为每一版本所包含的改变比以前更少了,内核开发人员只需花很短的时间就
能够完成一个实验开发周期。)
http://www.kernel.org及其镜像站点提供了最新的可供下载的内核版本,而且同时包括
稳定和开发版本。如果你愿意的话,不需要很长时间,这些站点所提供的最新版本中就可
能包含了你的一部分源程序代码。 

你可能感兴趣的:(linux,操作系统,源代码,虚拟内存,都)