Linux操作系统内核实习
作者 : (美)Gary Nutt
译者 : 潘登 冯锐 陆丽娜 等
丛书名 : 计算机科学丛书
出版日期 : 2002-01-01
ISBN : 7-111-09181-7
定价 : 29.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 184
开本 : 16开
原书名 : Kernel Projects For Linux
原出版社:
属性分类: 教材
包含CD :
绝版 :
图书简介

本书是一本传统操作系统教材的配套实验室教材。本书共分两部分:第一部分展示了Linux设计的概况,对Linux环境的运行时组织和进程、文件及设备管理等主题提供了分析;第二部分通过12个练习探讨了操作系统内部结构的各个方面,内容涉及Shell编程、内核模块、系统调用、虚拟存储、文件系统、文件I/O等,从而帮助读者开发自己的Linux内核函数和数据结构,使读者在实验室中真正了解理论概念是如何在Linux 中得到实现的。
  本书可供计算机专业本科生使用,也是教师的辅导用书。附带光盘中的Linux源代码为读者的学习和使用提供了便利。

图书前言

致学生
  经验表明学习一种操作系统(OS)如何工作的最好方式是对它进行实验,去阅读、修改和增强它的代码。但由于其本质,操作系统软件必须细心地构建,因为它直接控制所有运行于其上的进程和线程所使用的硬件。这样,对操作系统代码进行实验可能是十分困难的,操作系统的一个实验版本可能会损坏测试机器。本书向你提供了一个以尽量小的危险研究Linux内核的学习方法。通过这种方法学习Linux内核,你也可以培养一种学习和实验其他内核的技巧。本书将这种学习方法设计为一组分级的练习。首先,学习在不修改任何代码的情况下检查操作系统内部状态的各个方面。第二,通过编写新的代码来阅读(而不是编写)内核数据结构。第三,重新实现现存的数据结构。最后,设计和添加自己的函数和数据结构到Linux内核。
  Linux内核是用C程序设计语言编写的。所以在研究内核之前,需要对使用C比较熟悉。如果知道C++,那么在理解源代码上将不会有什么困难,尽管在添加或修改内核的部分代码时将无法使用对象。
  本书设计为一本普通操作系统教材的配套教材。它包含两个部分,第一部分提供Linux设计的概况。如果是初学这一门操作系统课程时使用本书,你可能会发现第一部分讨论的几个话题对你是全新的。但是,用它们进行工作会使你知道Linux是如何构建的。这一部分给出了大的总体的描述但没有太多细节,以后在进行练习需要复习时可回到第一部分。
  第二部分包括一组帮助你使用Linux的实验室练习。每一个练习都是包含以下部分的自包含单元:
  ●介绍
  ●问题陈述
  ●解决问题
  练习将普遍概念与Linux细节联系起来。每个练习都以一个解释Linux概念和练习相关细节的介绍开始。介绍说明了在课堂和书本上学到的一般概念在Linux中是如何实现的。练习的下一部分提出了将要解决的问题,它包括需要用于解决问题的详细的Linux相关信息。有时,在钻研细节之前快速复习一下第一部分中的相关内容,将有助于设计练习的方案。
  你所在学校的实验室可能已经建设成为一个Linux实验室。当你在进行本书中的大多数练习时,实验室管理员将向你提供一份Linux源代码的拷贝和超级用户权限,以创建操作系统的新版本。请不要滥用你作为超级用户的权限。你需要这个特权来修改内核,但一定不能把它用于其他目的。本书包括一张光盘,它包含了Linux的源代码,你可以用来在自己的计算机上安装Linux。
  祝你的操作系统学习充满好运,我希望本书成为你探索Linux操作系统概念的一个有用工具。

致教师
  今天,抽象是大多数在教室和实践中书写的软件的基础。教导学生根据对象、组件、线程、消息等等来考虑软件的解决方案,这种观点使得他们借助硬件的力量来解决日益繁杂的任务。通过这种方法,他们在重用低层抽象的同时减少了编程时间。在所有这些抽象的最底层是操作系统—进程和资源(有时是线程)。应用软件和中间件使用这些操作系统抽象来创建它们自己较高层次的抽象,包括从记账程序包、电子表格和导弹跟踪程序到视窗、数据库、对象、组件、消息和连续媒体流。
  这种大量使用抽象的趋势使得一些人认为操作系统不再值得仔细研究,因为它们在很大程度上对工作在较高抽象层次上的程序员来说是透明的。但是,操作系统仍是十分基础的,因为它的设计和实现是所有其他抽象设计和实现的基础。程序员如果理解操作系统是如何工作的,他们就能够编写出更好的中间件和应用程序。此外,仍然需要理解基本操作系统技术的人员,无论他们是为新设备编写驱动程序、创建新的微内核服务器,还是提供能够高效处理发展需求(如连续媒体)的新系统。
  通常情况下,一位操作系统教师必须决定操作系统课程是应集中于问题和理论,还是为学生提供一个能够对操作系统代码进行实验的环境。1991年(和2001年草案)的IEEE/ACM本科课程建议描述了一门花费大量时间在各种问题上的课程,但同时也包括了一个重要的实验室部分。虽然这个趋势是以概念性材料作为课程的基础,但学生和教师似乎都同意实际经验在学习操作系统过程中是极为重要的。许多课程试图遵照IEEE/ACM的指示,将一门课程划分为课堂和实验室两个部分,课堂部分集中于问题和理论,而实验室部分提供一些实际的动手练习。
  IEEE/ACM建议支持实验室部分应使得学生学会如何使用操作系统机制的观点,尤其是学会将操作系统应用程序编程接口(API)作为主要的实验机制。这种方法背后的基本原理是,在学生能够真正理解如何设计一个操作系统之前,他们必须学习如何使用一种操作系统。这一原理促成了一本有关通过Win32 API进行Windows NT编程[Nutt,1999]以及一本有关实验室练习[Nutt,2000]的参考书的产生。
  但是,后来在1998年由Addison Wesley对78所大学所进行的调查中,43所表明他们在介绍性的操作系统课程中讲授了操作系统内部结构。在这43所大学中,26所使用了UNIX的一个版本作为目标操作系统,其中13所使用了Linux,10所使用了未指明版本的UNIX,3所使用了MINIX。8所大学说他们使用了其他的操作系统作为主题系统(例如Nachos),剩下的9所没有指明他们所使用的操作系统。调查清晰地显示,尽管有IEEE/ACM建议的存在以及概念性操作系统教材的大量使用,教育界仍有很大一部分将操作系统内部结构作为介绍性操作系统课程内容的一部分讲授。它还显示,大多数这些课程使用两种教材:一本传统的操作系统理论教材(例如,[Siberschatz and Galvin,1998]或者[Nutt,2000])和一本参考教材(例如,[Stevens,1993]、[McKusick,et al.,1996],或者[Beck,et al.,1998])。当然,一个学期的本科课程是不可能覆盖一本理论教材与一本描述整个操作系统的教材的所有内容。缺乏一本好的实验室手册迫使教师让学生购买一本补充教材,而它所包含的内容比学生在一个学期内有时间学习的内容要多得多。另外,教师也不得不学习两本教材中的所有内容,学习主题操作系统,设计一组合适的练习,并且通过操作系统参考资料提供某种形式的指导,以便学生能够完成练习。
  这本教材是一本Linux内部结构练习的实验室手册。它通过提供一组与Linux内部结构有关的特定练习作为对一本操作系统理论教材的补充,这些练习解释了理论概念是如何在Linux中得到实现的。教师不需要变成一位精通Linux内核的专家或者自己设计一组练习(无论提供对实验的全部文档或者只是提供对补充参考教材中适当部分的提示)。相反,教师、实验室助理和学生可以把本书作为一个背景数据和练习的自包含源来使用以研究概念如何实现。所以,这本不铺张的实验室手册取代了一本普通的参考教材,同时提供了一组内核内部结构练习的集中信息。对于想了解超出练习要求之外相关信息的学生,练习的背景内容提供了有关参考书籍(和文献)方面的指示。
  一学期的操作系统课程包含15周的课程内容。根据我的经验,大多本科学生在少于一周半到两周的时间里做大量编程练习是有困难的。这意味着在一学期中学生能完成大约6~8个编程作业。本书提供了足够的练习,你可以从中选取最适合学生背景和你喜好的一部分。大部分练习都包括用以在各个学期之间调整的部分(以此减小使用前面几个学期公共解答的可能性)。如前所述,我的意图是不断发行本书的更新版本。我希望新的版本将会有需要新解答的新练习。
  同时提供的还有对各个练习的一个解答。因此可以选择更难的练习,而且在必要时可以分发未在本书中公布的部分解答。
  这些练习中没有一个与从头建立一个新的内核一样困难。相反,它们强调让学生通过修改和扩充Linux内核的部件来对它进行研究。第一部分比较简单,而且背景材料较为全面。后面的练习在难度上有所增加,同时减少了提示信息的数量。练习一和二通常需要一周或更少的时间来完成,但是最后三个练习可能每个需要两周的时间。如果你的学生在C编程方面需要额外的实践,你可以谨慎地考虑使用练习一和二作为指导。这可能需要你提供一些额外的提示,尤其是练习二的补充材料。

Linux的CD-ROM版
  对任何一个操作系统的实际动手研究都必须针对一个特定版本的操作系统。随着Linux的迅速发展,到本书出版之际版本2.2.x将会被淘汰。为了避免本书与操作系统代码不同步的问题,我已经采用了版本2.2.14的源代码。本书的第1版最先是为版本2.0.36所编写的。随后,在它进入发行周期的前夕,针对版本2.2.12的Linux进行了更新。当本书即将被印刷时,我发现只有版本2.2.14(而不是2.2.12)可以随本书分发。在版本2.2.12和2.2.14之间存在细小的差别—通常在于编码方式而非内容。但是,这些差别会表现在一些练习中,尤其要在虚拟存储和调度程序的内核代码部分注意它们。在下一版中我将会改正这些错误。我认为包含一张版本2.2.14的安装盘要比不带任何光盘的手册更好。虽然当在使用本教材时可以得到更新版本的源代码,但是我建议你在实验室的机器上安装这个版本,以便你的学生有一个与本书一致的合理的软件环境。我最大的希望是能够大致跟随Linux的发行而不断发行本书的新版本,下一版可能会使用例如版本2.6.x。

致谢
  本书是我和其他人多年学习Linux的结果。我从科罗拉多大学操作系统课程的助教们的帮助、见解和奉献中获益匪浅,他们是:Don Lindsay、Sam Siewert、Ann Root和Jason Casmira。Phil Levis提供了有关Linux和练习的生动有趣的讨论。当我第一次在一台机器上安装Linux时,它虽然能够工作但不如Adam Griff调试安装后运行得那样畅快。
  许多练习都来自于科罗拉多大学本科和研究生操作系统课程的实习和练习。尤其是练习三由Sam Siewert在1996年春季为计算机科学课程而设计。练习四从Sam Siewert设计的另一个练习中取得了一些材料。练习九来自Jason Casmira在1998年秋季为研究生操作系统课程所做的一个课程实习。练习十首先由Don Lindsay在1995年秋季设计,后来由Sam Siewert在1996年春季修改。练习一也出现在我的配套操作系统课本[Nutt,2000]中,练习二是出现在那本书中的另外一个练习的延伸。练习十一和十二与出现在我的另一本手册中的Windows NT练习类似,而Norman Ramsey设计了最初的Windows NT练习。
  许多评论家对原始书稿进行了审查,使得本书更加完美。Richard Guy在UCLA的一门课程中使用了本手稿的第一次公开书稿。Paul Stelling (UCLA)仔细审阅了书稿,纠正了其中的错误并对它好的和不好的方面提出了见解。Simon Gray(Ashland大学)对练习提出了非常明晰和深刻的意见。以下各位也提出了有帮助的意见,使得本书质量得到了极大的提高:John Barr(Ithaca学院)、David Binger(中心学院)、David E. Boddy(奥克兰大学)、Richard Chapman(Auburn大学)、Sorin Draghici(Wayne州立大学)、Sandeep Gupta(科罗拉多州立大学)、Mark Holliday(西卡罗莱纳大学)、Kevin Jeffy(北卡罗莱纳大学Chapel Hill分校)、Joseph J. Pfeiffer(新墨西哥州立大学)、Kenneth A.Reek(Rochester技术研究院)和Henning Schulzrinne(哥伦比亚大学)。
  Addison Wesley公司在准备本书过程中提供了极大的帮助。Molly Taylor和Jason Miranda在处理评论和前期开发其他支持方面提供了广泛的援助。Lisa Hogue用了一天的时间来找到可以随书分发的Linux源代码版本。Laura Michaels在文字编辑过程中付出了她一贯辛勤的劳动,Gina Hagen在生产方面提供了帮助,Helen Reebenacker是生产编辑。最后,但并非最次要,选书编辑Maite Suarez Rivas认识到对本书的需求并大力促成了本书的出版。
  所有这些人们的帮助促成了本书的诞生,当然,任何错误都应该归咎于我的责任。

Gary Nutt
于Boulder,科罗拉多

作者简介

(美)Gary Nutt:Gary Nutt: Gary Nutt于1972年获得科罗拉多大学博士学位。之后,曾在施乐公司及贝尔实验室等多家公司工作过。1986年重回科罗拉多大学从事研发与教学。目前是该校计算机科学系教授以及Inktomi公司的首席科学家。他的研究领域主要集中在分布式系统,包括:操作系统、分布式程序设计。分布式虚拟机、存储系统、小型无线局域网络等。曾著有"Kernel Projects for Linux"。

译者简介

潘登 冯锐 陆丽娜 等:暂无简介

译者序

Linux在近年得到了巨大的发展,它以低廉的价格和稳定的性能在操作系统市场上成为Windows强有力的竞争对手。并且Linux的全部源代码免费公开,爱好者可以按照自己的需要自由修改、复制和发布程序的源代码。Linux的这个特点使得它对于计算机教学和科研具有重要意义。
  目前国内的操作系统课程设置过多地偏重于理论学习,对动手实践重视不够或者根本没有涉及。学生普遍反映无法对实际操作系统有一个真正彻底的了解,所学知识停留于表面,不能解决实际问题。美国Colorado大学Boulder分校的Gray Nutt教授编写本书的目的正是为了解决这个问题,书中以Linux内核结构为基础设计了12个互相联系又各有侧重的练习,学生通过完成这些练习可以深入到实际操作系统的内部结构,将理论与实际联系起来。
  本书分为两部分。第一部分提供一个Linux的概况,介绍与Linux相关的操作系统概念和理论。第二部分是全书的重点,由12个练习组成,这些练习按难度由浅到深组织,几乎涵盖了Linux内核的各个方面。每个练习由介绍、问题陈述、解决问题和组织方案等几部分组成。通过对这些练习进行学习和动手实践,能够将操作系统的经典理论与其在Linux中的具体实现联系起来,能够更深入地掌握Linux的内核结构,从而达到充分理解操作系统理论知识的目的。
  全书由潘登、冯锐翻译,陆丽娜教授审校。由于译者水平有限,难免存在不妥的地方,尤其是一些新的技术术语,在译法上可能与其他文献有所不同,我们力求译文正确反映实际含义又符合中文习惯。若有不当之处,希望广大读者能够提出宝贵意见。

译者
西安交通大学电信学院计算机技术与科学系
2001年6月

图书目录

第一部分  Linux概况
1  Linux的演变 1
2  通用内核职责 4
2.1  资源抽象 4
2.2  共享资源 5
2.2.1  管理对资源的竞争 5
2.2.2  资源的独占使用 6
2.2.3  有控制的共享 6
2.3  操作系统的功能划分 7
3  内核的组织结构 8
3.1  中断 8
3.2  使用内核服务 10
3.3  串行执行 12
3.4  守护进程 13
3.5  引导过程 13
3.5.1  引导扇区 13
3.5.2  启动内核 14
3.6  登录到机器 15
3.7  机器中的控制流 16
4  进程与资源管理 17
4.1  运行进程管理程序 18
4.1.1  系统调用 18
4.1.2  中断 19
4.2  创建新任务 19
4.3  调度程序 20
4.4  进程间通信与同步机制 20
4.5  保护机制 21
5  存储管理 22
5.1  管理虚拟地址空间 22
5.2  辅助存储 23
5.3  缺页处理 23
5.4  地址变换 24
6  设备管理 26
6.1  设备驱动程序 27
6.2  处理中断 28
7  文件管理 29
7.1  装载文件系统 30
7.2  打开文件 31
7.3  读写文件 32
7.4  Ext2文件系统 33
8  了解Linux的更多信息 36
第二部分  练   习
练习一  观察Linux行为 38
1.1  介绍 38
1.2  问题陈述 40
1.2.1  部分A 40
1.2.2  部分B 41
1.2.3  部分C 41
1.2.4  部分D 41
1.3  解决问题 42
1.3.1  /proc文件系统 42
1.3.2  使用argc和argv 42
1.3.3  组织方案 44
1.3.4  将工作保存在共享实验室 45
练习二  Shell编程 46
2.1  介绍 46
2.1.1  基本UNIX风格的shell操作 47
2.1.2  将进程放在后台 49
2.1.3  I/O重定向 49
2.1.4  shell管道 50
2.1.5  读取多个输入流 52
2.2  问题陈述 53
2.2.1  部分A 53
2.2.2  部分B 53
2.2.3  部分C 53
2.3  解决问题 54
2.3.1  组织方案 54
2.3.2  部分A 54
2.3.3  部分B和C 56
练习三  内核定时器 57
3.1  介绍 57
3.1.1  内核如何维护时间 57
3.1.2  每进程定时器 58
3.2  问题陈述 60
3.2.1  部分A 60
3.2.2  部分B 60
3.2.3  部分C 60
3.3  解决问题 61
3.3.1  Linux源代码组织结构 61
3.3.2  信号 62
3.3.3  组织方案 63
练习四  内核模块 66
4.1  介绍 66
4.1.1  模块组织结构 66
4.1.2  模块的装载与卸载 69
4.2  问题陈述 70
4.3  解决问题 70
4.3.1  read()过程 70
4.3.2  文件结束(EOF)条件 71
4.3.3  编译模块 71
4.3.4  装载和卸载模块 71
4.3.5  时钟精度问题 71
4.3.6  更多帮助 71
练习五  系统调用 72
5.1  介绍 72
5.1.1  系统调用链 72
5.1.2  定义系统调用编号 73
5.1.3  生成系统调用stub 74
5.1.4  内核函数组织结构 75
5.1.5  引用用户空间内存地址 76
5.2  问题陈述 76
5.2.1  部分A 76
5.2.2  部分B 76
5.3  解决问题 77
5.3.1  内核printk()函数 77
5.3.2  组织方案 77
5.3.3  重建内核 78
5.3.4  留下一个干净的环境 79
练习六  共享内存 80
6.1  介绍 80
6.1.1  共享内存API 80
6.1.2  实现 83
6.2  问题陈述 88
6.3  解决问题 88
练习七  虚拟存储 90
7.1  介绍 90
7.1.1  虚拟地址空间 91
7.1.2  虚拟存储区 93
7.1.3  地址变换 94
7.1.4  缺页处理程序 94
7.1.5  主存分配 97
7.2  问题陈述 97
7.2.1  部分A 97
7.2.2  部分B 97
7.3  解决问题 97
练习八  同步机制 98
8.1  介绍 98
8.1.1  阻塞任务 98
8.1.2  等待队列 99
8.1.3  使用等待队列 100
8.2  问题陈述 102
8.2.1  部分A 102
8.2.2  部分B 103
8.3  解决问题 103
练习九  调度程序 105
9.1  介绍 105
9.1.1  进程管理 105
9.1.2  进程状态 107
9.1.3  调度程序实现 108
9.1.4  公平共享调度 111
9.2  问题陈述 112
9.2.1  部分A 112
9.2.2  部分B 112
9.3  解决问题 112
9.3.1  设计解决方案 112
9.3.2  比较调度程序的性能 112
练习十  设备驱动程序 114
10.1  介绍 114
10.1.1  驱动程序组织结构 115
10.1.2  可装载内核模块驱动程序 117
10.1.3  示例:磁盘驱动程序 118
10.2  问题陈述 120
10.2.1  部分A 120
10.2.2  部分B 120
10.3  解决问题 120
练习十一  文件系统 122
11.1  介绍 122
11.1.1  虚拟文件系统 123
11.1.2  目录 127
11.1.3  示例:MS-DOS文件系统 128
11.2  问题陈述 129
11.2.1  部分A 129
11.2.2  部分B 130
11.2.3  部分C 130
11.3  解决问题 130
11.3.1  MS-DOS磁盘格式 130
11.3.2  MS-DOS FAT 132
11.3.3  使用软盘API 136
11.3.4  设计解决方案 137
练习十二  文件I/O 141
12.1  介绍 141
12.1.1  打开与关闭操作 142
12.1.2  读写操作 142
12.1.3  块分配 144
12.1.4  缓冲区管理 145
12.2  问题陈述 146
12.2.1  部分A 146
12.2.2  部分B 147
12.2.3  部分C 147
12.2.4  部分D 147
12.3  解决问题 147
12.3.1  open()函数 147
12.3.2  缓冲FAT 148
12.3.3  解决方案 148
进一步学习 151
附录A  Linux Mandrake 7.0
快速安装指南 152
附录B  GNU通用公共许可证
(版本2,1991.6) 156
参考文献 161

教学资源推荐
作者: [比]保罗•德•格劳威(Paul De Grauwe) 著
作者: [美]弗兰克 J. 法博齐(Frank J. Fabozzi),埃德温 H. 尼夫(Edwin H. Neave),[美]周国富(Guofu Zhou) 著