作为计算机学科的核心专业基础课程,操作系统的教学面临很大的挑战。
首先,在理论教学上操作系统描述的对象是微观的、隐蔽的、抽象的。操作系统讲述的模型、算法来自于与日常认识差别极大、以ns或ms秒为单位计时的计算空间(Cyberspace),这些模型、算法很难被直接观察、真实演示。
其次,在实践教学上操作系统往往面对的是具体的、整体的实际操作系统,而几乎每一个实际操作系统都是让人望而生畏的庞然大物,都有各自的一套复杂规定和实现方法。
因此,无论是理论教学还是实践教学,往往只能针对抽象后的操作系统普遍原理、方法及其模拟来进行。也因此,一些同学在学习操作系统课程后会有一个感慨: 操作系统理论就像一门哲学,感觉学了很多,却又什么也没掌握; 操作系统实践就像仰望高山,看到了其大其雄,但又无从攀登。
实践方能出真知。没有实践的支撑,操作系统的教学就是空中楼阁。在过去的十多年中,编者曾经尝试了多种实践教学方法来提升教学效果,但结果都不太令人满意,原因主要有两个: 要么太简单,无法真正揭示操作系统的内涵; 要么难度太高,很多同学难以完成。在尝试的过程中,编者发现了一个现象: 目前操作系统的教材非常多,关于Windows、Linux等实际操作系统内核分析与编程的书籍也非常多,但与操作系统课程内容紧密结合、适于实践教学的书却很少。因此我们萌生了一个想法,能不能编写一本以实际操作系统为素材、以操作系统授课内容为主线、以验证实验为主要手段的实践教学用书,来帮助学生理解操作系统抽象的概念和原理呢?于是编写了本书。
1. 本书内容
本书可分为两部分: 第一部分是Linux操作和应用编程; 第二部分是Linux内核编程。
(1) 第一部分为第1~10章,主要是为学习过C语言、但未接触过Linux编程的读者提供一个快速上手的途径。Linux应用,包括操作与编程,不光在实践中有广泛应用,而且对于理解Linux内核也有重要帮助。
第1、2章主要介绍Linux的基本操作和常用的Shell命令。
第3~7章是与Linux应用编程相关的内容,包含Linux平台上的C语言开发环境、Makefile、系统时间、多进程程序开发、进程通信等。
第8、9章介绍目前Linux上流行的Qt框架和MySQL数据库。
第10章综合前面各章知识,设计了一个Linux综合实训案例,并给出了相应的实训题目。
(2) 第二部分为第11~19章,基本上是按操作系统课程的内容结构进行编排的,目的是配合操作系统理论教学,使读者对操作系统课程中的重要概念、理论和方法有一个直观、具体、生动的认识。
第11章是Linux内核的配置与构建,第12章介绍Linux内核模块编程基本流程。
第13~16章对应进程管理,包括Linux进程控制块、多线(进)程、同步机制、进程间通信等。
第17章对应内存管理,包括Linux物理内存、段页式寻址和虚拟地址空间管理等。
第18章对应设备管理,包括Linux设备文件、驱动程序等。
第19章对应文件系统,包括Linux虚拟文件系统、文件系统的加载等。
另外,与本书配套的电子资源中还给出了Ubuntu系统的安装方法、Linux内核常用的系统调用以及Shell编程等内容。
本书各章节均有数量不等的配套实验,相应代码均在本书的配套素材中。由于实验较多,读者可以根据具体情况来组合使用; 各章节包含的实验请读者参考本书实验目录。
2. 本书使用建议
读者在使用本书时,可以根据具体情况来进行组合安排。
第一部分内容可以作为Linux应用与编程课程的相关教材和实验用书。其中,第2章可以用于Linux基本应用实验,第3~9章可以作为Linux应用开发实验,其中的第3、4章是基础,不可跳过。另外,第10章给出了一个可以用于综合实训的基本框架,并且在10.5节给出了部分实训题目。
第二部分内容可以作为操作系统课程的配套实验用书。如果读者有C语言编程经验,但没有Linux编程经验,那么可以选学第一部分的基础内容,然后把重点放在第二部分; 如果读者有较多Linux应用编程经验,可以直接从第二部分开始。第二部分各章具有较强的独立性,但第12、13章是后续各章的基础,请不要跳过。
本书内容以验证性实验为主,课后练习则是以验证实验为基础的设计实验,要求读者自己完成。虽然是以验证性实验为主,但其涉及的内容远不止实验本身,例如在第17章的实验3中,要把一个变量的物理地址计算出来,就需要把分页机制完整地梳理一遍。强烈建议读者阅读本书时一定要运行、分析电子资源中的源代码,结合操作系统教材理解其原理和机制。电子资源的网址为清华大学出版社(www.tup.tsinghua.edu.cn)本书页面或http://os.sdust.edu.cn/linux/。
另外需要强调的是,本书不是系统讲解Linux的书籍,而主要是通过实验来帮助读者更好地掌握操作系统的原理、方法和概念。因此,考虑到教学的方便性和适用性,有些内容并未包含在本书中。例如,本书并未给出系统调用的实验,原因就在于添加一个新的系统调用必须重新编译内核,而这个过程短则半个小时,长则1个小时以上,不适于实践教学; 类似的原因导致进程调度实验也未出现在本书中。当然读者可以把本书作为一个台阶,进一步深入学习Linux,到那时你会发现Linux原来并非那么让人望而生畏。
本书分工如下: 黄玲编写第1~3章,李哲编写第4~6章、11章和19章,李旭健编写第7~10章,房胜编写第12~18章。全书由房胜和李旭健统稿。本书编写和出版过程中,得到了清华大学出版社工作人员的大力支持。此外,本书参考了很多文献,既有操作系统的教材,也有Linux内核的书籍和网上资料,感谢这些作者。另外,张征亮、孙楠楠、高秀洋、张丛静、李秀丽参与了本书的编写、审校和代码测试工作,在此一并表示感谢。
由于本书涉及内容广泛,且Linux内核日渐庞大,不断更新、演变,限于编者的水平,书中难免有不当甚至谬误之处,请各位读者不吝指正,您的支持是我们进一步努力的源动力。
作者2015年6月
