高级搜索  |  搜索帮助
最近的浏览历史
购买此书的人还购买过
书  名:Linux 操作系统原理与应用(第2版)
  • 作  者: 陈莉君等
  • 出版时间: 2012-01-01
  • 出 版 社: 清华大学出版社
  • 字  数: 431 千字
  • 印  次: 2-1
  • 印  张: 17.25
  • 开  本: 16开
  • ISBN: 9787302278368
  • 装  帧: 平装
  • 定  价:¥28.00
电子书价:¥19.60 折扣:70折 节省:¥8.40 vip价:¥19.60 电子书大小:17.66M
配套资源下载:
  • 名称
  • 说明
  • 权限
  • 文件大小
  • 点击图标下载
  • 图书样章
  • 所有用户
  • 256K
共有商品评论0条 查看评论摘要
内容简介
  本书是Linux内核及动手实践的入门教程。在庞大的Linux内核中,选取最基本的内容——进程管理、中断、内存管理、系统调用、内核同步、文件系统、I/O设备管理等进行阐述。从原理出发,基于Linux内核源代码但又不局限于代码,分析原理如何落实到代码,并通过简单有效的实例说明如何调用Linux内核提供的函数进行内核级程序的开发。主要章节给出了具有实用价值的小型应用,从而让读者在实践中加深对原理的理解和应用能力。
  本书对于希望深入Linux操作系统内部、阅读Linux内核源代码以及进行内核级程序开发的读者具有较高的参考价值。本书可作为高等院校计算机相关专业的本科生、研究生的教材,Linux应用开发人员、嵌入式系统开发人员等均可从本书中获益。
前言
  第2版前言
  20年前诞生于学生之手的Linux,借助于Internet这片肥沃的土壤,在开源文化的大熔炉中,逐步成长为穿越桌面、服务器以及智能终端的通用操作系统。
  1991年那个稚嫩的0.01版就是Linus在操作系统课上写的一个大作业,翻看其代码,调度程序也就三十多行,文件系统的读写函数各只有十多行(不含所调用的其他函数),如此而已,初学者可以在这样的代码中看到自己所写程序的影子。
  Linux从曾经的0.01版到现在的3.0版,历经了八百多个版本的变迁,其中变化的点滴都记录在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系统的陌生和动手能力偏弱,针对这种现状,在本次改版过程中,尽量从Linux命令级入手,逐步过渡到原理; 从简单的小实验入手,逐步过渡到大例子,以便学生把所学原理与平时遇到的问题联系起来。
  由于本教材的篇幅所限,本书内容进行了一定的简化,这可能在某种程度上影响了读者对其内容的深入理解,为此,Linux内核之旅网站公布了作者曾经编写的《深入分析Linux内核源代码》一书的电子版内容,以满足读者深入探究之愿望。
  在本次内容的改编过程中,得到了很多学生的支持,他们是许振文、牛涛、陈继峰、武婷、武特等,而武特的博客http://edsionte.com/techblog/更是让初学者有一种亲近感和熟悉感, 希望大家在学习的过程中,以博客的形式分享自己的心得。

  作者
  2011年9月
目录
第1章概述

1.1认识操作系统

1.1.1从使用者角度看

1.1.2从程序开发者的角度看

1.1.3从操作系统在整个计算机系统所处位置看

1.1.4从操作系统设计者的角度看

1.1.5操作系统组成

1.2开放源代码的UNIX/Linux操作系统

1.2.1UNIX诞生和发展

1.2.2Linux诞生

1.2.3操作系统标准POSIX

1.2.4GNU 和 Linux

1.2.5Linux的开发模式

1.3Linux内核

1.3.1Linux 内核的技术特点

1.3.2Linux内核的位置

1.3.3Linux内核体系结构

1.4Linux内核源代码

1.4.1Linux内核版本

1.4.2Linux内核源代码的结构

1.4.3Linux内核源代码分析工具

1.5Linux内核模块编程入门

1.5.1模块的定义

1.5.2编写一个简单的模块

1.5.3应用程序与内核模块的比较

1.6Linux 内核中链表的实现及应用

1.6.1链表的演化

1.6.2链表的定义和操作

1.6.3链表的应用

1.7小结

习题


第2章内存寻址

2.1内存寻址

2.1.1Intel x86 CPU寻址的演变

2.1.280x86寄存器简介

2.1.3物理地址、虚拟地址及线性地址

2.2段机制

2.2.1段描述符

2.2.2地址转换及保护

2.2.3Linux中的段

2.3分页机制

2.3.1页与页表

2.3.2线性地址到物理地址的转换

2.3.3分页举例

2.3.4页面高速缓存

2.4Linux中的分页机制

2.5Linux中的汇编语言

2.5.1ATandT与Intel汇编语言的比较

2.5.2ATandT汇编语言的相关知识

2.5.3GCC嵌入式汇编

2.6Linux系统地址映射举例

2.7小结

习题


第3章进程

3.1进程介绍

3.1.1程序和进程

3.1.2进程的层次结构

3.1.3进程状态

3.1.4进程举例

3.2Linux系统中的进程控制块

3.2.1进程状态

3.2.2进程标识符

3.2.3进程之间的亲属关系

3.2.4进程控制块的存放

3.2.5当前进程

3.3Linux系统中进程的组织方式

3.3.1进程链表

3.3.2哈希表

3.3.3就绪队列

3.3.4等待队列

3.4进程调度

3.4.1基本原理

3.4.2时间片

3.4.3Linux进程调度时机

3.4.4进程调度的依据

3.4.5调度函数schedule()的实现

3.4.6Linux 2.6调度程序的改进

3.5进程的创建

3.5.1创建进程

3.5.2线程及其创建

3.6与进程相关的系统调用及其应用

3.6.1fork系统调用

3.6.2exec系统调用

3.6.3wait系统调用

3.6.4exit系统调用

3.6.5进程的一生

3.7系统调用及应用

3.8小结

习题


第4章内存管理

4.1Linux的内存管理概述

4.1.1虚拟内存、内核空间和用户空间

4.1.2虚拟内存实现机制间的关系

4.2进程的用户空间管理

4.2.1进程用户空间的描述

4.2.2进程用户空间的创建

4.2.3虚存映射

4.2.4进程的虚存区举例

4.2.5与用户空间相关的系统调用

4.3请页机制

4.3.1缺页异常处理程序

4.3.2请求调页

4.3.3写时复制

4.4物理内存分配与回收

4.4.1页描述符

4.4.2伙伴算法

4.4.3物理页面的分配

4.4.4物理页面的回收

4.4.5Slab分配机制

4.4.6内核空间非连续内存区的分配

4.4.7物理内存分配举例

4.5交换机制

4.5.1交换的基本原理

4.5.2页面交换守护进程kswapd

4.6内存管理实例

4.6.1相关背景知识

4.6.2代码体系结构介绍

4.6.3实现过程

4.6.4程序代码

4.7小结

习题


第5章中断和异常

5.1中断是什么

5.1.1中断向量

5.1.2 外设可屏蔽中断

5.1.3异常及非屏蔽中断

5.1.4中断描述符表

5.1.5相关汇编指令

5.2中断描述符表的初始化

5.2.1IDT表项的设置

5.2.2对陷阱门和系统门的初始化

5.2.3中断门的设置

5.2.4中断处理程序的形成

5.3中断处理

5.3.1中断和异常的硬件处理

5.3.2中断请求队列的建立

5.3.3中断处理程序的执行

5.3.4从中断返回

5.3.5中断的简单应用

5.4中断的下半部处理机制

5.4.1为什么把中断分为两部分来处理

5.4.2小任务机制

5.4.3工作队列

5.5中断应用——时钟中断

5.5.1时钟硬件

5.5.2时钟运作机制

5.5.3Linux时间系统

5.5.4时钟中断

5.5.5定时器及应用

5.6小结

习题


第6章系统调用

6.1系统调用与应用编程接口、系统命令以及内核函数的关系

6.1.1系统调用与API

6.1.2系统调用与系统命令

6.1.3系统调用与内核函数

6.2系统调用基本概念

6.2.1系统调用号

6.2.2系统调用表

6.2.3系统调用服务例程和系统调用处理程序

6.3系统调用实现

6.3.1初始化系统调用

6.3.2system_call()函数

6.3.3参数传递

6.3.4跟踪系统调用的执行

6.4封装例程

6.5添加新系统调用

6.5.1添加系统调用的步骤

6.5.2系统调用的调试

6.6实例系统调用日志收集系统

6.6.1代码结构体系介绍

6.6.2把代码集成到内核中

6.7小结

习题


第7章内核中的同步

7.1临界区和竞争状态

7.1.1临界区举例

7.1.2共享队列和加锁

7.1.3确定保护对象

7.1.4死锁

7.1.5并发执行的原因

7.2内核同步措施

7.2.1原子操作

7.2.2自旋锁

7.2.3信号量

7.3生产者消费者并发实例

7.3.1问题分析

7.3.2实现机制

7.3.3具体实现

7.4内核多任务并发实例

7.4.1内核任务及其并发关系

7.4.2问题描述

7.4.3实现机制

7.5小结

习题


第8章文件系统

8.1Linux文件系统基础

8.1.1Linux文件结构

8.1.2文件类型

8.1.3存取权限和文件模式

8.1.4Linux文件系统

8.2虚拟文件系统

8.2.1虚拟文件系统的引入

8.2.2VFS中对象的演绎

8.2.3VFS的超级块

8.2.4VFS的索引结点

8.2.5目录项对象

8.2.6与进程相关的文件结构

8.2.7主要数据结构间的关系

8.2.8实例——观察数据结构中的数据

8.3文件系统的注册、安装与卸载

8.3.1文件系统的注册和注销

8.3.2文件系统的安装

8.3.3文件系统的卸载

8.4文件的打开与读写

8.4.1文件打开

8.4.2文件读写

8.5编写一个文件系统

8.5.1Linux文件系统的实现要素

8.5.2什么是Romfs文件系统

8.5.3Romfs文件系统布局与文件结构

8.5.4具体实现的对象

8.6小结

习题


第9章 设备驱动

9.1概述

9.2设备驱动程序框架

9.3I/O空间的管理

9.3.1I/O端口和I/O内存

9.3.2I/O资源管理

9.3.3访问I/O端口空间

9.3.4访问I/O内存资源

9.4字符设备驱动程序

9.4.1字符设备的数据结构

9.4.2分配和释放设备号

9.4.3字符设备驱动的组成

9.4.4加载和卸载函数

9.4.5实现file_operaions中定义的函数

9.5块驱动程序

9.5.1块驱动程序的注册

9.5.2块设备请求

9.6小结

习题


参考文献
Copyright(C)清华大学出版社有限公司,All Rights Reserved 京ICP备10035462号 联系我们