关于我们
书单推荐
新书推荐
|
操作系统实践
本书可分为两大部分,第一部分是Linux操作与应用编程,包括Linux常用命令、C语言编程工具和典型的Linux应用开发,如多进程、进程通信等,并提供一个基于开源的Qt框架和MySQL数据库的综合实训案例;第二部分是Linux内核编程,这一部分紧密结合操作系统课程的教学内容,包含进程管理、内存管理、设备驱动程序和虚拟文件系统等。
作为计算机学科的核心专业基础课程,操作系统的教学面临很大的挑战。
首先,在理论教学上操作系统描述的对象是微观的、隐蔽的、抽象的。操作系统讲述的模型、算法来自于与日常认识差别极大、以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月
第1章Linux概述
1.1Linux的发展 1.1.1Linux概念 1.1.2Linux和UNIX的渊源 1.1.3与Linux相关的协议和标准 1.2Linux的内核架构 1.2.1Linux操作系统结构 1.2.2Linux内核体系结构 1.2.3内核版本和获取 1.2.4内核源代码目录结构 1.3Linux的主要版本 1.3.1Linux版本介绍 1.3.2Ubuntu的首次使用 1.4本章小结 习题 第2章Linux基本命令与应用 2.1认识命令行 2.1.1Terminal 2.1.2命令用法初体验 2.1.3其他虚拟终端 2.1.4相关概念 2.2使用文本文件 2.2.1创建文本文件 2.2.2查看文本文件内容 2.2.3查找及统计 2.3目录和文件 2.3.1目录及文件的基本操作 2.3.2文件权限 2.4管理用户和用户组 2.4.1相关配置文件 2.4.2相关操作 2.5其他常见命令 2.5.1挂载和卸载设备 2.5.2安装和卸载软件 2.6本章小结 习题 练习 第3章从Hello Linux程序开始 3.1Hello Linux 3.1.1hello_linux的诞生 3.1.2Linux平台C语言编码风格 3.1.3开发工具 3.2gcc编译 3.2.1单文件的编译 3.2.2多个源文件的编译 3.2.3其他介绍 3.3gdb调试 3.3.1gdb介绍 3.3.2使用gdb调试C语言文件 3.4本章小结 习题 练习 第4章利用Makefile管理一个工程 4.1第一个Makefile 4.1.1利用make编译一个程序文件 4.1.2利用make编译多个程序文件 4.2Makefile的基本概念与规则 4.2.1Makefile的基本概念 4.2.2规则 4.3本章小结 习题 练习 第5章Linux系统中的时间 5.1时间表示 5.1.1Linux系统时间 5.1.2Linux应用程序时间函数 5.2利用程序显示系统时间 5.2.1常用时间函数 5.2.2高级时间函数 5.3时间的测量与计时 5.3.1时间测量 5.3.2计时器 5.4本章小结 习题 练习 第6章多进程程序开发 6.1进程概念 6.2进程的创建 6.3连续调用多次fork函数 6.4启动外部程序 6.5本章小结 习题 练习 第7章进程间通信 7.1概述 7.2管道通信 7.2.1管道概述 7.2.2无名管道 7.2.3命名管道 7.3套接字通信 7.3.1用文件套接字实现本地进程通信 7.3.2用网络套接字实现网络进程通信 7.4本章小结 习题 练习 第8章利用Qt开发GUI应用程序 8.1Qt及Qt Creator 8.1.1Qt简介 8.1.2Qt Creator 8.1.3Qt的安装和启动 8.1.4Qt Creator的界面组成 8.2用Qt Creator完成一个GUI项目 8.2.1创建Qt GUI项目 8.2.2程序的运行 8.3信号和槽 8.3.1信号和槽的概念 8.3.2用信号槽机制响应GUI事件 8.3.3关于信号槽的进一步说明 8.4Qt设计师 8.4.1简介 8.4.2Qt设计师的功能 8.5本章小结 习题 练习 第9章MySQL数据库 9.1安装MySQL 9.2MySQL的基本用法 9.2.1MySQL管理 9.2.2数据库操作 9.2.3数据类型 9.2.4表操作 9.2.5创建一个数据库 9.3使用C语言访问MySQL数据库 9.3.1连接数据库 9.3.2执行SQL语句 9.3.3处理数据 9.4本章小结 习题 练习 第10章Linux综合应用 10.1概述 10.1.1系统需求 10.1.2本章内容结构 10.2原型设计 10.2.1添加资源文件 10.2.2界面设计 10.2.3界面布局 10.2.4添加动作 10.3系统设计 10.3.1系统架构 10.3.2客户端功能设计 10.3.3服务器功能设计 10.4系统实现 10.4.1数据结构(通信协议) 10.4.2客户端实现 10.4.3服务器端实现 10.4.4几点说明 10.5Linux应用综合实训 10.6本章小结 第11章构建Linux内核系统 11.1概述 11.2内核初始化 11.3内核配置 11.4内核构建 11.5本章小结 练习 第12章添加最简单的Linux内核模块 12.1用户态与内核态 12.1.1C/C++应用程序的运行机制 12.1.2Linux内核模块 12.2添加最简单的Linux内核模块 12.2.1LKM代码框架 12.2.2LKM编译 12.2.3kello.c的编译、添加和删除 12.2.4LKM与C应用程序的差异 12.3printk和某些常见宏 12.3.1实时显示内核模块运行信息 12.3.2显示位置信息 12.4本章小结 练习 第13章基于proc的Linux进程控制块信息读取 13.1proc伪文件系统 13.1.1proc中的文件 13.1.2proc中文件的内容 13.1.3proc伪文件系统介绍 13.2Linux中的进程控制块 13.2.1Linux进程控制块task_struct 13.2.2进程重要信息解读 13.3通过proc读取Linux进程信息 13.3.1创建proc文件 13.3.2基于seq_file机制的proc文件操作 13.3.3task_struct信息读取过程 13.3.4tasklist内核模块编译和添加 13.3.5tasklist内核模块工作流程 13.4task_struct重要信息 13.4.1Linux进程调度策略 13.4.2进程优先级 13.4.3进程控制块中的其他信息 13.5向proc文件写入数据 13.5.1用户空间和内核空间之间传递数据 13.5.2内核空间内存分配 13.5.3proc文件的写操作函数 13.6本章小结 习题 练习 第14章POSIX多任务及同步机制 14.1fork创建进程 14.1.1fork创建进程的流程 14.1.2fork/exec创建进程的流程 14.1.3fork进阶问题 14.2POSIX线程机制 14.2.1POSIX概述 14.2.2POSIX线程创建 14.3POSIX多线程及同步机制 14.3.1多个线程的资源竞争访问 14.3.2POSIX同步机制 14.4条件变量与生产者消费者问题 14.4.1同步与互斥 14.4.2POSIX条件变量 14.4.3条件变量在生产者消费者问题中的应用 14.5本章小结 习题 练习 第15章用户态和内核态信号量 15.1信号量与同步问题 15.1.1信号量概述 15.1.2同步问题 15.2POSIX信号量 15.2.1无名信号量 15.2.2有名信号量 15.2.3POSIX信号量用于线程同步问题 15.2.4POSIX信号量用于进程间同步 15.2.5Linux中的信号量技术 15.3内核信号量和内核线程 15.3.1Linux内核信号量 15.3.2Linux内核线程 15.3.3内核信号量和线程的例子 15.3.4Linux内核同步技术 15.4本章小结 习题 练习 第16章基于共享内存的进程间通信 16.1共享内存 16.2共享内存映射文件 16.2.1单个进程的内存映射文件 16.2.2多个进程间的内存映射文件的同步 16.3POSIX共享内存对象 16.4本章小结 习题 练习 第17章Linux内存管理 17.1Linux物理内存管理机制 17.1.1内存结点node 17.1.2内存结点zone 17.1.3物理页框page 17.2IA32的寻址机制 17.2.1IA32的段机制 17.2.2IA32的页面映射机制 17.2.3IA32中的控制寄存器以及PAE、PSE 17.3IA32结构上的Linux地址映射机制 17.3.1Linux中段地址映射机制 17.3.2IA32 Linux段地址映射实验 17.3.3IA32 Linux页地址映射 17.3.4IA32 Linux页地址映射实验 17.4Linux进程地址空间 17.4.1Linux中进程的虚拟地址空间 17.4.2获取进程虚拟地址空间信息 17.4.3Linux中进程的虚拟存储区域vma 17.4.4获取进程的虚拟内存区域信息 17.4.5Linux中进程、内存和文件的关系 17.5本章小结 习题 练习 第18章Linux设备驱动程序 18.1概述 18.1.1设备管理基本概念 18.1.2Linux字符设备管理 18.2字符设备CMOS驱动程序 18.2.1CMOS RTC信息 18.2.2获取CMOS RTC信息的驱动程序内核模块 18.2.3CMOS RTC驱动程序内核模块测试 18.3基于内存映射的杂项设备驱动程序 18.3.1Linux中的杂项设备 18.3.2设备驱动中的内存映射 18.3.3基于内存映射的杂项设备驱动程序 18.3.4测试 18.4本章小结 习题 练习 第19章Linux虚拟文件系统 19.1概述 19.1.1VFS在Linux中的作用 19.1.2VFS支持的文件系统类型 19.1.3VFS的基本数据结构 19.2VFS对象的操作 19.2.1注册文件系统 19.2.2文件系统装载 19.2.3与进程相关的文件系统数据结构 19.2.4从当前进程访问Linux内核VFS文件系统 19.3proc文件系统 19.3.1主要数据结构 19.3.2proc文件系统的操作 19.4本章小结 习题 练习 参考文献 实验目录 第2章Linux基本命令与应用 实验1: 认识命令行的相关实验 实验2: 创建文本文件 实验3: 查看文本文件 实验4: 文本文件查找及统计 实验5: 目录及文件基本操作 实验6: 文件权限 实验7: 管理用户和用户组 实验8: 其他常见操作 第3章从Hello Linux程序开始 实验1: 简单程序开发 实验2: 单步编译和多步编译 实验3: 浏览gdb内置命令 实验4: 利用gdb调试程序 第4章利用Makefile管理一个工程 实验1: Makefile与命令行编译的比较 实验2: 编写Makefile 第5章Linux系统中的时间 实验1: 编程显示系统时间 实验2: Linux中的时间测量 实验3: Linux中的计时器 第6章多进程程序开发 实验1: 利用fork创建进程 实验2: 连续调用多次fork函数 实验3: 启动外部程序 第7章进程间通信 实验1: 管道通信 实验2: 文件套接字通信 实验3: 网络套接字通信 第8章利用Qt开发GUI应用程序 实验1: Qt的安装与启动 实验2: 创建Qt GUI项目 实验3: 信号槽机制 第9章MySQL数据库 实验1: MySQL数据库操作 实验2: MySQL表操作 实验3: 创建一个MySQL数据库 实验4: 用C语言访问MySQL数据库 第12章添加最简单的Linux内核模块 实验1: 添加最简单的内核模块kello 实验2: 内核模块输出信息显示 第13章基于proc的Linux进程控制块信息读取 实验1: 测试proc文件系统功能 实验2: 创建显示系统进程信息的proc模块 实验3: 显示Linux进程控制块中更多的信息 第14章POSIX多任务及同步机制 实验1: Linux进程创建 实验2: POSIX线程创建 实验3: POSIX线程互斥和参数传递 实验4: 使用POSIX条件变量实现线程同步 第15章用户态和内核态信号量 实验1: 使用POSIX信号量实现线程同步 实验2: 使用POSIX信号量实现进程同步 实验3: 创建Linux内核线程并使用内核信号量实现同步 第16章基于共享内存的进程间通信 实验1: 使用内存映射文件实现进程间通信 实验2: 使用共享内存对象实现进程同步 第17章Linux内存管理 实验1: 获取IA32段寄存器中的描述符 实验2: 获取IA32中的全局段表信息 实验3: 获取C程序中一个逻辑地址对应的物理地址 实验4: 显示进程的虚拟内存地址空间分布信息 实验5: 获取一个进程的虚拟存储区域信息 第18章Linux设备驱动程序 实验1: 实现读取CMOS实时时钟信息的驱动程序 实验2: 实现一个基于内存映射的设备驱动程序 第19章Linux虚拟文件系统 实验1: 访问Linux内核虚拟文件系统 实验2: 加载newproc文件系统
你还可能感兴趣
我要评论
|