资料下载网
首页 计算机 考试教辅
Linux内核注释 pdf电子书免费下载,百度云
首页 > 计算机 > 计算机网络/服务器 > Linux内核注释 pdf电子书免费下载,百度云

《Linux内核注释》pdf电子书免费下载


下载方式一:

百度网盘下载地址:https://pan.baidu.com/s/1dWr5su0uOF7Xqu-LsmZOOg
百度网盘密码:1111

下载方式二:

http://ziliaoshare.cn/Download/ad_123583_pd_LinuxNHZS.zip

 


Linux内核注释

作者:empty

页数:210

出版社:empty

《Linux内核注释》介绍

《Linux内核注释》旨在给程序员和学生提供比以前更详细和更易理解的Linux内核代码注对《注释》系列从书的写作灵感都米源丁John Lions所著的大量流行的《Lions'Commentary《Liu nx内核注释》同样提供了对流行的功能强大的Liu nx操作系统的结构和函数实现的内

1.提供一个最新的和完整的服务器版本的完整源代码。(这本书分析的版本是2.2.5版,也2.提供一个对每个子系统功能的一般性概述。3.研究各个子系统主要的函数和数据结构:4.对开发者应怎样通过修改源代码来改进和扩展内核提出建议

本书的最后一项日标一定制-是你学习内核代码的最有说服力的原因,通过理解内核是怎开放源代码是指让开发者研究源代码井实现功能性扩展, Linux是全世界成长最快的操作系这本书集中解释了Linux内核源代码的核心中专用代码行是如何运行的, 你将学习到内核最本书的第一部分以易于阅读和交叉引用的格式复制了一个经过筛选的linux内核源代码的源代码后是这本书的第二部分,即注释部分,注释部分对源代码进行了讨论。注释部分的在本书正文后的附录部分,简洁地覆盖了自本书主要部分完成以后内核的变化,在附录中还本书假设你能阅读C语言的代码,不怕偶尔读一些汇编语言代码,并且你想知道一个快速用最适合你自己的方法放松地去看这本《linux内核注释》。因为写这本书的目的是为提供欢迎你对我的第一本书提出意见。你可以通过e-mai和我联系。地址是:释。作者分析了核心代码,井对重要的函数、系统调用和数据结构提供了大量的注释。on Unix》一书。无数的计算机专业的学生在复制和使用这本书。这本书对AT&T的Unix操作系统的早期版本的内幕进行了深刻的剖析。幕介绍。本书的主要日标是;是写这本书时发布的最新版本。

样工作的,你能够编写自己的代码用以在你的操作系统中实现所需要的功能。如果允许其他人共享你的改进,你的代码甚至会在官方发行的内核代码中山现,被全世界数百万计的人们所使用。统, 开放源代码是其主要的原因之一, 从玩游戏, 到网上冲浪, 到为大大小小的ISP们提供稳定的Web服务器半台以至解决最庞大的科学难题, Linux都能胜任全部工作。它之所以能如此强大是因为有像你一样的开发者在研究、学习井且扩充这个系统,

你能从本书中学到什么

内部的子系统是怎样构造和这种构造能够实现系统功能的理由。子集,在这本书稍后的注释中,无论一行代码在何处被引用,你都会在这一行前面发现一个小箭头,这个箭头指了对此行进行注释处的页号,每一章讨论了一个不同的内核子系统,或者是其它的功能性逻辑组件,例如系统调用或内存管理。注释部分大量的行号引用为你指明了所讨论代码行的确切行号。包含了被内核用做软件许可证的完整的GNU常规公众许可证。最后, 本书为你提供了一个索引,通过该索引你可以查询术语或主题。这将让你更快更有效的使用这本参考工具书。本书的使用对象的、坚周的、可靠的、健壮的、现代的、实用的操作系统是如何工作的。一些读者也许是这样的程序员, 他们想为前进中的Linux内核发展工作提供他们自己的改进和添加内容。如何使用本书

第1章Linux简介

让用户很详细地了解现有操作系统的实际工作方式是不可能的,因为大多数操作系统的源代码都是严格保密的.其例外是些研究用的系统,另外些是明确为操作系统教学面设计的系统。(还有一些系统则是同时出于这两种目的。)尽管研究和教学这两个目的都很好,但是这类系统很少能够通过对正式操作系统的小部分实现来体现操作系统的实际功能,对于操作系统的一些特殊问题,这种折衷系统所能够表现的就更是少得可怜了。在以实际使用为目标的操作系统中,让任何人都可以自巾获取系统源代码,无论目的是要了解、学习还是改进,这样的现实系统并不多。本书的主题就是这些少数操作系统中的个:Linux。

Linux的工作方式类似于U in x, 是免费的, 源代码也是开放的, 符合标准规范的32位(在64位CPU上是64位) 操作系统。Linux拥有现代操作系统的所具有的内容, 例如:们实际安装的是很多工具的集合, 这些工具协同工作以组成一个功能强大的实用系统。Linux本身只是这个操作系统的内核,是操作系统的心脏、灵魂、指挥中心.(整个系统应该称为GNU/Linux, 其原因在木章的后续内容中将会给以介绍。) 内核以独占的方式执行最底层任务,保证系统正常运行——协调多个并发进程,管理进程使用的内存,使它们相互之间不产生冲突,满足进程访问磁盘的请求等等。

严格说来.Linux并不是一个完整的操作系统。当我们在安装通常所说的Linux时, 我在本书中, 我们给大家揭示的就是Linux是如何完成这一具有挑战性的工作的。Linux(和Unix) 的简明历史最终, 他们实现了该文本处理工具, 而且Unix(以及Unix上运行的工具) 也在AT&T由于1956年反托拉斯法案的限制,AT&T不能莎足计算机业务,但允许它可以以象征伯克利(Berkeley) 的加州大学是学术用户中的一个.在这里Unix得到了计算机系统尽管Linux大受欢迎, 但是Hurd内核还在继续开发.这种情况的原因有几个方面, 其为了让大家对本书所讨论的内容有更清楚的了解, 让我们先来简要回顾一下Linux的历史。由于Linux是在Unix的基础上发展而来的, 我们的话题就从Unix开始。Unix是由AT&T贝尔实验室的Ken Thompson和Dennis Ritchie于1969年在一台已经废弁了的PDP-7上开发的:它最初是一个用汇编语言写成的单用户操作系统, 不久, Thompson和Ritchie成功说服管理部门为他们购买更新的机器, 以便该开发小组可以实现一个文木处理系统, Unix就在PDP-11上用C语言重新编写(发明C语言的部分的就在于此) , 它果真变成了一个文本处理系统——不久之后。只不过问题是他们先实现了一个操作系统而己…得到广泛应用。在1973年, Thompson和Ritchie在一个操作系统会议上就这个系统发表了一篇论文, 该论文引起了学术界对Unix系统的极大兴趣。性的费用发售该系统。就这样, Unix被广泛发布, 首先是学术科研用户, 后来又扩展到政府和商业用户,研究小组(CSR G) 的广泛应用, 并且在这里所进行的修改引发了Unix的一大系列, 这就是广为人知的伯克利软件开发(BSD) Unix.除了AT&T所提供的U In ix系列之外, BSD是最有影响力的Unix系列。BSD在Unix中增加了很多显著特性, 例如TCP/IP网络, 更好的用户文件系统(UFS) , 工作控制, 井且改进了AT&T的内存管理代码,V版木的AT&T的Unix则成为商业领域的主宰。从某种程度上来说, 这是有社会原因的:学校倾向于使用非正式但通常更好用的BSD风格的Unix, 而商业界则倾向于从AT&T取Unix。

第1章Linux简介

多年以来, BSD版本的Unix真在学术环境中占据上导地位, 但最终发展成为System在用户需求驱动和用户编程改进特性的促进下, BSD风格的Unix一般要比AT&T的业化, 而伯克利Unix的开发工作在1993年BSD 4.4版本完成以后就逐渐收缩以至终止了。然而, BSD的进一步改进巾外界开发者延续下来, 到今天还在继续进行。正在进行的Unix系列开发中至少有四个独立的版本是直接起源于BSD 4.4, 这还不包括几个厂商的Unix版本, 例如惠普的HP-UX, 都是部分地或者全部地基于BSD而发展起来的。实际上Unix的变种并不止BSD和System V, 由于Unix主要使用C语言米编写, 这就使得它相对比较容易地移植到新的机器上,它的简单性也使其相对比较容易重新设计与开发。Unix的这些特点大受商业界硬件供应商的欢迎, 比如Sun、SGI、惠普、IBM、DEC(数字设备公司) 、Amdahl等等:IBM还不止次对Unix进行了再开发.厂商们设计开发出新的硬件并简单地将Unix移植到新的硬件上, 这样新的硬件一经发布便具备一定的功能。经过一段时间之后, 这些厂商都拥有了自己的专有Unix版本。而且为了占有市场, 这些版本故意以不同的侧重点发布出来以更好的占有用户。

版本混乱的状态促进了标准化工作的进行。其中最主要的就是POSIX系列标准, 它定义了套标准的操作系统接口和工具, 从理论上说, POSIX标准代码很容易移植到任何遵守POSIX标准的操作系统中, 而且严格的POSIX测试已经把这种理论上的可移植性转化为现实, 直到今天, 几乎所有的正式操作系统都以支持POSIX标准为门标现在让我们回顾一下, 在1984年, 杰出的电脑黑客Richard Stallman独立开发出一个类Unix的操作系统, 该操作系统具有完全的内核、开发工具和终端用户应用程序。在GNU(“GNU's Not Unix”首字母的缩写) 计划的配合下, Stallman开发这个产品有自己的技术理想:他想开发出一个质量高面且自由的操作系统。Stallman使用了“自由”(free) 这个词,不仅意味着用户可以免费的获取软件:而且更重要的是,它将意味着某种程度的“解放”:用户可以白由使用、拷贝、查询、重用、修改甚至是分发这份软件,完全没有软件使用协议的限制。这也正是Sta lIman创建自巾软件基金会(FSF) 资助GNU软件开发的本意(FSF也在资助其它科研方面的开发工作).

15年以来, GNU工程已经吸收、产生了大量的程序, 这不仅包括Emacs i gee(GNU的C编译器) , bash(shell命令) , 还有大部分Linux用户所熟知的许多应用程序.现在正在进行开发的项目是GNU Hurd内核, 这是GNU操作系统的最后一个主要部件(实际上Hurd内核早己能够使用了,不过当前的版本号为0.3的系统在什么时候能够完成,还是未知数)。一是Hurd的体系结构十分清晰的体现了Stallman关于操作系统工作方式的思想, 例如, 在运行期间, 任何用户都可以部分的改变或替换Hurd(这种替换不是对每个用户都是可见的,而是只对申请修改的用户可见, 而且还必须符合安全规范) , 另一个原因是据介绍Hurd对于多处理器的支持比Linux本身的内核要好.还有个简单的原因是兴趣的驱动, 因为程序员们希望能够自由地进行自己所喜欢的工作。只要有人希望为Hurd工作, Hurd的开发就不会停止。如果他们能够如愿以偿, Hurd有朝一日将成为Linux的强劲对手, 不过在今天,Linux还是白由内核王国里无可争议的主宰。Intel的新CPU——80386.他认为比较好的学习方法是自己编写一个操作系统的内核.出于这种目的, 加上他对当时Unix变种版木对于80386类机器的脆弱支持十分不满, 他决定要在GNU发展的中期, 也就是1991年, 一个名叫Linus Torvalds的芬兰大学生想要了解开发出一个全功能的、支持POSIX标准的、类Unix的操作系统内核, 该系统吸收了BSD和System V的优点, 同时摒弃了它们的缺点。Linus(虽然我知道我应该称他为Torvalds,但是所有人都称他为Linus) 独立把这个内核开发到0.02版, 这个版本已经可以运行gec,hash和很少的些应用程序.这些就是他开始的全部工作了, 后来, 他又开始在内特网络上寻求广泛的帮助,长, 实现了基本的TCP/IP功能(网络部分的代码后来重写过, 而且还可能会再次重写) 。此时Linux抗己经拥有大约10万用户了。

不到年, Linus的Unix-Linux一已经升级到1.0版本。它的源代码量也呈指数形式增现在的Linux内核由150多万行代码组成, Linux也已经拥有了大约1000万用户(由于Linux可以自由获取和拷贝, 获取具体的统计数字是不可能的) 。Linux内核GNU/Linux附同GNU工具已经占据了Unix 50%的市场.一些公司正在把内核和一些应用程序同安装软件打包在一起, 生产出Linux的distribu ion(发行版本) , 这些公司包括RedHat和Caleraprominent公司。现在的GNU/Linux已经备受注目, 得到了诸如Sun、IBM、SGI等公司的广泛支持.SGI最近决定在其基于Intel的Merced的系列机器上不再搭载白己的Unix变种版木IRIX, 而是直接采用GNU/Linux:Linux甚至被指定为Amiga将要发布的新操作系统的基础.

GNU通用公共许可证

这样一个如此流行大受欢迎的操作系统当然值得我们学习, 按照通用公共许可证(GPL,(General Public License) ) 的规定, Linux的源代码可以自由获取, 这使得我们学习该系统的强烈愿望得以实现.GPL这份非同寻常的软件许可证, 充分体现了上面提到的Stallman的思想:只要用户所做的修改是同等白出的,用户可以白出地使用,拷贝、查询、重用、修改甚至重新发布这个软件。通过这种方式, GPL保证了Linux(以及同一许可证保证下的大量其它软件)不仅现在自由可用,而且以后经过任何修改之后都仍然可以白由使用,最流行的Linux发行版本的RedHat, 就是一个例子。(RedHat自从面世以来, 市值已经突破数十亿美元,每年盈利数十万美元,而且这些数字还在不断增长)。但是任何人都不能限制其它用户涉足本软件领域,而且所作的修改不能减少其自由程度。

Linux开发过程

值得学习研究, 是因为它是相当优秀的操作系统。如果Linux操作系统相当糟糕, 那它就根本不值得被我们使用,也就没有必要去研究相关的书籍。(除非一种可能,为了追求刺激)。Linux是一款十分优秀的操作系统还在于几个相互关联的原因,如上所述, 巾于Linux是一款自巾软件, 它可以免费获取以供学习研究。Linux之所以Linux优秀的原因之一在于它是基于天才的思想开发而成的。在学生时代就开始推动整个系统开发的Linus To rv ads是一个天才, 他的才能不仅展现在编程能力方面, 而且组织技巧也相当杰出.Linux的内核是由世界上一些最优秀的程序员开发并不断完善的, 他们通过In tem net相互协作, 开发理想的操作系统:他们享受着工作中的乐趣, 而且也获得了允分的白豪感Linux优秀的另外一个原因在于它是基于一组优秀的概念.Unix是一个简单却非常优秀的模型。在Linux创建之前, Unix已经有20年的发展历史。Linux从Unix的各个流源中不断吸取成功经验, 模仿Unix的优点, 抛弃Unix的缺点.这样做的结果是Linux成为了Unix系列中的佼佼者:高速、健壮、完整,而且抛充了历史包袱。程序,每个人都可以对源程序加以修改,而后他人也可以自由获取你修改后的源程序。如果你发现了缺陷(bug) , 你可以对它进行修正, 而不用去么求不知名的公司来为你修正, 如果你有什么最优化或者新特点的创意,你也可以直接在系统中增加功能,而不用向操作系统供应商解释你的想法,指望他们将来会增加相应的功能,当发现一个安全漏洞后,你可以通过编程来弥补这个涌洞,而不用关闭系统直到你的供应商为你提供修补程序,由于你拥有直接访问源代码的能力,你也可以直接阅读代码来寻找缺陷,或是效率不高的代码,或是安全漏洞,以防患丁未然。

然而, Linux最强大的生命力还在于其公开的开发过程。每个人都可以自由获取内核源除非你是一个程序员,否则这点听起来仿佛没有多少吸引力.实际上脚使你不是程序员,这种开发模型也将使你受益匪浅,这主要体现在以下两个方面:Linux这种独特的自由流畅的开发模型已被命名为bazaar(集市模型) , 它是相对于ea the dr al(教堂) 模型而言的。在cathedral模型中, 源程序代码被锁定在一个保密的小范围内。只有开发者(很多情况下是市场)认为能够发行一个新版本,这个新版本才会被推向市场, 这些术语在EricS.Raymond的The Cathedral and the Bazaar一文中有所介绍, 大家可以在http:/www.tuxedo.org/~esr/writings/找到这篇文章.Bazaar开发模型通过重视实验,征集井充分利用早期的反馈,对巨人数量的脑力资源进行平衡配置,可以开发出更优秀的软件。(顺便说一下, 虽然Linux是最为明显的使用bazaar开发模型的例子, 但是它却远不是第一个使用这个模型的系统。)树(stable tree) , 另一个树是非稳定树(unstable tree) 或者开发树(development tree) .些新特性、实验性改进等都将首先在开发树中进行。如果在开发树中所做的改进也可以应用于稳定树, 那么在开发树中经过测试以后, 在稳定树中将进行相同的改进。按照Linus的观点,一旦开发树经过了足够的发展,开发树就会成为新的稳定树,如此周而复始的进行下去。可以问接受益于世界各地成千上万的程序员随时进行的改进工作。

如果你需要对系统进行修改,你可以雇用程序员为你完成工作。这部分人将根据你的需求定义单独为你服务,可以设想,这在源程序不公开的操作系统中它将是什么样子.为了确保这些无序的开发过程能够有序地进行, Linux采用了双树系统。一个树是稳定源程序版本号的形式为xyz.对于稳定树来说, y是偶数; 对于开发树来说, y比相应

第2章代码初识

的稳定树大一(因此,是奇数),截至到本书截稿时,最新的稳定内核版本号是2.2.10,最新的开发内核的版本号是2.3.12。对2.3树的缺陷修正会回溯影响(back-propagated) 2.2树而当23树足够成熟的时候会发展成为2.4.0.(顺便说一下,这种开发会比常规惯例要快,因为每版本所包含的改变比以前更少了.内核开发人员只需花很短的时间就能够完成个实验开发周期。)http://www.kernel.org及其镜像站点提供了最新的可供下载的内核版本,而且同时包括稳定和开发版本。如果你愿意的话,不需要很长时间,这些站点所提供的最新版本中就可能包含了你的一部分源程序代码。在过去的一段时期, Linux内核同时使用C语言和汇编语言实现的。这两种语言需要一一些gcc特有代码只是简单地使用gcc语言扩展, 例如允许在C(不只是C++) 中使用本章首先从较高层次介绍Linux内核源程序的概况, 这些都是大家关心的一些基本特点随后将简要介绍些实际代码.最后以如何编译内核来检验个人所进行的修改的讨论来作为木章的收尾。

Linux内核源程序的部分特点定的平衡:C语言编写的代码移植性较好、易于维护,而汇编语言编写的程序则速度较快.一般只有在速度是关键因素或者一些因平台相关特性而产生的特殊要求(例如直接和内存管理硬件进行通讯)时才使用汇编语言,正如同实际中所做的, 即使内核并未使用C++的对象特性, 部分内核也可以在g++CGNU的C++编译器)下进行编译,同其它面向对象的编程语言相比较,相对而言C++的开销是较低的,但是对于内核开发人员来说,这已经足够其至太多了。内核开发人员不断发展编程风格, 形成了Linux代码独有的特色。木节将讨论其中的一些问题

gcc特性的使用

Linux内核被设计为必须使用GNU的C编译器gcc来编译, 而不是任何一种C编译器都可以使用。内核代码有时要使用gcc特性, 伴随着本书的进程, 我们将陆续介绍其中的一部分,inline关键字指示内联函数。也就是说, 代码中被调用的函数在每次函数调用时都会被扩充,因而就可以节约实际函数调用的开销.比其它输入效率更高的执行代码,从理论上讲,编译器可以优化具有相同功能的两种对等的方法,并且得到和同的结果。因此,代码的编写方式是无关紧要的。但在实际上,用一些方法编写所产生的代码要比用其它方法编写所产生的代码的执行速度快得多,内核开发人员清楚如何才能产生更高效的执行代码的方法,而且这种知识也不断在他们编写的代码中反映出来。更为普遍的情况是代码的编写方式比较复杂。因为对于某些类型的输入, gec能够产生例如, 考虑内核中经常使用的goto语句——为了提高速度, 内核中经常大量使用这种一般要避免使用的语句, 在本书中所包含的不到40.000行代码中, 一共有500多条goto语句, 大约是每80行一个, 除汇编文件外, 精确的统计数宁是接近每72行一个goto语句,公平的说,这是选择偏向的结果:比例如此高的原因之一是本书中涉及的是内核源程序的核心, 在这里速度比其它因素都需要优先考虑。整个内核的比例大概是每260行一个goto语句。然而, 这仍然是我不再使用Basic进行编程以来见过的使用goto频率最高的地方,代码必需受特定编译器限制的特性不仅与普通应用程序的开发有很大不同,而且也不同于大多数内核的开发。大多数的开发人员使用C语言编写代码来保持较高的可移植性,即使在编写操作系统时也是如此。这样做的优点是显而易见的,最为重要的点是一旦出现更

第2章代码初识

好的编译器,程序员们可以随时进行更换。内核对于gce特性的完全依赖使得内核向新的编译器上的移植工作更加闲难.最近Linus在大多数情况下,这种观点是不能够被人所接受的、通常情况下,为了保证和程序语言在第3章中我们将对内核设计目标进行详细说明.内核代码中使用了些显著的习惯用语,本节将介绍常用的几个.当你通读源程序代码为了讨论这些习惯用语,我们首先需要对它们进行命名。为了使于讨论,笔者创造了这一个普通的习惯用语笔者称之为“资源获取”(resource acquisition idiom) , 在这个用语我采用“错误变量”这一用语(error variable idiom) 来辅助说明资源获取用语, 它使用这两个用语结合使用,我们就可以十分自然地得到符合模式的代码如下:

内核模块(Kernel Modules)整个内核并不需要同时装入内存,应该确认,为保证系统能够正常运行,一些特定的内自然,你也必须留意内核模块,对于指明其它内核模块在磁盘上的留位置的那些模块,内核模块还会带来因复杂度的增加所造成的开销,这是因为在系统运行的过程中移进移载其它内核模块的时候,都必须调用这个函数,就像内核处理其它工作一样,这种调用也是为当前运行的进程进行的.从进程的角度来看,这种调用的请求通常是隐含的―一正在执行进程其它请求的内核可能会发现必须调入一个模块才能够完成该请求,例如,请参看10070行,这里是一些将在第7章中讨论的代码,论到) 。这并不能只通过数的简单调用实現, 因为exec_modprobe要继续调用exe e来执行一个程序。因此, 对函数exec_modprobe的简单调用将永远不会有返回、这和使用fork以准备exec调用十分类似, 你可以认为kernel_thread对内核来说就是较低版本的fork, 虽然两者有很大不同, fork是从指定函数开始执行新的进程,而不是从调用者的当前位置开始运行.正如fork样, kernel_thread返回的值是新进程的进程号,载失败了.

(handlers) .这里最重要的部分是对flush_signal_handlers的调用(28041行) , 它使用内核默认的信号量句柄代替所有用户定义的信号量句柄。如果在此时有信号量被传送到内核,它将获得默认响应——通常是忽略信号量或杀死进程。但是不管怎样都不会引起安全风险,由于该函数从触发它的进程中分离出来(如前所述),所以不管原始进程在此处是否改变其原来分配的信号量句柄都不会产生任何影响。程中继承标准输入输出和标准错误。这很有可能会引起安全漏洞。(这可能在替代modprobe的程序中引起的问题, 但是modprobe本身实际上并不关心这个差异。)方一样, 请注意root使用用户ID号0的假定在这里已经被写入程序。用户ID号和权能系统(cap ablity system) (在接下米的几行中会用到) 将在第7章中介绍。错误代码, 这里是可能产生printk的缓冲器过载的地点之一。module_name的长度并没有明确限制,就我们对该调用的看法而言,它可能长达百万个字符。为防止printk缓冲器过载, 你必需遍历所有对于该函数的调用(实际上是对request_module的调用) 以保证每个调用者使用足够短的不会为printk造成麻烦的模块名译器却并不知道这一点, 因此此处使用了return语句以保证gce不出错,对于内核的进步讨论将超出本章的既定范围,因此在这个问题上我们到此为止.然而核必须总是驻留在内存中,例如,进程调度代码就必须常驻内存,但是内核其它部分,例如大部分的设备驱动就应该仅在内核需要的时候才装载,而在其它情况下则无需占用内存,举例米说, 只有在内核真正和CD-ROM通讯时才需要使用完成内核与CD-ROM通讯的设备驱动程序,因此内核可以被设置为在和设备通讯之前才装载相应代码。内核完成和设备的通讯之后可以将这部分代码公弃。也就是说,一旦代码不再需要,就可以从内存中移走。系统运行过程巾可以增减的这部分内核称为内核模块。内核模块的优点是可以简化内核自身的开发。假设你购买了一个新的高速CD-ROM驱动器, 但是现有的CD-ROM驱动程序井不支持该设备。你自然就希增加对这种高速模式的支持以提高系统光驱设备的性能。如果作为内核模块来编译驱动程序,你的工作将会方便得多;编译驱动程序,加载到内核,测试,卸载驱动程序,修改驱动程序,再次加载驱动程序到内核,测试,如此周而复始.如果你的驱动程序是直接编辑在内核中的,那么你就必须重新编译整个内核并且在每次修改驱动程序之后重新启动机器。这样慢得很多,一定不能从内存中卸载,否则,内核将只能通过访问磁盘来装载处理磁盘访问的内核模块,这是不可能实现的,这也是我们要选择把部分内核作为模块编译还是直接编译进内核使其常驻内存的又一个原因.你知道白己系统的设置方式,因而也就可以日己选择正确使用的方式。《如果为了确保安全,你可以简单的忽略内核模块系统的优点,而把所有的内容都编译到内核里面。)内核模块会带来一些速度上的损失, 这是因为一些必需的代码现在并不在RAM中, 必需要从感盘读入。但是整个系统的性能通常会有所提高,这主要是因为通过么弃暂时不使用的模块可以释放出额外的RAM供应用程序使用, 如果这部分内存被内核所占用, 应用程序将只能更加频繁地进行磁盘交换(swap) , 而这种磁盘交换会显著的降低应用程序的性能。《磁盘交换将在第8章中讨论。)出部分内核需要额外的代码,然而,正如你将在本节中看到的,复杂度的开销是可以管理的。通过使用外部程序来代理一些必需的工作还可以更进步降低复杂度的开销.(更为确切的说法是,这样做不是减少了复杂度的开销,而是把复杂度的开销重新分配了一下。)这是对内核模块原理的一个小小的扩展:即使是内核的支持模块对于内核来说也只是外部的,部分可用的,只有在需要的时候才被装入内存通常用于这种目的程序称为modprobe。有关的modprobe代码超出了本书的范围, 但是在Linux的每个发行版本中都有包含有它。本节的剩余部分将讨论同modprobe协同工作以载内核模块的内核代码request_module24432:作为函数说明之前的注释, request_module是一个函数。内核的其它模块在需要装24446:以内核中的一个独立进程的形式执行exec_modprobe函数(24384行, 马上就会讨24448:和fork一样, 从kernel_thread返回的负值表示内部错误,24455:正如函数巾论述的一样,大部分的信号量将因当前进程而被暂时阻塞。24462:等待exec_modprobe执行完毕, 同时指出所需要的模块是已经成功装入内存还是装24465:结束运行, 恢复信号量。如果exec_mod pro返回错误代码, 则打印错误消息。exec_modprobe24384:exec_modprobe运行为内核增加内核模块的程序。这里的模块名是一个void*的指针,24386:设置modprobe的参数列表和环境。Modprobe_path(24363行) 用来定位modprobe24400:(正如代码中描述的一样)出于安全性考虑,丢弃所有挂起的信号量和信号量句柄24405:关闭调用进程打开的所


《Linux内核注释》目录

empty

计算机


python
AI人工智能
javascript
计算机网络/服务器
数据库技术
计算机F

考试教辅


考研考博
英语四六级

沪ICP备18046276号-5
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:15618918379