linux内核源代码情景分析 完整目录,高清

所需积分/C币:50 2015-08-30 23:02:04 5.83MB PDF
46
收藏 收藏
举报

linux内核源代码情景分析 完整目录,高清
出高质量的而且又是难度较大的系统软件,实在令人赞叹。 那么, 与它的前身 的区别何在呢?简单地说, 是个“微内核”,而 是个“宏 内核”; 是个类的教学用模型,而 甚本上就是,而且是的延续和发展,甚 至是各种版本与变种的集大成者。 大家知道,传统意义下的操作系统,其内核应具备多个方面的功能或成分,既包含用于管理属于 应用层的“进程”的成分,如进程管理,也包含为这些进程提供各种服务的成分,如进程间通信、设 备驱动和文件系统等等。内核中提供各种服务的成分与使用这些服务的进程之间实际上就形成一种典 型的 ”的关系。其实,这些服务提供者并不一定非得都留在内核中不可,他们本身也可 以被设计并实现某些“服务进程”,其中必须要留在内核中的成分其实只有进程间通信。如果把这些服 务提供者从内核转移到进程的层次上,那么内核本身的结构就可以大大减小和简化。而各个服务进程 既然已从内核中游离出来,便可以单独地设计,实现以及调试,更重要的是可以按实际的需要来配置 和启动。基于这样的想法,各种“微内核”( )便应运而生。特别是对于一些专用的系统 主要是实时系统和“嵌入式”系统( ),微内核的思想就很有吸引力。究其原因,主 要是因为通常这些系统都不带磁盘,整个系统都必须放在 中,常常受到存储空间的限制,而 所需要的服务又比较单一和简单。所以,几乎所有的嵌入式系统和实时系统都采用微内核,如 等。当然,微内核也有缺点,将这些服务的提供都放在进程层次上,再通过进程间通信(通 常是报文传递)提供服务,势必增加系统的运行开销,降低了效率 与微内核相对应,传统的内核结构就称为“宏内核”( ),或称为“一体化内核 )。通用式的系统由于所需的服务面广而量大,一体化内核就更为合适,作为一种 通用式系统 采用一体化内核是很自然的事。 传统的内核是“全封闭”的。如果要往内核中加一个设备(增加一种服务),早期一般的做 法是编写这个设备的驱动程序,并变动内核源程序中的某些数据结构(设备表),再重新编译整个内核, 并重新引导整个系统。这样做当然也有好处,如系统的安全性更能得到保证,但其缺点也是很明显的, 那就是太僵化了。在这样的情况下,当某一个公司开发出一种新的外部设备时(比方说,一台彩色扫 描仪),它就不可能随同这新的设备提供一片软盘或光盘给用户,使得用户只要运行一下 就可 以把这设备安装上了(像对 那样),有能力修改 内核的设备表,并重新编译内核 的用户毕竞不多 在里,这个问题就解决得比较好。既允许把设备驱动程序在编译时静态地连接在内核 中,一如传统的驱动程序那样;也允许动态地在运行时安装,称为“模块”;还允许在运行状态下当需 要用到某一模块时由系统自动安装。这样的模块仍然在内核中运行,而不是像在微内核中那样作为单 独的进程运行,所以其运行效率还是得到保证。模块,也就是动态安装的设备驱动程序的实现(详见 设备驱动程序一章),是很大的改进。它使设备驱动程序的设计、实现、调试以及发布都大大地 简化,甚至可以说是发生了根本性地变化。 最初是在 “平台”上实现的,但是已经被移植到各种主要的系列上,包括 等等( 等等均属于系列)。可以说 内核是现今覆盖面最广的一体化内核。同时,在同一个系列的上 内核还支持不同的 系统结构,它既支持常规的单结构,也支持多结构。不过,本书将专注于 ,并且 以单结构为主,但是最后有一章专门讨论多结构 在安装好的系统中,内核的源代码位于 。如果是从 网站下载的 内核 的文件,则展开以后在一个叫的子目录中。以后本书中谈到源文件的路径时,就总是从 这个节点开始 源代码的组成,大体如下所示。 COPYING 有关FSF公共许可证制度GP!.的具体说吲 段 EADME Lin内核宾装和使用的简要说明 Makefile 重构 Linux内陵可执行代码的make文 Documentation有关Linu内校的叉档 Erc arch是 arrhileclure词的繼写,内核屮与貝体¢PU和系鼗纬相 美的代码分别放在下层的了目录中,而相关的.h文件则分别放在 inside!8m目录之 Aha-—原DEC开愛的4位CPU 包括X86泵列中自独36以后的所有3?位CPU,包括 80486, Feting, Pentium ll,等,也包括AMDK等芈 容列 mask H Motorola发的68090系列 ISC CPU芯片 作ar一—R5CCP芯片,主要用丁sun作鈷等机型中 s390一—IBM生产的一种人型计算机 1154 lni]的IA-64构64位CFU 说明:在每个CPU的于承中,又进一步分解为bψ,mm,&crm引l等子录, linux 分刹飢含与系純引导,内存管理,系銑调用的入和返园、中厮处理以 及其他内中依賴于CF[和系统沾构的底层代码。这些伐母有些是汇 淌代码,位主要还晟c代码 drivers 设备驱动程序,包括各种块设备和子符设各的驱动稈序 文件系统,每个了目录分别对应一个特定的文件系统,还有一些共 冋的源程序牌于“拟文廾系统”vt include包含了所有的h文件。如rchf树“桿,在il中也是为各种(pU 专设一个子目录,曲通用前了目录5m则根据系统的配置而“符号连 接”到具怖CPU的专用了目录,如asmi386,asmm皆k等。除此之外 还有通用的子录罪nx,net等 Linux内核的min《}及其制始化过程,包括: maine, version.c等寞 LInux内酸的进程间通信,包括;tic,sems,shm,,口等文件 cAthAl 进管理和调度,包括:hedc,tork;,cxit:, signal,5ye,m是,, TE50UTCA C,dm, softirq;, Tim +r,c等文件 lib 遹川的上具性子裸序,如对出错铝息的处理等等 u H 内存管,即虚存管理,包括:w,wpl:;, Pg4-FF. FE+-E|c swp5tale, Tsan,C, kin alloe., m allos., TT cmu}:c,mm3p.c等支件 包含了箐和不同國卡和网逝說程的驱动程序 sCRIPT用于统的命令文件 值得一提的是, 的源代码看似庞大,其实对于每一个具体的内核而言并不是所有的和文 件都会用到,而是在编译(包括连接)时根据系统的配置有选择地使用。例如,虽然源代码中包含了 用来支持各种不同的代码,但编译以后每一个具体的内核都只是针对一种特定的。再如, 在子目录下包含了各种网卡的驱动程序,但实际上通常只会用到一种网卡,而且各种网卡的驱动程 序实际上大同小异 在结束本节之前,还要介绍一下有关内核版本的一些规定。 通常,在说到 时,是指它的内核加上运行在内核之上的各种管理程序和应用程序。严格地 说,内核只是操作系统的一部分,即其核心部分。但是,人们往往把的内核就称为,所以 在讲到时有时候是指整个操作系统,有时候则是指其内核,要根据上下文加以区分。在本书中, 如无特别说明,则 通常是指其内核。 内核的版本在发行上有自己的规则,可以从其版本号加以识别。版本号的格式为 其中介于到之间,而 则介于到之间。通常数字愈高便说明版本愈新。一些版本号 后面有时会见到的字样,是介于到之间的数字。它代表对某一版的内核“打补丁”或修 订的次数。如 ,代表这是对版本的内核的第次修订。 由于 源代码的开放性,公众随时都可以从网上下载最新的版本,包括还在开发中、尚未稳 定、因而还不能发行的版本,因此,需要有一套编号的方案,使用户看到一个具体的版本号就可以知 道是属于“发行版”还是“开发版”,所以 内核的版本编号是有规则的。在版本号 中 的不同号码标志着内核在设计上或实现上的重大改变,一方面表示版本的变迁,一方面标志着版本 的种类,即“发行版”或“开发版”。如果为偶数便表示是一个相对稳定、已经发行的版本;若为 奇数则表示还在开发中,目前还不太稳定、或者在运行中可能出现比较大的问题的版本。开发中的版 木一旦通过测试以及试运行,证明已经稳定下来,就可能会发布一个的值为偶数的发行版。之后, 开发者们又将创建下一个新的开发版本。但是有时候也会在历经了几个开发版以后才发布一个发行版 至于,则代表着在内核增加的内容不是很多、改动不是很大时的变迁,只能算是同一个版本。例如, 版本由 升级到只意味着版本中的一些小缺陷被修复,或者代码有了一些小的改变。 “发行版”和“开发版”的是独立编号的,因此并没有固定的对应关系。例如,当开发版的版 木号达到 时,相应的发行版还只是 内核的版在年首次公开发行,版在年月发行。 内核的改进是相 当频繁的,几乎每个月都在变。本书最初采用的是 版,最后成书付印时则以正式发行的版 为依据。 的内核基本上只有一种来源,那就是由主持开发和维护的内核版本。但是有很多公司 在发行 操作系统不同的发行版( ),如 等等。虽然不同的发行版本 中所采用的内核在版本上有所不同,但其来源基本一致。各发行版的不同之处一般表现在安装程序、 安装界面、软件包的多少、软件包的安装和管理方式等方面,在特殊情况下也有对内核代码稍作修改 的(如汉化)。不同的发行版由不同的发行商提供服务。不同的发行商对自己所发行版本的定位也有不 同,各厂商所能提供的售后服务、技术支持也各不相同。由此可见,原则上全世界只有一个 所 谓“某某”只是它的一种发行版本或修订版本。另外,不要把内核的版本与发行商自己的 版本(如 )混淆,例如, 版的内核是版 对于大多数用户,由发行商提供的这些发行版起着十分重要的作用。让用户自行配置和生成整个 系统是相当困难的,因为那样用户不但要自己下载内核源程序,自己编译安装,还要从不同的站 点下载各种自由软件添加到自己的系统中,还要为系统加入各种有用的工具,等等。而所有这些工作 都是很费时费力的事情。 的发行厂商正是看到了这一点,替用户做了这些工作,在内核之上集成 了大量的应用软件。并且,为了安装软件,发行厂商同时还提供了用于软件安装的工具性软件,以利 于用户安装管理。由于组织新的发行版时并没有一个统一的标准,所以不同厂商的发行版各有特点也 各有不足 内核的终极的来源虽然只有一个,但是可以为其改进和发展作出贡献的志愿者人数却并无限 制。同时,考虑到一些特殊的应用,一些开发商或机构往往对内核加以修改和补充,形成一些针对特 殊环境或要求的变种。例如,针对“嵌入式”系统的要求,有人就开发出 针对有“硬 实时”要求的系统,有人就开发了 ;针对手持式计算机的要求,有人就开发出了 等等。当然,中文也是其中的一类。每当有新的内核版本发布时,这些变种版本通常也 快就会推出相应的新版本。根据对自由软件版权的规定(),这些变种版本对内核的修改与补 充必须公开源代码。 许多人以为,既然 是免费的公开软件,那就无所谓版权的问题了。其实不然 以及 内核源代码,是有版权保护的,只不过这版权归公众(或者说全人类)所有,由自由软件基金会 管理。为所有的软件制定了一个公用许可证制度,称为( 也叫 ,这是与通常所讲的版权即 截然不同的制度 即通常意义下的版权, 保护作者对其作品及其衍生品的独占权,而 则允许用户对作品进行复制、修改,但要求用户 承担规定的一些义务。按规定,允许任何人免费地使用软件,并且可以用软件 的源代码重构可执行代码。进一步,还允许任何人免费地取得 软件及其源代码,并且再加 以发布甚至出售,但必须要符合的某些条款。简而言之,这些条款规定软件以及在软 件的基础加以修改而成的软件,在发布(或转让、出售)时必须要申明该软件出自 (或者源自 ),并且必须要保证让接收者能够共享源代码,能从源代码重构可执行代码。换言之,如果一个软 件是在源代码的基础加以修改、扩充而来的,那么这个软件的源代码就也必须对使用者公开(注 意产品的出售与源代码的公开并不一定相矛盾。通过这样的途径,自由软件的阵容就会像滚雪球一样 越滚越大。不过,如果一个软件只是通过某个软件的用户界面()使用该软件,则不受 条款的约束或限制。总之,的主要目标是:使自由软件及其衍生产品继续保持开放状态,从整体 上促进软件的共享和重复使用。具体到的内核来说,如果你对内核源代码的某些部分作了修改, 或者在你的程序中引用了 内核中的某些段落,你就必须加以申明并且公开你的源代码。但是, 如果你开发了一个用户程序,只是通过系统调用的界面使用内核,则你自己拥有完全的知识产权,不 受条款的限制 应该说,的构思是很巧妙也是很合理的,其目的也是很高尚的。 说到高尚,此处顺便多说几句。美国曾经出过两本很有些影响的书,一本叫 另一本叫 ,两本书均被列入 系统程序员的必备工具书。在这两本 书中,作者们( 以及 等)一一列举了经过他们辛勤努力才 破译和总结出来的 (应用程序设计界面)实际上提供了但却没有列入 技术 资料的许多有用(而且重要)的功能。作者们认为 没有将这些功能收入其技术资料的原因 是无法用疏忽或遗漏加以解释的,而只能是故意向用户隐瞒。 既是操作系统的提供者,同时 又是一个应用程序的开发商,通过向其它的应用程序开发商隐瞒一些操作系统界面上的技术关键,就 使那些开发商无法与 公平竞争,从而使 可以通过对关键技术的垄断达到对 应用软件市场的垄断。作者们在书中指责 这样做不仅有道德上的问题,也有法 律上的问题。是否涉及法律问题姑且不论,书中所列的功能确实都是存在的,可以通过实验证实,也 确实没有写入 向客户提供的技术资料。 要是将与 放在一起,则二者恰好成为鲜明的对比。差别之大,读者不难做出自己的 结论。 的正文包含在一个叫 的文件中。在通过光盘安装的 系统中,该文件的路径 名为 。而在下载的 内核文件中,经过解压后该文件在顶层目录中。有 兴趣或有需要的读者可以(而且应该)仔细阅读。 系列的寻址方式 可以说是资格最老的微处理器芯片制造商了,历史上的第一个微处理芯片就是制 造的。所谓系列,是指从位微处理器开始的整个芯片系列,系列中的每种型 号都保持与以前的各种型号兼容,主要有 以及以后各种型 号的 芯片。自从选择用于个人计算机以后,系列的发展就与 及其 兼容机的发展休戚相关了。其中 并不广为人知,就与 初决定停止在机中使用 有关。限于篇幅,本书不对这个系列的系统结构作全面的介绍,而只是结合 内核的存储管理对 其寻址方式作一些简要的说明 系列中,和是位处理器,而从 开始为位处理器, 则是该系列 到,也就是从位到位过渡时的一个中间步骤 虽然仍是位处理器,但是 在寻址方式上开始了从“实地址模式”到“保护模式”的过渡。 当我们说一个是位”或位”时,指的是处理器中“算术逻辑单元”()的宽度 系统总线中的数据线部分,称为“数据总线”,通常与具有相同的宽度(但有例外)。那么“地址 总线”的宽度呢?最自然的地址总线宽度是与数据总线一致。这是因为从程序设计的角度来说,一个 地址,也就是一个指针,最好是与一个整数的长度一致。但是,如果从位寻址能力的角度来考 虑,则这实际上是不现实的,因为一个位的地址只能用来寻访个不同的地址单元,这显然太小 了。所以,一般位的地址总线都是位的。这也造成了一些位在内部结构上的一些不 均匀性,在位的指令系统中常常会发现一些实际上是位的操作。当的技术从位发展 到位的时候,本来地址总线的宽度是可以跟数据总线一致了,但是当时人们已经觉得由位地址 所决定的地址空间()还是太小,还应该加大。加到多大呢?结合当时人们所能看到的微型机的应 用前景,以及存储器芯片的价格,决定采用,也就是说的倍,那时觉得应该是足够了。 确实,字节的内存空间在当时已经很使一些程序员激动不已了,那时候配置齐全的小型机,甚至大 型机也只不过是字节的内存空间。在计算机的发展史上,几乎每一个技术决策,往往很快就被事 后出现的事实证明是估计不足的 既然决定了在其位 即中采用字节的内存地址空间,地址总线的宽度也就 相应地确定了,那就是位。这样,一个问题就摆在了的设计人员面前:虽然地址总线的宽度 是位,但中的宽度却只有位,也就是说可直接加以运算的指针的长度是位的。如 何来填补这个空隙呢?可能的解决方案当然有很多种。例如,可以像在一些位中那样,增设 些位的指令专用于地址运算和操作,但是那样又会造成内部结构的不均匀性。再如,当时的 小型机也是位的,但是结合其 (内存管理单元)可以将位的地址映射到位的地 址空间。结果 设计了一种在当时看来还不失巧妙的方法,即分段的方法 在 中设置了四个“段寄存器” 和,分别用于可执行代码即指令 数据、堆栈和其它。每个段寄存器都是位的,对应于地址总线中的高位。每条“访内”指令中 的“内部地址”都是位的,但是在送上地址总线之前都在内部自动地与某个段寄存器中的内 容相加,形成一个位的实际地址。这样,就实现了从位内部地址到位实际地址的转换,或者 “映射”。这里要注意段寄存器中的内容对应于位地址总线中的高位,所以在相加时实际上是拿 内部地址中的高位与段寄存器中的位相加,而内部地址中的低位保留不变。这个方法与操作 系统理论中的“段式内存管理”相似,但并不完全一样,主要是没有地址空间的保护机制。对于每一 个由段寄存器的内容确定的“基地址”,一个进程总是能够访问从此开始的字节的连续地址空间, 而无法加以限制。同时,可以用来改变段寄存器内容的指令也不是什么“特权指令”,也就是说,通过 改变段寄存器的内容,一个进程可以随心所欲地访问内存中的任何一个单元,而丝毫不受到限制。不 能对一个进程的内存访问加以限制,也就谈不上对其它进程以及系统本身的保护。与此相应,一个 如果缺乏对内存访问的限制,或者说保护,就谈不上什么内存管理,也就谈不上是现代意义上的中央 处理器。由于的这种内存寻址方式缺乏对内存空间的保护,所以为了区别于后来出现的“保护模 式”,就称为“实地址模式”。 显然,在实地址模式上是无法建造起现代意义上的“操作系统”的 针对的这种缺陷,从 开始实现其“保护模式”( ,但是早期的 只能从实地址模式转入保护模式,却不能从保护模式转回实地址模式)。同时,不久以后位的 也开发成功了。这样,从 就完成了一次从比较原始的位到现代的 位的飞跃,而 则变成这次飞跃的一个中间步骤。从 以后 的历经 等等型号,虽然在速度上提高了好几个量级,功能上也有了不小的改进,但基本 上属于同一种系统结构中的改进与加强,而并无重大的质的改变,所以统称为结构,或 下面我们将以 为背景,介绍系列的保护模式。 是个位,也就是说它的数据总线是位的。我们在前面说过,最自然的地址 总线宽度是与数据总线一致。当地址总线的宽度达到位时,其寻址能力达到了(千兆),对于 内存来说似乎是足够了。所以,如果新设计一个位的话,其结构应该是可以做到很简洁、很 自然的。但是, 却无法做到这一点。作为一个产品系列中的一员, 必须维持那些段寄存器, 还必须支持实地址模式,与此同时又要能支持保护模式。而保护模式是完全另搞一套,还是建立在段 寄存器的基础上以保持风格上的一致,并且还能节约的内部资源呢?这对于的设计人员无疑 又是一次挑战。 选择了在段寄存器的基础上构筑保护模式的构思,并且保留段寄存器为位(这样才可以利 用原有的四个段寄存器),但是却又增添了两个段寄存器和。为了实现保护模式,光是用段寄存 器来确定一个基地址是不够的,至少还得要有一个地址段的长度,并且还需要一些其它的信息,如访 问权限之类。所以,这里需要的是一个数据结构,而并非一个单纯的基地址。对此,设计人员的 基本思路是:在保护模式下改变段寄存器的功能,使其从一个单纯的基地址(变相的基地址)变成指 向这样一个数据结构的指针。这样,当一条访内存指令发出一个内存地址时, 就可以这样来归纳 出实际上应该放上数据总线的地址: 根据指令的性质来确定应该使用哪一个段寄存器,例如转移指令中的地址在代码段,而取数 指令中的地址在数据段。这一点与实地址模式相同 根据段寄存器的内容,找到相应的“地址段描述结构” 从地址段描述结构中得到基地址。 将指令中发出的地址作为位移,与段描述结构中规定的段长度相比,看看是否越界。 根据指令的性质和段描述符中的访问权限来确定是否越权。 将指令中发出的地址作为位移,与基地相加而得出实际的“物理地址”。 虽然段描述结构存储在内存中,在实际使用时却将其装载入中的一组“影子”结构,而 在运行时则使用其在中的“影子”。从“保护”的角度考虑,在由(指令给出的)内部地址(或 者说“逻辑地址”)转换成物理地址的过程中,必须要在某个环节上对访问权限进行比对,以防止不具 备特权的用户程序通过玩弄某些诡计(例如修改段寄存器的内容,修改段描述结构的内容等),得以非 法访问其它进程的空间或系统空间 明白了这个思路, 的段式内存管理机制就比较容易理解了(还是很复杂)。下面就是此机制 的实际实现。 首先,在 中增设了两个寄存器:一个是全局性的段描述表寄存器 ),另一个是局部性的段描述表寄存器 ,分别可以用来 指向存储在内存中的一个段描述结构数组,或者称为段描述表。由于这两个寄存器是新增设的,不存 在与原有的指令是否兼容的问题,访问这两个寄存器的专用指令便设计成“特权指令” 在此基础上,段寄存器的高位(低位另作它用)用作访问段描述表中具体描述结构的下标 (),如图所示 3210 TI RPL 表示特权级别 00=最高级,11-=最低级 TI=0时使用GDTR =1时使用LDTR 从8192个全局或局部描述 表项中迭择一个描述符 图段寄存器定义 或 中的段描述表指针和段寄存器中给出的下标结合在一起,才决定了具体的段描述 表项在内存中的什么地方,也可以理解成,将段寄存器内容的低位屏蔽掉以后与 或 的基地址相加得到描述表项的起始地址。因此就无法通过修改描述表项的内容来玩弄诡计,从而起到 保护的作用。每个段描述表项的大小是个字节,每个描述表项含有段的基地址和段的大小,再加上 其它一些信息,其结构如图所示。 B3L-B24 G DA L2-L16 P DPLI S ty pe B23-B16 B5-B0 L5-L0 图 字节段描述符表项的定义 结构中的 和 分别为基地址的 和 而 和 则为段长度()的 和 其中是个位的位段,而是 个位的位段。它们所在的整个字节分解如图所示。

...展开详情
试读 127P linux内核源代码情景分析 完整目录,高清
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
上传资源赚钱or赚积分
最新推荐
linux内核源代码情景分析 完整目录,高清 50积分/C币 立即下载
1/127
linux内核源代码情景分析 完整目录,高清第1页
linux内核源代码情景分析 完整目录,高清第2页
linux内核源代码情景分析 完整目录,高清第3页
linux内核源代码情景分析 完整目录,高清第4页
linux内核源代码情景分析 完整目录,高清第5页
linux内核源代码情景分析 完整目录,高清第6页
linux内核源代码情景分析 完整目录,高清第7页
linux内核源代码情景分析 完整目录,高清第8页
linux内核源代码情景分析 完整目录,高清第9页
linux内核源代码情景分析 完整目录,高清第10页
linux内核源代码情景分析 完整目录,高清第11页
linux内核源代码情景分析 完整目录,高清第12页
linux内核源代码情景分析 完整目录,高清第13页
linux内核源代码情景分析 完整目录,高清第14页
linux内核源代码情景分析 完整目录,高清第15页
linux内核源代码情景分析 完整目录,高清第16页
linux内核源代码情景分析 完整目录,高清第17页
linux内核源代码情景分析 完整目录,高清第18页
linux内核源代码情景分析 完整目录,高清第19页
linux内核源代码情景分析 完整目录,高清第20页

试读结束, 可继续阅读

50积分/C币 立即下载 >