内容简介
《Linux操作系统原理与应用(第2版)》是Linux内核及动手实践的入门教程。在庞大的Linux内核中,选取基本的内容——进程管理、中断、内存管理、系统调用、内核同步、文件系统、I/O设备管理等进行阐述。从原理出发,基于Linux内核源代码但又不局限于代码,分析原理如何落实到代码,并通过简单有效的实例说明如何调用Linux内核提供的函数进行内核级程序的开发。主要章节给出了具有实用价值的小型应用,从而让读者在实践中加深对原理的理解和应用能力。
《Linux操作系统原理与应用(第2版)》对于希望深入Linux操作系统内部、阅读Linux内核源代码以及进行内核级程序开发的读者具有较高的参考价值。
《Linux操作系统原理与应用(第2版)》可作为高等院校计算机相关专业的本科生、研究生的教材,Linux应用开发人员、嵌入式系统开发人员等均可从《Linux操作系统原理与应用(第2版)》中获益。
内页插图
目录
第1章 概述
1.1 认识操作系统
1.1.1 从使用者角度看
1.1.2 从程序开发者的角度看
1.1.3 从操作系统在整个计算机系统所处位置看
1.1.4 从操作系统设计者的角度看
1.1.5 操作系统组成
1.2 开放源代码的UNIX/Linux操作系统
1.2.1 UNIX诞生和发展
1.2.2 Linux诞生
1.2.3 操作系统标准POSIX
1.2.4 GNU和Linux
1.2.5 Linux的开发模式
1.3 Linux内核
1.3.1 Linux晦核的技术特点
1.3.2 Linux内核的位置
1.3.3 Linux内核体系结构
1.4 Linux内核源代码
1.4.1 Linux内核版本
1.4.2 Linux内核源代码的结构
1.4.3 Linux内核源代码分析工具
1.5 Linux内核模块编程入门
1.5.1 模块的定义
1.5.2 编写一个简单的模块
1.5.3 应用程序与内核模块的比较
1.6 Linux内核中链表的实现及应用
1.6.1 链表的演化
1.6.2 链表的定义和操作
1.6.3 链表的应用
1.7 小结
习题
第2章 内存寻址
2.1 内存寻址
2.1.1 Intelx86CPU寻址的演变
2.1.2 80x86寄存器简介
2.1.3 物理地址、虚拟地址及线性地址
2.2 段机制
2.2.1 段描述符
2.2.2 地址转换及保护
2.2.3 Linux中的段
2.3 分页机制
2.3.1 页与页表
2.3.2 线性地址到物理地址的转换
2.3.3 分页举例
2.3.4 页面高速缓存
2.4 Linux中的分页机制
2.5 Linux中的汇编语言
2.5.1 AT&T;与Intel汇编语言的比较
2.5.2 AT&T;汇编语言的相关知识
2.5.3 GCC嵌入式汇编
2.6 Linux系统地址映射举例
2.7 小结
习题
第3章 进程
3.1 进程介绍
3.1.1 程序和进程
3.1.2 进程的层次结构
3.1.3 进程状态
3.1.4 进程举例
3.2 Linux系统中的进程控制块
3.2.1 进程状态
3.2.2 进程标识符
3.2.3 进程之间的亲属关系
3.2.4 进程控制块的存放
3.2.5 当前进程
3.3 Linux系统中进程的组织方式
3.3.1 进程链表
3.3.2 哈希表
……
第4章 内存管理
第5章 中断和异常
第6章 系统调用
第7章 内核中的同步
第8章 文件系统
第9章 设备驱动
参考文献
前言/序言
20年前诞生于学生之手的I。inux,借助于Internet这片肥沃的土壤,在开源文化的大熔炉中,逐步成长为穿越桌面、服务器以及智能终端的通用操作系统。
1991年那个稚嫩的0.01版就是I。inus在操作系统课上写的一个大作业,翻看其代码,调度程序也就三十多行,文件系统的读写函数各只有十多行(不含所调用的其他函数),如此而已,初学者可以在这样的代码中看到自己所写程序的影子。
Linux从曾经的0.01版到现在的3.O版,历经了八百多个版本的变迁,其中变化的点滴都记录在Linux内核邮件列表(LKML)中,从这些足迹中,我们会寻觅到一个变量为什么那样定义,一个结构体为什么要增减字段,一个函数的参数为什么从三个变为两个,在这一个个的细节中,软件设计的蛛丝马迹也就逐步展现出来。但是,这些过往的信息是海量的,多本教材都无法容纳,需要读者进行大量的课外阅读。
Linux内核的全部源代码是一个庞大的世界,如何在这庞大而又复杂的世界中抓住主要内容,如何找到进入Linux内部的突破口,又如何把Linux的源代码变为自己所需,并在此基础上进行内核级程序的开发,这是本书要探讨的内容。
首先第1章概述从不同侧面概要描述了大家熟悉而又陌生的操作系统,使读者从宏观上对操作系统有一个初步认识。之后,简要介绍了Linux的同族同源UNIX,从而说明Linux赖以生存的土壤源于三十多年UNIX的发展。为了让读者对Linux有初步了解后动手实践,本章还介绍了Linux内核中的模块编写方法,并以链表为入口点,让读者近距离感知Linux内核代码设计中的精彩和美妙。
第2章内存寻址从寻址方式的演变人手,给出与操作系统设计密切相关的概念。比如,实模式、保护模式、各种寄存器、物理地址、虚拟地址以及线性地址等。然后对保护模式的分段机制和分页机制简要描述,并从Linux设计的角度分析了这些机制的具体落实。接着介绍了Linux中的汇编以及嵌入式汇编,最后给出了Linux系统的地址映射示例,这是在第2章就引入内存寻址的根本目的,就是操作系统如何借助硬件把虚地址转化为物理地址。
第3章进程从进程的引入开始,阐述了进程的各个方面,包括进程上下文、进程层次结构、进程状态,尤其是对进程控制块进行了比较全面的介绍。task_struct结构作为描述Linux进程的核心数据结构,对其熟悉和掌握可深入了解进程的入口点。另外,进程控制块的各种组织方式链表、散列表、队列等数据结构是管理和调度进程的基础。在这些基础上,对核心内容进程调度进行了代码级的描述,并给出了Linux新版本中改进的方法和思路。最后,以进程系统调用的剖析和应用结束本章。
第4章内存管理主要围绕虚地址到物理地址的转换,由此引发出了各种问题,比如地址映射问题,一方面把可执行映像映射到虚拟地址空间,另一方面把虚地址空间映射到物理地址空间。而在程序执行时,涉及请页问题,把虚空间中的页真正搬到物理空间,由此要对物理空间进行分配和回收,而在物理内存不够时,又必须进行内外交换,交换的效率直接影响系统的性能,于是缓冲和刷新技术应运而生。本章最后一节给出了一个比较完整的例子,说明内存管理在实际中的应用。
第5章中断和异常涵盖了较多的概念:中断和异常、中断向量、IRQ、中断描述符表、中断请求队列、中断的上半部和下半部、时钟中断、时钟节拍、节拍率、定时器等。中断使得硬件与处理器进行通信,不同的设备对应的中断不同;同时,不同的中断具有不同的中断服务程序,其中断处理程序的入口地址存放在中断向量表中。当某个中断发生时,对应的中断服务程序得到执行,在执行期间不接受外界的干扰。为了缓解中断服务程序的压力,内核中引入了中断下半部机制,其本质都是推后下半部函数的执行。时钟中断是内核跳动的脉搏,本章引入了时钟节拍、jiffies、节拍率等概念,简要介绍了时钟中断的运行机制,同时给出了定时器的简单应用。
第6章系统调用是内核与用户程序进行交互的接口。本章从不同角度对系统调用进行了描述,说明了系统调用与API、系统命令以及内核函数之间的关系。然后,分析了Linux内核如何实现系统调用,说明系统调用处理程序以及服务例程在整个系统调用执行过程中的作用。最后,通过两个实例讨论了如何增加系统调用,并给出了从用户空间调用系统调用的简单例子。本章最后的日志收集系统实例给出了完整的过程,以便读者充分认识系统调用的价值并在自己的项目开发中灵活应用。
第7章内核同步首先介绍了临界区、共享队列、死锁等相关的同步概念,然后给出了内核中常用的三种同步方法,即原子操作、自旋锁以及信号量,其中对信号量的实现机制进行了稍微深入的分析。为了加强读者对同步机制的应用能力;本章给出了两大实例,其一是生产者一消费者模型,其二是内核中线程、系统调用以及定时器任务队列的并发执行。通过这两个例子,让读者深刻体会并发程序编写中如何应用同步机制。
第8章文件系统首先介绍了文件系统的基础知识,其中涉及索引节点、软连接、硬链接、文件系统、文件类型以及文件的访问权限等概念。虚拟文件系统机制使得Linux可以支持各种不同的文件系统,其实现中涉及的主要对象有超级块、索引节点、目录项以及文件,对这些数据结构的描述可以使读者深入到细节了解具体字段的含义。然后,简要讨论了文件系统的注册、安装以及卸载,最后的实例给出romfs文件系统的具体实现。
第9章设备驱动首先阐述了设备驱动程序在文件系统中所处的位置。接着介绍了驱动程序的通用框架,以及Linux字符驱动的简单实例,让读者对驱动程序有一个初步认识。然后对设备驱动开发中所涉及的I/O空间进行了比较详细的介绍。在字符设备驱动一节,把内存空间的一片区域看做一个字符设备,并给出了开发这样一个驱动程序的具体步骤和过程。最后,对块设备驱动程序的开发给出了简要描述。
为了突出主题,本教材尽量简化相关内容,但为了填补课堂教学和实践开发之间的鸿沟,我们在Linux内核之旅www.kerneltravel.net网站上发布了与内核相关的学习资料。针对读者学习操作系统课程后,苦于无用武之地的现状,网站上讨论了如何进行Linux内核层面上的系统软件开发,并配以有实用价值或指导意义的实验。
Linux操作系统原理与应用(第2版) 电子书 下载 mobi epub pdf txt