资 源 简 介
毛德操/胡希明老师的大作,对Linux2.4内核做了深入简出的介绍。在文字中插入了很多内核代码片段以增进了解,是学习Linux系统内核原理的经典书籍。该PDF包含了上下两册的全部内容,高清带书签,是目前阅读感受最棒的版本。别一方面,源代码的阅读和理解也是必要的。在某种意义上,源代码本身既是最准确的说明书也是最权威的教科书,因为由它所构成的系统切切实实在运行。我们自已就有过这样的经历:学了一些原理和抽象的流程就自以为懂了,可是拿源代码一看却怎么也对不上号。于是下决心钻进去,花了九牛二虎之力才搞懂。内核源代码还为计算机行业的工作人员树立了一个参照物。我们在工作中常常看到,人们包括我们自已在碰到问题时往往会先想一想:这在以前是里面是怎样实现的?或者在环境中能否实现?再査看一下有关的源代码,便有了主张。有时甚至就在源代码中找几个文件加以裁剪、修改,问题很快就解决了(但须遵守中的有关规定)。诚然,内核源代码的阅读和理解是个艰苦的过程,最好能有些指导,有些帮助,而这正是我们写作本书的目的。希望读者在每读完一章后能做两个小结。一个是关于数据结构组成和数据结构之间联系的小结另一个是关于执行过程以及函数调用关系的小结。读者为了完成这两个小结,可能不得不回过头去再读一遍甚至几遍前面的内容。从内容的选定和编排的角度来说,最理想的当然是严格遵循“先说明后引用”的原则,像平面几何那样建立起一个演绎体系。可是,对于一个实际的系统,特别是对于它的源代码,这种完仝线性的叙述和认识过程是不现实的。实际的认识过程是螺旋式的,这也决定了常常需要反复读几遍才能理解。所以,对于一个操作系统的源代码,读到后面再返回前面,再读到后面又返回前面,这几乎是必然的过程。真有决心深入了解内核的读者应该有这个思想准备。我们相信,读者在读完全书以后,如果闭目细想,一定会有一种在一个新到的城市中由向导陪同走街串巷,到过了大量的重要景点,最后到了某个高楼之顶的旋转餐厅鸟瞰整个城市是时常会有的那种心情由于篇幅的原因,全书分上下两册。上册包括预备知识、存储管理、中断和系统调用、进程和进程调度、文件系统以及传统的进程间通讯,共六章。下册则分基于的进程间通讯、设备驱动、多处理器系统结构以及系统引导和初始代,共四章。上下两册不可分割,是一个有机的整体本书的题材闷决定了读者主要是中、高级的计算机专业人员,以及大学有关专业的高年级学生和研究生。但是,我们在写作中也尽量照顾到了非计算机专业的学生和初学者(因此程序高的读者有时候也许会觉得书中有些讲解的过于啰嗦)。一般而言,读者只要有一些操作系统和计算杋系统结构方面的基础知识,并粗通语言,就可以阅读本书。就像软件免不了有错一样,对软件的理解和诠释也一定会有错误,我们能做的只是尽量减少错误。我们可以负责地说,本书付印前在文字中已经没有我们知道而没有改正的错误,更没有故意误导读者的内容。但是,我们深知错误一定是有的,我们欢迎讨论,欢迎批评。年前,本书的两位作者从不同单位调入浙江大学计算机系,共事期间曾共同承担过若干计算机应用项目的开发、研究。后来第一作者去了美国,目前在美定居,继续从事计算机专业的工作;第二作者已从学校退休,目前受聘在杭州恒生电子股份有限公司任职。出于难忘的友情和其他一些难以割舍的情结(包括对和的共同爱好),两年前通过越洋电话商定要合作写几本有关的书,此刻在读者手上的就是其中的第一本,其余的就要看条件是否允许了从成书到出版,曾得到了陈大中、曾抗生、金通洸、俞瑞钊几位教授和其他许多国内朋友的鼓励和支持,作者感谢他们。特别要提到的是,恩师何志钓教授在过去和现在都给了作者许多的关心和帮助,令作者终生难忘,本书的出版在某种意义上也是对恩师的一次汇报,同时表示由衷的感谢。作者还要感谢恒生电子股份有限公司黄大成总裁、彭政纲董事长以及其他领导人对作者,特别是第二作者开展研究的支持。他们为本书第二作者提供了很好的工作条件,使其在工作之余继之后还能再从事技术的研究。作为全国著名软件企业的决策者,他们对软件核心技术的敏锐眼光以及采用最新技术为我国金融证卷行业开发全新的大型应用软件的战略决策,令人软佩。感谢他们,祝愿他们取得更大的成功。最后,还要感谢谢敏、王红女、章西、李清瑜几位小姐,她们在承担公司繁重工作的同时利用业余时间为本书文稿的录入和整理付出了大量的辛勤劳动。本书的出版,像任何其他技术专著一样,除了错误之外总还会有许多不尽人意的地方,欢迎国内外的专家和木书读者给我们指出,以便改进毛德操、胡希明年月日目录第章预备知识内核简介系列的寻址方式的页式内存管理机制内核源代码中的语言代码内核源代码中的汇编语言代码第章存储管理内存管理的基本框架地址映射的全过程几个重要的数据结构和函数越界访问用户堆栈的扩展物理页面的使用和周转物理页面的分配页面的定期换出页面的换入内核缓冲区的管理外部设备存储空间的地址映射系统调用系统调用第章中断、异常和系统调用对中断的硬件支持中断向量表的初始化中断请求队列的初始化中断的响应和服务软中断与页面异常的进入和返回时钟中断系统调用系统调用号与跳转表第章进程与进程调度进程四要素进程三部曲:创建、执行和消系统调用系统调用系统调用与进程的调度与切换强制性调度系统调用和内核中的互斥操作第章文件系统概述从路径名到目标节点访问权限与文件安全性文件系统的安装的拆卸文件的打开与关闭文件的写与读其他文件操作特殊文件系统第章传统的进程间通信概述管道和系统调用命名管道系统调用和进程跟踪报文传递共享内存信号量第章基于的进程间通信系统调用函数创建插口函数指定插口地址函数设定插口函数接受连接请求函数请求连接报文的接收与发送插口的关闭其它第章设备驱动概述系统调用可安装模块总线块设备的驱动字符设备驱动概述终端设备与汉字信息处理控制台的驱动通用串行外部总线系统调用以及异步输入输出设备文件系统第章多处理器系统结构概述结构中的互斥问题高速缓存与内存的一致性结构中的中断机制结构中的进程调度系统的引导第章系统引导和初始化系统引导过程概述系统初始代(第一阶段)系统初始化(第二阶段)系统初始化(第三阶段)系统的关闭和重引导第章预备知识内核简介在计算杋技术的发展史上,操作系统的出现是一个重要的里程碑。早期的曾免费供美国及一些西方国家的大学和科研机构使用,并且提供源代码,这一方面为髙校和科硏机构普及使用计算机提供了条件;另一方面,也是更重要的,为计算机软件的核心技术“操作系统”的教学和实验提供了条件。特别是内核第版的源代码,在相当长的一段时期内是大学计算机系高年级学生和研究生使用的教材,甚至可以说,美国当时整整一代的计算机专业人员都是读着的源代码成长的。反过来,这也促进了的普及和发展,并且在当时形成了一个产业。事实上,回顾硅谷的形成和发展,也可以看到起着重要的作用。两大主流之一的就是在加州大学伯克利分校开发的。后来成了商品,其源代码也受到了版权的保护,再说也日益复杂和庞大了,而第版则又慢慢显得陈旧了,便逐渐不再用内核的源代码作为教材了(但是直到现在还有在用的)在这种情况下,出于教学的需要,荷兰的著名教授编写了一个小型的“类”操作系统,在机上运行,其源代码在世纪年代后期和年代前期曾被广泛采用。但是,虽说是“类”,其实离相当远。首先,是个所谓“微内核”,与内核属于不同的设计,功能上更是不可同日而语。再说也不仅仅是内核,还包括了其“外壳和许多工具性的“实用程序”。如果内核提供的支持不完整,就不能与这些成分结合起来形成环境。这样,虽然不失为一个不错的教学工具,却缺乏实用价值。看到的这个缺点,当时的个芬兰学生就萌生了一个念头,即组织一些人,以为起点,基本上按照的设计,并且博采各种版本之长,在机上实现,开发出一个真正可以实用的内核。这样,公众就既有免费的(现代)系统,又有系统的源代码,且不存在版权问题。可是教授的目光却完全盯在教学上,因此并不认为这是一个好主意,没有采纳这个建议毕竟是“初生牛犊不怕虎”,加上自身的天赋和勤奋,还有公益心,就自己动手干了起来。由于所实现的基本上是就把它称为。那时候互联网虽然还不像现在这么普及,但是在大学和公司中已经用得很多了在基本完成了内核的第一个版本以后就把它放在了互联网上,一来是把自己写的代码公诸于众,二来是邀请有兴趣的人也来参与。他的这种做法很快便引起了热烈的反应,并且与美国“自由软件基金会的主张正好不谋而合当时已经有计划要开发一个类(但又不是,所以称为,这是缩写)的操作系统和应用环境,而的出现正是适得其时,适得其所。于是,由的主持的内核的开发、改进与维护,就成了的主要项目之一。同时,的其它项目,如的编译、程序调试工具,还有各种和实用程序,乃至服务器浏览器(实际上就是)等等,则正好与之配套成龙。人们普遍认为自由软件的开发是软件领域中的个奇迹。这么多志愿者参与,只是通过互联网维持松散的组织,居然能有条不紊地互相配合,开发出高质量的而且又是难度较大的系统软件,实在令人赞叹。那么,与它的前身的区别何在呢?简单地说,是个“微内核”,而是个“宏内核”;是个类的教学用模型,而甚本上就是,而且是的延续和发展,甚至是各种版本与变种的集大成者。大家知道,传统意义下的操作系统,其内核应具备多个方面的功能或成分,既包含用于管理属于应用层的“进程”的成分,如进程管理,也包含为这些进程提供各种服务的成分,如进程间通信、设备驱动和文件系统等等。内核中提供各种服务的成分与使用这些服务的进程之间实际上就形成一种典型的”的关系。其实,这些服务提供者并不一定非得都留在内核中不可,他们本身也可以被设计并实现某些“服务进程”,其中必须要留在内核中的成分其实只有进程间通信。如果把这些服务提供者从内核转移到进程的层次上,那么内核本身的结构就可以大大减小和简化。而各个服务进程既然已从内核中游离出来,便可以单独地设计,实现以及调试,更重要的是可以按实际的需要来配置和启动。基于这样的想法,各种“微内核”()便应运而生。特别是对于一些专用的系统主要是实时系统和“嵌入式”系统(),微内核的思想就很有吸引力。究其原因,主要是因为通常这些系统都不带磁盘,整个系统都必须放在中,常常受到存储空间的限制,而所需要的服务又比较单一和简单。所以,几乎所有的嵌入式系统和实时系统都采用微内核,如等。当然,微内核也有缺点,将这些服务的提供都放在进程层次上,再通过进程间通信(通常是报文传递)提供服务,势必增加系统的运行开销,降低了效率与微内核相对应,传统的内核结构就称为“宏内核”(),或称为“一体化内核)。通用式的系统由于所需的服务面广而量大,一体化内核就更为合适,作为一种通用式系统采用一体化内核是很自然的事。传统的内核是“全封闭”的。如果要往内核中加一个设备(增加一种服务),早期一般的做法是编写这个设备的驱动程序,并变动内核源程序中的某些数据结构(设备表),再重新编译整个内核,并重新引导整个系统。这样做当然也有好处,如系统的安全性更能得到保证,但其缺点也是很明显的,那就是太僵化了。在这样的情况下,当某一个公司开发出一种新的外部设备时(比方说,一台彩色扫描仪),它就不可能随同这新的设备提供一片软盘或光盘给用户,使得用户只要运行一下就可以把这设备安装上了(像对那样),有能力修改内核的设备表,并重新编译内核的用户毕竞不多在里,这个问题就解决得比较好。既允许把设备驱动程序在编译时静态地连接在内核中,一如传统的驱动程序那样;也允许动态地在运行时安装,称为“模块”;还允许在运行状态下当需要用到某一模块时由系统自动安装。这样的模块仍然在内核中运行,而不是像在微内核中那样作为单独的进程运行,所以其运行效率还是得到保证。模块,也就是动态安装的设备驱动程序的实现(详见设备驱动程序一章),是很大的改进。它使设备驱动程序的设计、实现、调试以及发布都大大地简化,甚至可以说是发生了根本性地变化。最初是在“平台”上实现的,但是已经被移植到各种主要的系列上,包括等等(等等均属于系列)。可以说内核是现今覆盖面最广的一体化内核。同时,在同一个系列的上内核还支持不同的系统结构,它既支持常规的单结构,也支持多结构。不过,本书将专注于,并且以单结构为主,但是最后有一章专门讨论多结构