本书设计了一组基于Linux环境的操作系统课程实验,带领读者由浅入深地实际体验Linux操作系统的设计原理。本书不仅仅提供了实验背景知识、实验内容、解决方案的描述,还系统地描述了Linux操作系统的基本实现原理,同时也给出了应用和内核编程可能涉及的系统调用、多线程库函数及内核函数。本书既讲解Linux操作系统原理,又提供实验指导及编程参考,为Linux内核编程入门者提供了最基本的信息。
主要特点
● 通过详细实例,循序渐进地启发学生的设计思路。
● 有详细的原理说明,无须参考其他理论书籍。
● 提供设计方法,激发学生的主观能动性,培养学生的综合设计能力。
无
操作系统是计算机系统中的核心软件。操作系统教学不但需要讲授操作系统概念、原理与方法,还需要让学生动手进行操作系统编程实践,只有这样才能够让学生真正理解操作系统的精髓。编写本书的目的就是为了在学习完操作系统原理后,为进行操作系统实践教学提供指导。
Linux操作系统是源码公开的实用的现代操作系统,利用Linux作为操作系统实验的平台,不但能够帮助学生进行以理解操作系统原理为目的的实验,同时也可以看做是操作系统开发实战的演练。由于Linux源码公开以及Linux的广泛普及,我们选定Linux作为操作系统实验教学平台是合适的。
本书分为三部分:第一部分介绍Linux操作系统原理;第二部分介绍7个基于Linux的实验;第三部分包含创建Linux环境及进行编程所需的参考资料。本书可以作为CCC2002(操作系统课程设计)课程指导教材,其中部分内容也可以作为操作系统原理课程的课后实验。本书也可以作为相关技术人员的Linux操作系统编程参考书。
本书作者长期从事计算机操作系统研究开发及教学工作,根据多年操作系统开发及教学经验,参考国内外近年出版的各类操作系统实验教程,设计了一组基于Linux环境的操作系统课程实验,让学生由浅入深地实际体验Linux操作系统的设计原理。本书不仅仅提供了Linux操作系统的基本实现原理、实验背景知识、实验内容、解决方案的描述,同时在第三部分也给出了应用和内核编程可能涉及的系统调用、多线程库函数及内核函数,这样可以在无须其他参考书的情况下实现基本的实验编程。在操作系统实验课程教学实践中,不需局限于本书所列的7个实验,建议老师将最终实验题(如动态加载模块方式的驱动程序实现,或者多个实验中由学生自选一个)在第一次上课时就向学生进行布置,让学生自己理解实现目标实验需要掌握哪些基本实验,这样可以发挥学生的主观能动性,以收到更好的实验效果。
本书由国防科技大学罗宇主编,参加本书编写的还有褚瑞、陈燕晖、唐勇、刘万伟、汪黎。温研对书稿进行了校对。由于作者水平有限,错误在所难免;读者对于本书的任何批评、建议可发送邮件到:yuluo@nudt.edu.cn。
作 者
2005年6月于国防科技大学
近年来,我国在计算机应用、计算机软件和电子类相关专业的人才培养方面,取得了长足的进展,每年的毕业生都有数十万人。但是这些毕业生走进企业、公司、政府机构或研究单位之后,往往深刻地感觉到缺乏实际开发设计项目的经验,不善于综合运用所学理论,对知识的把握缺乏融会贯通的能力。
综合考察目前高等院校教学大纲、课程设置以及内容安排等方面的情况,多数学校还是比较重视训练学生的实际设计能力。但是,从安排设计实践的内容上看,基本上是围绕相关课程教学内容而展开的,不能够构成对实际问题的解决方案;从配套程序的规模上看,一般只是几十行到几百行的源码,或者是一个单独电路的设计,远远小于一个小型项目的规模;从设计的结构上看,由于设计实践是围绕着课程教学内容而进行的,问题已经高度抽象,学生很难得到有关综合运用所学知识的整体训练机会。而且,这些内容相对简单、问题域已经高度抽象、规模较小的设计实践一人基本上就能完成,学生几乎无法通过这些设计实践,去真正获得有关项目管理和团队协作等方面的基本训练和工作经验。
由此可以看出,大多数学校对学生实际设计能力的训练与国外知名大学和国内精品课程相比较,还是存在一些差距的。为此,机械工业出版社华章分社和一批高等院校的教师,针对当前高等院校计算机硬件、软件和电子类相关课程教学中存在的问题,参考国内外知名大学相关课程成功的教学经验,设计编写了这套“高等院校计算机课程设计指导丛书”,其目的就是通过课程设计的一系列训练,把知识获取和项目实践两个方面有机地结合起来。
在这套“高等院校计算机课程设计指导丛书”中的每一门课程设计里,都安排了由多个子项目组成的一个课程设计项目。学生们可以在教师的指导下,逐步设计实现这些子项目,并最终完成一个功能相对完整,可以运行的系统,其代码可以是数千行,甚至上万行。通过这种设计课程,学生一方面可以结合课程的教学内容循序渐进地进行设计方面的实践训练,另一方面,在参与一系列子项目的实践过程中,还能提高如何综合运用所学知识解决实际问题的能力,以及获得有关项目管理和团队合作等等众多方面的具体经验,增强对相关课程具体内容的理解和掌握能力,培养对整体课程知识综合运用和融会贯通能力。
参加丛书编写的各高等院校的教师都有着丰富的教学、科研,以及与企业合作开发项目等多方面的经验。每个课程设计中的子项目和整体项目,都来自教师们具体的科研和设计开发实践,所选设计项目与教学内容配合紧密,项目的难度与规模适宜。
最后,感谢机械工业出版社华章分社编辑们的大力支持,使出版有关这套丛书的计划,从单纯的构想演化成带有油墨芳香的真实。
丛书写作组
2004年7月
第一部分 基 础 知 识
第1章 Linux操作系统简介 3
1.1 Linux的故事 3
1.2 Linux简介 6
1.3 阅读Linux内核源码 8
1.4 小结 12
第2章 Linux的进程管理 13
2.1 进程与进程描述符 13
2.2 进程状态及切换时机 16
2.2.1 Linux的进程状态 16
2.2.2 进程的切换时机 17
2.3 进程的调度算法 18
2.4 进程的创建与消亡 19
2.4.1 进程的创建 19
2.4.2 进程的销毁 22
第3章 Linux的存储管理 25
3.1 物理内存的管理 25
3.1.1 页帧与区域 25
3.1.2 伙伴算法 26
3.1.3 slab分配器 27
3.1.4 换出页面 29
3.2 进程空间的管理 30
3.2.1 页表机制 30
3.2.2 vm_area_struct结构 32
3.2.3 进程空间的相关系统调用 33
3.2.4 页面异常的处理 33
第4章 Linux的文件系统 37
4.1 VFS 37
4.1.1 进程对文件系统的支持 38
4.1.2 VFS的文件模型 38
4.1.3 文件系统的注册与安装 41
4.1.4 各种对象的操作接口 41
4.1.5 目录的缓存机制 44
4.2 EXT2文件系统 45
4.2.1 EXT2文件系统在磁盘上的物理布局 45
4.2.2 主要数据结构及基本操作 46
4.2.3 磁盘块的分配和释放 49
4.3 有关的系统调用及处理流程 49
4.3.1 文件的open操作 49
4.3.2 文件的read操作 51
第5章 Linux的设备管理 53
5.1 设备文件的概念 53
5.2 相关数据结构 53
5.2.1 设备的注册和注销 53
5.2.2 缓冲区管理 54
5.2.3 设备请求队列 56
5.3 块设备文件的open和read操作 56
5.3.1 open()函数的实现 57
5.3.2 read()函数的实现 58
第6章 中断、异常及系统调用 59
6.1 中断和异常的基本知识 59
6.2 异常处理函数 60
6.3 系统调用 61
6.4 中断的处理 62
6.4.1 中断控制器 62
6.4.2 管理中断的数据结构 63
6.4.3 中断的处理过程 65
6.5 软中断 65
第7章 SYS V进程间通信 69
7.1 共同特性 69
7.2 信号量 71
7.3 消息队列 74
7.4 共享内存 76
第二部分 实 验
实验一 观察Linux的行为 81
Linux下的proc文件系统简介 81
实验内容 86
解决方案 86
实验二 进程间通信 89
Linux进程间通信简介 89
本机内进程通信 89
网络间进程通信 92
实验内容 94
解决方案 95
实验三 理解和增加Linux系统调用 97
内核及系统调用原理 97
实验内容 101
解决方案 102
实验四 内核模块 105
Linux内核模块简介 105
模块的组织结构 105
模块的加载和卸载 106
内核模块的编写实例 107
实验内容 109
解决方案 109
用户空间和内核空间 109
进程 110
实验五 proc文件系统编程 113
proc文件系统编程简介 113
概述 113
函数接口 114
基本的例子 117
实验内容 119
解决方案 120
实验六 同步机制 123
同步机制简介 123
阻塞任务 124
等待队列 124
使用等待队列 126
实验内容 128
解决方案 129
实验七 设备驱动程序 131
编写设备驱动程序 131
Linux下设备驱动程序的基本结构 131
编写Linux设备驱动程序的基本方法 134
radimo:一个块设备驱动程序的例子 137
实验内容 145
解决方案 145
USB设备简述 145
Linux下的USB设备驱动程序简介 147
设备驱动程序的调试方法 148
第三部分 附 录
附录A 安装Red Hat Linux 153
附录B 编译Linux内核 157
附录C Linux 常用命令 163
附录D Linux常用函数 177
附录E 常用内核函数 189