(计算机应用技术专业论文)linux+011内核研究与内核编程实践.pdf_第1页
(计算机应用技术专业论文)linux+011内核研究与内核编程实践.pdf_第2页
(计算机应用技术专业论文)linux+011内核研究与内核编程实践.pdf_第3页
(计算机应用技术专业论文)linux+011内核研究与内核编程实践.pdf_第4页
(计算机应用技术专业论文)linux+011内核研究与内核编程实践.pdf_第5页
已阅读5页,还剩71页未读 继续免费阅读

(计算机应用技术专业论文)linux+011内核研究与内核编程实践.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中文摘要 l i n u x 具有灵活性与开放性,并完全遵循p o s i x 标准,在各个领域得到了广 泛的应用。在我国i t 业正渴望“崛起”的时代背景下,研究l i n u x 操作系统内 核具有非凡的意义。近来,基于l i n u x 早期内核开发专门用于嵌入式系统的内核 也被证明是简单可行的方法,1 tc l i n u x 的出现就是典型范例。因此研究研究早期 l i n u x 内核也具有现实意义。 对于l i n u x o 1 1 的内核结构,本文从子系统、模块、子模块3 个层次着手, 提出了自己的观点。本文剖析了设备i o 子系统的各个驱动模块并增加了对系统 时间显示、系统组合键、虚拟终端的支持;剖析了文件i o 子系统组织与实现并 增加其对某些特殊虚拟设备的支持;剖析了内存管理模块的分段分页管理技术以 及重要的需求加载、写时复制技术,并扩展了该模块;剖析了内核的多任务管理 机制并调整了调度程序;修正了原内核在显卡驱动、系统定时器、任务等待队列 的唤醒中存在的少量b u g 。在此基础上,本文增加了“定时睡眠”系统调用并实 现了内核的两大高级功能:增设“诊断模式”以及增加对“双屏幕的支持。 综上,本文完整地研究了一个具体的操作系统内核( l i n u x0 1 1 ) ,并在其上 上进行了较多有新意的实践内容。 关键词:内核p o s i x 虚拟终端虚拟设备多任务管理 a b s t r a c t l i n u xh a st h ec h a r a c t e r i s t i c so fo p e na n df l e x i b i l i t y , b e i n gf u l l yc o m p l i e dw i t h p o s i xs t a n d a r d , s oi tg o ti t sp l a c ei ne v e r ya r e a i nt h ec u r r e n tp e r i o do fo u ri t b u s i n e s se a g e r i n gt og r o wu p ,t h er e s e a r c ho fl i n u xk e r n e lw o u l dm a k es i g n i f i c a n t s e n s e r e c e n t l y , p e o p l ef o u n dt h a ti ti sas i m p l ea n de f f e c t i v ew a yt oc r e a t ek e r n e l so f e m b e d d e ds y s t e mb a s e d0 1 :1e a r l yl i n u xk e r n e l s t h ep r o d u c t i o no fuc l i n u xp r o v e d t h i sp o i n t s ot h er e s e a r c ho f e a r l yl i n u xk e r n e l sw o u l dm a k ep r a c t i c a ls i g n i f i c a n c e a b o u tt h es t r u c t u r eo fl i n u x0 11k e r n e l t h i sp a p e rp r o p o s e dan e wc o n c e p tb y a n a t o m i z i n gi tf r o m3l e v i e so fs u b s y s t e m s ,m o d u l e sa n ds u b m o d u l e s t h i sp a p e r a n a t o m i z e dt h ed e v i c ei o s u b s y s t e ma n da d d e ds u p p o r tt os y s t e mt i m ed i s p l a y , s y s t e mc o m b i n a t i o nk e y s ,v i r t u a lt e r m i n a l s ;a n a t o m i z e df i l e i os u b s y s t e ma n d a d d i n gs u p p o r tt os p e c i a lv i r t u a ld e v i c e s ;a n a t o m i z e dm e m o r ym a n a g e m e n tm o d u l e , i t s p a g i n gt e c h n i q u e s ,l o a d o n - d e m a n da n dw r i t e - o n c o p yt e c h n i q u e sa n da l s oi e x p a n d e di t ;a n a t o m i z e dt h em e c h a n i s mo fm u l t i m a s tm a n a g e m e n ta n da d j u s t e di t s c h e d u l i n gm e t h o d ;f i x e ds o m eb u g sr e m a i n e di nt h eo r i g i n a lk e r n e lp a r t so fv i d e o c a r dd r i v i n g ,s y s t e mt i m i n ga n dt h et a s k sw a i t i n gq u e u e sw a k eu p f u t h e rm o r e ,t h i s p a p e ra d d e dt h es y s t e mc a l lo f t i m i n gs l e e p a n di m p l e m e n t e dt w oa d v a n c e dk e r n e l f u n c t i o n s :t h es u p p o r tt o “d i a g n o s i sm o d e a n d “d o u b l es c r e e n s ” g e n e r a ls p e a k i n g ,t h i sp a p e ra n a l y s e das p e c i f i e dk e r n e l ( l i n u x0 11 ) ,a n dm a d e s o m en e w , s i g n i f i c a t i v ep r a c t i c eo nt h ek e r n e l k e yw o r d s :k e r n e l ,p o s i x ,v i r t u a lt e r m i n a l ,v i r t u a ld e v i c e ,m u l t i t a s k m a n a g e m e n t 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工作和取得的 研究成果,除了文中特别加以标注和致谢之处外,论文中不包含其他人已经发表 或撰写过的研究成果,也不包含为获得丞壅盘堂或其他教育机构的学位或证 书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中 作了明确的说明并表示了谢意。 学位论文作者签名:铉红鬼签字日期:切。7 年月侈日 学位论文版权使用授权书 本学位论文作者完全了解叁盗盘堂有关保留、使用学位论文的规定。 特授权苤盗盘堂可以将学位论文的全部或部分内容编入有关数据库进行检 索,并采用影印、缩印或扫描等复制手段保存、汇编以供查阅和借阅。同意学校 向国家有关部门或机构送交论文的复印件和磁盘。 ( 保密的学位论文在解密后适用本授权说明) 学位论文作者签名: 7 亥勿刀 导师签名: 签字日期:切口7 年夕月f 乡日签字日期:沙7 年乡月侈日 第一章绪论 1 1 引言 第一章绪论 l i n u x 在全世界的发展,已经取得了举世瞩目的成就。从欧洲剑亚洲、从公 司到政府机构都向l i n u x 倾注了极大的热情和关注。由于其灵活与开放的特点, l i n u x 在各个领域得到了广泛的应用,毫无疑问,它已经成为推动业发展的主 要力量之一。l i n u x 的开源特性为我们掌握操作系统实现的核心技术提供了前所 未有的机遇。在我国i t 业正渴望“崛起”的时代背景下,研究l i n u x 操作系统 内核更具有非凡的意义。本文对一个具体的操作系统内核( l i n u x0 1 1 ) 进行了 分析,并在此基础上进行了内核编程实践。 1 2 研究操作系统内核的一般意义【1 】 1 开发“自己的”操作系统 操作系统是所有软件赖以生存的基础,因此i t 业强烈地需要拥有自己的操 作系统。l i n u x 操作系统源代码公开,开发者可以立即加入开发行列,不仅开发 速度大大快于任何商业操作系统,而且可以保证操作系统中不存在任何黑洞和隐 蔽的问题,不会受制于人。因此l i n u x 对于我们来说,是实现民族腾飞的一个难 得的机遇。 2 ,开发高水平软件 自由软件联盟及“中国自由软件库”已经涵盖了操作系统、开发语言、视窗 系统、数据库、网络、文字处理、排版及多媒体等各个领域。l i n u x 内核许多面 向通信的底层代码,对开发我国自己的信息安全产品有极高的参考价值。 实际上,l i n u x 的源代码中包含了世界各地成百上千名计算机高手的作品, 分析这些源代码对于我们掌握核心技术会起到事半功倍的效果,尤其是各种驱动 程序的编写,对于我们把软硬件结合起来发展民族信息产业至关重要。 3 计算机科学的教学和科研 对于从事计算机教学和科研的人来说,l i n u x 具有更多一层的意义。一般商 业出售的u n i x 完整实现版本,除了价格高之外,还不提供核心程序的源代码, 这样,若想了解u n i x 的内核,或在内核程序上做些改进就很困难,更谈不上作 第一章绪论 为操作系统和科研的平台了。而l i n u x 提供从内核到上层软件的全部源程序。如 果把l i n u x 作为教学用操作系统,对源代码的组织结构、实现原理及实现机制进 行详细的分析,那么就会比只讲操作系统原理更有价值。 1 3l i n u xo 11 操作系统内核简介【2 】 内核是较早期的l i n u x 内核版本,代码精简,包含,代码量近2 万行。目前 最新版本的l i n u x 内核是2 6 x ,代码量超过5 0 0 万行。本文要研究0 1 i 版内核 远不如当前新版本内核庞大、复杂,但就操作系统的基本功能来看,麻雀虽小, 五脏俱全。 0 1 1 版内核工作在保护模式下,支持多任务管理、内存分段分页管理;内存 分配方面应用了需求加载技术、写时复制技术;支持硬盘、软盘、虚拟内存盘; 支持缓冲管理;支持标准终端和串行终端( 通过串行通信连接的远程终端) ;支持 p o s i x 标准的系统调用接口:使用m i n i x l 0 文件系统。 1 4 为什么研究早期内核? 1 l i n u x 早期内核并不是过时的,濒临淘汰的东西。 “l i n u x0 1 1 内核,1 9 9 1 年1 2 月发布;代码量不足2 万行,不支持c d r o m , 不支持打印机,不支持t c p i p ,不支持图形化界面”。而最新内核版本是2 6 2 1 ( 截 止到本文完成日期) ,2 6 0 版内核代码量就达约5 9 2 万行,支持热插拔,支持虚 拟文件系统,支持x w i n d o w 图形界面【3 j 。咋一看,我们很容易从这些描述中得 出结论:l i n u x0 1 1 版内核早就过时了。对于最终用户而言,的确如此。然而从 技术原理上讲,并非如此。我们可以说新版内核继承了、发展了早期内核,然而 绝不能说是“推翻了”。正如同济大学赵博士( 编写了多部l i n u x 早期内核源代码 注释方面的著作) 所说:“在对早期内核源代码的注释过程中,发现早期内核源代 码几乎就是目前所使用的较新内核的一个精简版本。其中包括了目前新版本中几 乎所有的基本功能原理的内容”。的确如此,概括起来有如下一些理由:( 1 ) 内核 引导加载部分几乎与目前内核相同。( 2 ) 需求加载【4 】、写时复制技术 4 1 仍然在使用。 ( 3 ) 任务管理,文件系统的原型想通。( 4 ) 缓冲管理的核心思想没有变。( 5 ) 一些操 作系统设计思想仍非常有活力,如透明性,虚拟性。 2 应用上仍有价值 早期内核的精简性可使开发人员较为容易地将其移植到一些小的应用系统 第一章绪论 之中。事实上,目前已经出现了不少基于l i n u x 早期内核而开发的专门用于嵌入 式系统的内核,如pc l i n u x 5 】等。 3 可以完整、深入地进行分析 可能多数人和我有同感:学完“操作系统原理教程”,仍对实际操作系统的 真正组成和内部关系有一种空中楼阁的感觉。操作系统内核本身是一个整体,要 想真正理解其整体运行机制,就应当不放过每一个处理细节。事实上,在研读完 l i n u x0 1 l 内核源代码后,我才有一种豁然开朗的感觉,发现内核中大量的重要 细节在原理教程中都未提到。因此很有必要完整地分析具体的操作系统内核。然 而较新的操作系统内核非常庞大,几乎不可能进行完整地透彻的分析。而早期内 核的精简性为我们完整而深入的进行研究提供了便利。 1 5 本文完成的工作 本文完成了2 大部分的工作: 1 对l i n u x0 1 1 内核进行研究 ( 1 ) 通读内核源代码 参阅各种相关资料,理解所有的内核源代码,并反复总结、归纳。 ( 2 ) 划分内核的组成,描述内核的结构 对于l i n u x0 1 1 内核的组成与结构,在理解所有内核源代码的基础上,本文 提出了自己的观点。本文从子系统、模块、子模块三个层次对内核组成进行 分解。 ( 3 ) 对各子系统、模块、子模块进行剖析 对划分出来的每一个组成部分进行了描述,侧重于每个子模块的数据结构、 主要原理及其对外调用接口,并对内核使用的中断系统、设备号体系进行了的总 结。 2 基于l i n u x0 1 1 进行内核编程实践 ( 1 ) 搭建了内核编程环境。 ( 2 ) 增加对虚拟终端的支持。 ( 3 ) 增加对系统组合键及系统时间显示的支持。 ( 4 ) 增加对某些虚拟设备的支持。 ( 5 ) 扩充了内核支持的最大内存。 ( 6 ) 增加了一个“定时睡眠 系统调用。 ( 7 ) 增加了2 个功能模块:“诊断模式”与“双屏幕”。 ( 8 ) 引导初始化时输出更多有用信息等人性化改善。以及修正原内核存在的 第一章绪论 少量b u g 。 1 6 章节安排 第一章绪论:简单介绍了l i n u x0 1 1 操作系统内核,并阐述了研究操作系统 内核的意义。另外说明了本文完成的工作以及本文的章节安排。 第二章内核整体概述:描述系统组成与结构,对系统组成进行划分,并对 系统调用接口进行叙述。对l i n u x0 1 l 内核各模块中使用的硬件中断、其它中断 服务程序进行了完整的总结与归纳。 第三章设备i o 子系统研究与实践:总结并归纳了系统中支持的所有i o 设 备及其设备号的规定。分析并描述了块设备驱动模块及其下属的3 个子模块:硬 盘驱动子模块、虚拟内存盘驱动子模块和软盘驱动子模块。描述了缓冲块管理模 块,终端驱动模块及其下属的显卡驱动子模块、键盘驱动子模块、串口驱动子模 块。最后对该子系统进行了实践。由于i o 系统内容本身繁杂,因此本章篇幅较 长。 第四章文件i o 子系统研究与实践:介绍了m i n i x l 0 文件系统,讨论文件 i o 子系统并剖析其3 大组成模块。最后在实践内容中增加了对某些特殊虚拟设 备的支持。 第五章内存管理研究与实践:分析内核的内存划分与管理,并对主内存管 理模块进行剖析。在实践部分,我们增加了内核支持的最大内存。 第六章多任务管理研究与实践:描述任务管理相关的原理并剖析任务管理 模块。 第七章内核编程实践:叙述内核编程环境的搭建工作。介绍作者内核编程 实践的工作流程。介绍作者对0 1 l 内核进行的编程实践:扩展、增加一些内核 功能,修正少量b u g 。 第八章总结与展望:对全文进行总结并展望可以进一步做的工作。 第二章内核整体概述 第二章内核整体概述 l i n u x0 11 系统工作在保护模式下,它的许多优良特性在当代l i n u x 操作系统 中仍然保留。如内存管理的需求加载技术与写时复制技术;任务管理中的的信号 机制;文件子系统中的i 结点模型【6 1 等。本章描述系统的组成与结构。 2 1 系统的组成与结构 从总体上看,系统内核实现主要由2 大子系统和2 大模块组成,另外提供统 一的系统调用接口。如图2 1 所示。图中箭头表示调用关系,此外终端设备驱动 模块与块设备驱动模块会分别调用自己的子模块。 系统调用接口 一l i 鋈h 蘸 p 祗二二7 千气蔫手i 1 终端设备马区动梗块 ll块设备寻尽动梗块 :i 显卡驱动j 建盘马目动i 串行终端驱ii 硬盘马e 动l 软盘马b 动l 虚拟内存盘l ; ii 子梗块l 子梗块l 动子模块ii 子模块l 子梗块 l 马医动子模块ii i |i i iiil 图2 1 系统组成与结构图 2 1 i 设备i 0 子系统 该子系统实现系统输入输出设备的驱动与管理。由3 个模块组成:块设备驱 动模块、终端设备驱动模块和缓冲块管理模块。块设备驱动模块负责驱动块设备, 提供对块设备访问的统一接口。系统中支持的块设备包括:硬盘设备、软盘设备 和虚拟内存盘设备。每类块设备都有独自的驱动程序,分别在各子模块中实现。 第二章内核整体概述 硬盘、软盘和虚拟内存盘驱动子模块只提供调用接口给它们的直接上层模块使 用。各类块设备的差别只局限在块设备驱动模块内,上层软件感觉不到具体的区 别,只是通过设备号来访问。 终端设备驱动模块支持2 类终端:标准终端和串行终端。标准终端有显示器 和键盘组成。串行终端指通过串口连接的远程终端。终端设备驱动模块使得上层 软件可以同等对待这两种终端。 缓冲块管理模块负责访问块设备时的缓冲管理。块设备作为外部存储设备, 其速度远不如内存快,因此上层软件并不直接访问各块设备,而是通过缓冲块管 理模块来统一访问,使得访问效率大大提高。 2 1 2 文件i o 子系统 文件i o 子系统是系统的重要组成部分。可以将其划分为3 个模块:( 1 ) 文件 系统核心管理模块,实现m i n i x l 0 文件系统的核心逻辑,包括超级块的管理、 i 节点位图和数据块位图的管理、i 节点的管理等。( 2 ) 文件读写管理模块,统一 i o 设备的读写与常规文件的读写,使得上层软件可以像读写常规文件一样访问 i o 设备。( 3 ) 文件i o 高级调用接口模块,实现一些高级调用接口。 2 1 3 主内存管理模块 该模块完成对主内存区的管理。以页为单位进行管理,实现了需求加载和写 时复制技术。需求加载技术是指:当执行一个程序时,并不是一次性把所有的代 码全部加载到内存,而是在需要运行的代码不在内存时才动态加载需要的代码, 这样就避免了不必要的加载。写时复制技术是指:父进程复制本身创建子进程时, 并不实际复制代码段与数据段的内容,而是共享之,只有在被共享的页被写入时 才复制该页,这样就避免了不必要的复制。该模块将在。 2 1 4 任务管理模块 l i n u x0 1 1 是支持多任务的操作系统。任务管理的内容包括任务的创建、销 毁与调度;任务资源的分配、管理与统计;任务间的通信等。任务运行需要多种 资源如c p u 时间、内存i o 资源等。任务相关的状态、参数信息统一保存在任 务控制结构里,也就是操作系统原理中的进程控制块。该模块直接使用文件i o 子系统和主内存管理模块提供的服务。因此本模块将放在在其余3 个组成部分后 分析讨论。 第二章内核整体概述 2 2 系统调用接口 l i n u x0 1 1 内核系统调用接i z l 遵循p o s i x 标准【7 】。该部分只是提供统一的调用 接口,无具体实现逻辑。通过设立跳转表可根据系统调用号跳转到相应的系统调 用处理函数。而系统中所有的系统处理函数分布在任务管理模块和文件i o 系统 中。系统调用作为中断服务程序存在,分配到的中断号为o x 8 0 ,调用号统一存 放在e a x 寄存器中,最多3 个参数,分别存放在e b x ,c c x ,e d x 中。如果参数多于 3 个,可以考虑传递参数表的地址。返回值存放在e a x 寄存器中。一般来说,系 统调用成功完成将返回0 或正值,调用失败则返回错误号的相反数( 负值) 。 系统调用将使普通程序转入内核态运行,将导致堆栈的切换。系统中采用寄 存器传递参数,这种方式简单明了,降低了堆栈切换的复杂性。所有的系统调用 遵循统一的流程,如图2 2 。由图可见系统调用请求处理完成后,系统还会试着 运行任务调度程序和处理信号。 2 3 中断系统 调罨号台涪? 图2 2 系统调用处理流程 l i n u xo 1 1 系统使用的中断大致可以分为3 类:( 1 ) 血t e l 公司定义的异常辨, 第二章内核整体概述 中断号0 x 0 0 - 0 x l f o 对于这类的大多异常,内核只是结束发生异常的任务,而不 能从错误中恢复;内核充分利用了内存页访问异常( 0 x o e ) 实现了需求加载技术和 写时复制技术。( 2 ) 硬件中断,内核对支持的i o 设备对应的中断进行了处理。( 3 ) 服务程序,内核只利用了i 1 1 to x 8 0 来作为系统调用服务入口。表2 - 1 归纳出内核 对各中断的处理情况: 表2 1l i n u x0 1 1 系统的中断系统 中断号说明 l i n u x0 1 1 中的处理 0 x 0 0 - - - o x 0 2 i n t e l 定义的异常结束发生异常的任务,并显示出错信息 0 x 0 3 由断点指令产生显示c p u 状态信息。包括各寄存器的值、当前执行的指 令。然后正常返回 0 x 0 4 0 x 0 6 i n t e l 定义的异常结束发生异常的任务,并显示出错信息 o x 0 7 协处理器不存在模拟协处理器或者根据任务结构信息中保存的协处理器 状态来恢复协处理器状态。然后试着调用信号处理函数 0 x 0 8 0 x o d i n t e l 定义的异常结束发生异常的任务,并显示出错信息 o x o e 内存贞访问出错若为页不存在引起则实现需求加载技术;若由内存页写 保护引起则实现写时复制技术。 o x o f i n t e l 保留的未定结束发生异常的任务,并显示出错信息 义异常 o x l 0 协处理指令执行向使用协处理器的任务发送协处理错误信号。然后试着 错误 调用信号处理函数。 o x l l - o x l f i n t e l 保留的未定结束发生异常的任务,并显示出错信息 义异常 0 x 2 0 时间中断 调用时问处理函数d o _ t i m e r 0 o x 2 1 键盘中断调用键盘驱动程序中相应的键盘中断处理函数从而读取 键盘扫描码并做进二步的转换映射处理。 0 x 2 2 未用结束当前任务,并显示错误信息。 0 x 2 3 串口1 中断调用串行终端驱动程序中相应功能进行数据收发等处 理。 0 x 2 4 串口2 中断同上 o x 2 5未用 结束当前任务,并显示错误信息。 0 x 2 6 软盘中断调用软盘驱动程序中相席程序进行数据处理。 o x 2 7 打f t j o l 端口中断未实现打印功能,因此仅发送相应的e o i 指令,然后返 回。 0 x 2 8 0 x 2 c未用 结束当前任务,并显示错误信息。 0 x 2 d 协处理完成完成一j ! h ;预处理工作,然后做与i n t0 x 1 0 同样的处理。 0 x 2 e 硬盘中断调用硬盘驱动程序中相应程序进行数据处理。 0 x 2 f 0 x 3 0 未用结束当前任务,并显示错误信息。 0 x 3 l o x 7 f 未用输出“u l l k t l o w l am t e r r u p t k n r ”信息,然后返回。 0 x 8 0 系统调用根据调用号调用相应的系统调用处理程序。然后检查当 前任务状态,若需要等待则转入调度程序。若当前任务 可继续运行或者本任务下次被调度选中,则处理本任务 的信号。 0 x 8l - - 0 x f f 未用输出“u n k n o w l li n t e r r u p t n k r ”信息,然后返回。 第一章内核整体概述 2 4 本章小结 本章首先分析了l i n u xo 1 1 内核的整体结构,将其划分为5 个大的组成部分: 系统调用接口、设备i o 子系统、文件i o 子系统、主内存管理模块以及任务管 理模块。然后介绍了l i n u xo ,i i 的系统调用接口是如何组织的。最后总结与归纳 了整个内核各个部分使用的中断。 第三章设备i o 子系统研究与实践 第三章设备i o 子系统研究与实践 该子系统实现系统输入输出设备的驱动与管理。由3 个模块组成:块设备驱 动模块、终端设备驱动模块和缓冲块管理模块。块设备驱动模块负责驱动块设备, 提供对块设备访问的统一接口。系统中支持的块设备包括:硬盘设备、软盘设备 和虚拟内存盘设备。每类块设备都有独自的驱动程序,分别在各子模块中实现。 3 1 设备号体系 下面先说明几个概念: 【块设备】:以块为单位存取的设备,l i n u x0 1 1 系统中一块含1 0 2 4 字节数据。 字符设备】:以字符为单位存取的设备,可以看作字符流设备【9 1 。 设备号】:是操作系统唯一确定硬件设备的号码。l i n u x0 1 1 使用的设备号 由2 字节整数组成。 主设备号】:设备号的高字节即为设备的主设备掣1 0 】,。 【从设备号】:设备号的低字节即为设备的从设备号。 系统中对主设备号分配如表3 - 1 : 表3 - 1 主设备号表 主设备号类型说明l i n u x0 1 1 支持的设备 0 无用无 l 块字符内存设备( 如虚拟内存盘)内存虚拟盘 2 块软盘设备 软盘o 软盘3 3 块硬盘设备 i d e 硬盘0 i d e 硬盘i 4 字符 终端( 标准的、串行的或虚拟的) 标准终端、串口1 终端、串 口2 终端 5 字符特指连在本进程的终端 支持 6 字符打印机设备 不支持 对于不支持的设备,l i n u x0 1 1 中仍留有访问接口,只是在访问这些设备时, 简单地返回相应的错误号。 【盘号】:对于块设备而言,有盘号概念;对于内存块设备,其盘号就是从设 备号。对于软盘设备,其从设备号中含有软盘类型信息:从设备号= 4 x 类型号+ 盘号。而由于可以对硬盘进行分区,其盘号和从设备号也不等价,对于硬盘设备 有:从设备号= 5x 盘号+ 分区号( 分区号为0 表示整个硬盘,否则表示对应的分区) 。 第三章设备i 0 子系统研究与实践 【分区号】:由于一块硬盘可以被划分为4 个分区,每个分区的编号叫做分 区号。 表3 2 列出l i n u x0 1 1 系统中支持的所有设备及其设备号,表3 3 列出l i n u x 0 1 l 中不支持,但留有接口的设备及其设备号。 表3 - 2l i n u x0 1 1 支持的所有设备 设各号设备设备号设备 o x o l 0 0 内存虚拟盘 0 x 0 3 0 4 第0 块硬盘4 分区 o x 0 2 l c 第0 块1 4 4 m 软盘 0 x 0 3 0 5 第l 块硬盘 o x 0 2 l d 第1 块1 4 4 m 软盘 0 x 0 3 0 6 第1 块硬盘1 分区 o x 0 2 l e 第2 块1 4 4 m 软盘 0 x 0 3 0 7 第1 块硬盘2 分区 o x 0 2 l f 第3 块1 4 4 m 软盘 0 x 0 3 0 8 第1 块硬盘3 分区 o x 0 3 0 0 第0 块硬盘 0 x 0 3 0 9 第l 块硬盘4 分区 o x 0 3 0 l 第0 块硬盘1 分区 0 x 0 4 0 0 标准终端 o x 0 3 0 2 第0 块硬盘2 分区 0 x 0 4 0 l 串口1 终端 o ) 0 3 0 3 第0 块硬盘3 分区 0 x 0 4 0 2 串口2 终端 表3 - 3 不支持但留有接口的设备 设备号设备说明 o x 0 4 0 0 内存字符设备普通内存空间作为字符设备使用 o x 0 4 0 l 内存字符设备物理内存空间作为字符设备使用 0 x 0 4 0 2 内存字符设备内核虚拟内存空间作为字符设备使用 o x 0 4 0 3 空字符设备概念上的设备。读不出,可写任意数据,但不保存。 0 x 0 4 0 4 端口字符设备i 0 端口空间作为字符设备使用 3 2 块设备驱动模块 该模块下属的子模块有:硬盘驱动子模块、虚拟内存盘子模块、软盘驱动子 模块。该模块实现对下属模块一定的管理逻辑,并通过调用下属模块提供的接口 完成块设备的驱动。 1 相关代码分布 某些相关的数据结构定义在k e m e l b l kd e v b l k h 中;实现逻辑全部在 k e m e l b l kd e v u1 - wb l k c 中。 2 相关数据结构 ( 1 ) 读写请求表 s t r u c tr e q u e s t i n td e v ;使用的设备号。 i n te m d :命令( r e a d 或w r i t e ) 。 i n te r r o r s :错误时重试次数。 u n s i g n e d1 0 n gs e c t o r :起始扇区。( 1 块= 2 扇区) u n s i g n e dl o n gn r _ s e c t o r s :读写扇区数。 c h a r 宰b u f f e r :数据缓冲区。 s t r u e tt a s k _ s t r u c t 木w a i t i n g :任务等待操作执行完成的地方。 第三章设备i o 子系统研究与实践 s t r u c tb u f f e r h e a d 木b h :缓冲区头指针。 s t r u c tr e q u e s t 木n e x t :指向f 一请求项。 j : s t r u c tr e q u e s tr e q u e s t n r _ r e q u e s t :木n r r e q u e s t 被定义为3 2 * 其中的d e v , s e c t o r , n r 字段用于确定从哪个设备的哪个位置读写几个扇sectors 区的数据。b u f f e r 字段指明内存中等待写盘的数据或者指明读出数据的存放位置。 该读写请求表将用于建立3 个读写请求队列:硬盘读写请求队列,软盘读写请求 对列和虚拟内存盘读写请求队列。参见实现原理。 ( 2 ) 块设备表 s t r u c tb l k d e v s t r u c t v o i d ( * r e q u e s t f n ) ( v o i d ) :请求操作的函数指针。 s t r u c tr e q u e s t ,i cc u r r e n t r e q u e s t :请求信息结构。 : s t r u c tb l k d e v s t r u c tb l k d e v n r b l k d e v = ( n u l l n u l l ,宰0 一无设备。木 【n u l l ,n u l l ) ,al 一虚拟内存盘车 n u l l ,n u l l ) ,序2 一软驱设备。丰 n l l l 。n u l l ) ,木3 一硬盘设备。木 n u l l ,n u l l ) ,木从不使用术 n u l l ,n u l l ) ,木从不使用木 n u l l ,n u l l )掌从不使用宰 ) : 该表存放系统安装的块设备,实际上系统只使用了3 种块设备。为了使块 设备在表中的位置与其主设备号对应,因此该表设7 行。多于的行留空不用。该 表在初始化过程中将被初始化成如下形式: n u l l n u l l ,传0 一无设备。宰 d 0 一r d r e q u e s t ,n u l l 】, 宰l 虚拟内存盘木 ( d 0 一f d r e q u e s t ,n u l l ) , 序2 软驱设备。j i c d o f dr e q u e s t ,n u l l ) ,序3 硬盘设备。宰 n u l l ,n u l l ,a 从不使用幸 n u l l ,n u l l ,木从不使用宰 n u l l ,n u l l )序从不使用冰 结合读写请求表与块设备表可以构成如图3 1 的数据结构:对应3 个块设备 的3 个读写请求队列。 第三章设备i 0 子系统研究与实践 内存虚拟盘 软盘 硬盘 请求项数组( 3 2 项) 图3 1 块设备读写谓求队列 ( 3 ) 引用的数据结构 该模块会访问缓冲管理模块中提供的缓冲块头结构,缓冲块头结构中提供 了读写请求对应的设备号,以及读写数据在内存中存放的位置。参见缓冲管理模 块。 3 实现原理 如图3 - 2 所示,1 1r wb l o c k o 函数根据参数中的信息创建请求项并插入到相应 的请求队列中,该函数的参数b h 中带有请求的设备号信息,根据设备号以及块 设备表可以判定创建的请求项应插入的队列;如果该请求项成为请求队列中的第 一项,则还要调用相应的请求函数。请求函数是对应块设备驱动子模块提供的请 求处理函数。请求函数就像一个触发器,触发相应驱动子模块开始处理请求项。 只有所有请求项处理完毕后才需要新的一次触发。因此新的请求项不是队列中的 第一项,说明驱动子模块正在逐个处理请求,无需触发,即无需调用请求函数。 第三章设备i o 子系统研究与实践 图3 - 2 块设备请求项处理流程 ur wb l o c k ( ) 函数是异步函数,它所调用的下属服务函数都不会等待读写操 作实际完成就会返回。提出请求的任务发现需要的数据未被更新就会阻塞,直到 实际读写完成后才被通知,从而再次接着运行。 4 提供的调用接口 ( a ) 初始化时的调用接口为: v o i db l k d e v i n i t ( v o i d ) ; 完成对读写请求表的初始化,即置空所有表项。 f b ) 运行时调用接口只有一个: v o i d1 1 一r w b l o c k ( i n tr w ,s t r u c tb u f f e r h e a d 宰b h ) ; 参数:r w :r e a d 、r e a d a 、w r i t e 或w r i t e a 命令。 b h : 数据缓冲块头指针。 功能:把b h 指定的缓冲块中数据写入块设备,或从块设备中读出数据写到 指定的缓冲块。 说明:1 ) :r e a d 、w r i t e 分别为读写命令;r e a d a 、w r i t e a 分别为预 读、预写命令。调用者并不要求预读、预写命令必须完成,在某些不利情形下( 如 请求队列满) 可以忽略预读、预写命令。2 ) :缓冲头结构中有足够的信息指明读 写数据的位置:块设备号,读写的块号,缓冲区内存地址。参见缓冲管理模块。 3 2 1 硬盘驱动子模块 该模块负责与硬盘控制器硬件进行交互。接受上层模块发出的数据块读写请 求,发送读写命令,处理硬盘中断,在适当的时机在缓冲区与控制器数据端口之 间进行数据传送。 1 相关代码分布 硬盘参数检测的代码在b o o t s e t u p s 中;某些相关的数据结构定义在 k e m e l b l kd e v b l k ,h 中;初始化代码和实现逻辑全部在k e m e l b l kd e v h d c 中。 第三章设备i o 子系统研究与实践 2 相关数据结构 ( 1 ) 硬盘信息表 s t r u c th d i s t r u c t i n th e a d ,s e c t ,c y l ,w p c o m ,1 z o n e ,c t l : 丰这6 个字段分别指某块硬盘的磁头数、扇区数、柱面数、写前预补偿柱面号、磁头着陆 区柱面号、控制字节车 : s t r u c th d i s t r u c th d i n f o 3 = 0 ,0 ,0 ,0 ,0 ,o ) ,i o ,0 ,0 ,0 ,0 ,0 ) ; 此处定义一个2 行的硬盘信息表,因此系统最多支持2 块硬盘。 ( 2 ) 分区信息表 s t a t i cs t r u c th ds t r u c t l o n gs t a r t s e c t : l o n gn r s e c t s : ) h d 5 * m a x 一曲 = “0 ,o ) ,) : 分区信息表给出每个分区从硬盘0 道开始算起的起始扇区号和分区扇区总 数。其中5 的倍数处的项代表整个硬盘的参数。h d 的值被定义成2 ,因 此系统最多支持2 块硬盘。 硬盘分区表和分区信息表在系统初始化过程中根据检测到的硬盘参数进行 设置。在发送读写命令时会用到这些参数。 ( 3 ) 引用的数据结构 该子模块会访问块设备驱动模块中的读写请求队列,当然只是访问硬盘读写 请求队列。初始化时该某块也会访问块设备驱动模块中的块设备表,以填入硬盘 设备的读写请求函数。参见块设备驱动模块的数据结构部分。 3 实现原理 如图3 3 所示,请求函数被调用后,立即检查请求队列中是否有请求项。如 果有就取走对头的请求项,解析成读写命令发送给硬盘控制器,然后立即返回。 如果没有要处理的请求项了则立即返回。硬盘控制器处理完读写命令后将引发硬 盘中断,被系统捕获到后作进一步处理。 第三章设备i o 子系统研究与实践 图3 - 3 硬盘驱动处理请求项的流程 这个过程反映在时序副1 】【1 1 1 里面如图3 _ 4 : 时 间 匪圈 执行程序硬盘控制嚣 臣函 执行程序硬盘控制器 圈处理请求项 团中断处理过程 匡i 控制器处理 k _ 一写命令 卜读状态 囫传写数据 奁传读数据 图3 - 4 硬盘读写操作时序图 4 提供的调用接口 ( a ) 初始化时的调用接口有: i n ts y s s e t u p ( v o i d 木b 1 0 s ) ; 参数:b i o s :它指向一块内存地址,那里存放有系统引导启动初期利用b i o s 调用取得的硬盘信息。 功能:初始化硬盘信息表,初始化分区信息表。 v o i dh di n i t ( v o i d ) : 功能:将硬盘读写请求函数填入块设备驱动某块中块设备表对应表项中然后 第三章设备i o 子系统研究与实践 开启硬盘中断。 ( b ) 运行时调用接口只有一个: v o i dd o h d r e q u e s t ( v o i d ) 功能:触发本模块逐个处理硬盘读写请求队列中的请求项。请求项中有足够 的信息描述数据读写操作的参数。该函数发送完读写命令后立即返回调用者。 3 2 2 虚拟内存盘驱动子模块 所谓虚拟内存盘就是将一片连续的内存区域虚拟成块设备来使用。l i n u x0 1 1 中规定一个数据块占1 k b ( 1 0 2 4 字节) ,对于硬盘和软盘就相当于2 个扇区,对于 虚拟内存盘,就相当于1 k b 连续内存,因此5 1 2 k b 的连续内存区域就可以存放 5 1 2 块数据亦即可以当成具有1 0 2 4 个扇区的硬盘来使用。 该模块利用对内存的直接访问来存取数据,将对内存的访问操作模拟成对块 设备的操作,在上层看来是在访问块设备,实际上是在存取内存中的数据。该模 块逻辑相对简单,可以理解为:将块设备操作“翻译”成对内存的直接访问。 虚拟内存盘是“访问很快的块设备”,当然以消耗内存为代价,并且断电数 据即丢失。 1 相关代码分布 某些相关的数据结构定义在k e m e l b l kd e v b l k h 中:初始化代码和实现逻辑 全部在k e r n e l b l kd e v r a m d i s k c 中。 2 相关数据结构 ( 1 ) 所占内存区位置及大小参数 c h a r * r d s t a r t :虚拟盘在内存中的起始位置。 i n tr d l e n g t h = 0 :虚拟盘所占内存火小( 字节) 。 该子模块必须明确用来虚拟块设备的内存区的位置和大小。所管理的内存区 如图3 5 。 f r 一 - r _ n - 厂y n 、 燕i 霎| 隧鋈阎惑心然潍鞠懑溪溪缀熬鬟囊| | | 鏊溺垂l r ds t a z tr dl e n g t h 图3 - 5 虚拟盘内存区的位置示意图 ( 2 ) 引用的数据结构 该子模块会访问块设备驱动模块中的读写请求队列,当然只是访问虚拟内存 第三章设备i o 子系统研究与实践 盘读写请求队列。初始化时该某块也会访问块设备驱动模块中的块设备表,以填 入虚拟内存盘设备的读写请求函数。参见块设备驱动模块的数据结构部分。 3 实现原理 该子模块的原理非常简单,请求函数被调用后,立即检查请求队列中是否有 请求项。如果有就取走对头的请求项,根据请求项中的读写扇区位置和扇区数转 换为相应的内存地址,然后完成数据复制操作,接着循环检查请求项,直到所有 请求项都被处理完成。 4 提供的调用接口 ( a ) 初始化时的调用接口有: v o i dr d _ i n i t ( v o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论