linux内核情景分析

所需积分/C币:10 2011-10-13 17:19:40 6.94MB PDF
收藏 收藏
举报

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 图 字节段描述符表项的定义 结构中的 和 分别为基地址的 和 而 和 则为段长度()的 和 其中是个位的位段,而是 个位的位段。它们所在的整个字节分解如图所示。 TYPE DPI E ED/CI RW A A=0本段未被访问:=1已被访问 E=0,数据段 ED=0,向E伸展(数据段 ED=1,向下伸展(堆栈段 W=0,不能被写入 W=1,可写入 E=1,代码段 C=0,忽视行权级 C=],遵循特杈级 R=0,不可读 R=1,可读 S=,系统描述瑛 S=1;代码戌数据段描述项 DPL00-01,本段特权 P=0,描述项无定叉 P=1,段包含有效基地址和界限 图段描述表项 字节的定义 我们也可以用一段“伪代码”来说明整个段描述结构: 基地址的最高位 ,表段的长度单位,表示字节,表示 存取方式, 位 位 固定设置成 ,可供系统软件使用 段长度的最高位/ 为时表示该段的内容不在内存中 ,访问本段所需权限 描述项类型,表示系统,表示代码或数据 段的类型,与上面的标志位一起使用 基地址的低位

...展开详情
试读 127P linux内核情景分析
立即下载 低至0.43元/次 身份认证VIP会员低至7折
    一个资源只可评论一次,评论内容不能少于5个字
    xhz520fxj 很经典的一本书!很好,扫描也和清晰!
    2012-01-05
    回复
    • 分享精英

      成功上传11个资源即可获取
    关注 私信 TA的资源
    上传资源赚积分,得勋章
    最新推荐
    linux内核情景分析 10积分/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页

    试读已结束,剩余107页未读...

    10积分/C币 立即下载 >