简介
本书从原理、技术、实现三个方面讲述操作系统原理和编程思想以及编程方法。这种集原理、技术、实现于一身的讲述操作系统原理的方法是本书的独到之处。本书分别给出了四个大的核心层次和若干应用程序层次上的编程实例。因此,全书并没有只停留在介绍操作系统普遍使用的基本概念和基本原理,而是进一步探究un叮核心数据结构和程序设计思路以及编程方法,并在一定范围内探讨了linux内核的实现方案所具有的优缺点,从而启迪和锻炼读者的创新意识。
本书适合作为高年级本科生和研究生操作系统课程教材,也可以作为操作系统开发人员以及系统管理员参考用书。
本书是针对计算机操作系统原理课程的教材,从原理、技术、实现三个方面讲述了操作系统原理和编程思想以及编程方法。书中探究了linux核心数据结构和程序设计思路,并在一定范围内探讨了linux内核的实现 方案所具有的优缺点,从而启迪和锻炼读者的创新意识。本书不仅适用作高年级本科生和研究生教材,也可以供开发人员和系统管理员参考。
目录
第一部分 操作系统初始化
第1章 操作系统概述
1.1 操作系统的定义
1.1.1 计算机系统层次结构图
1.1.2 操作系统的定义
1.2 操作系统发展过程中的设计需求分析
1.2.1 没有操作系统的第一代计算机
1.2.2 具有简单批处理操作系统的第二代计算机
1.2.3 简单批处理操作系统功能分析
1.2.4 多道程序设计的批处理操作系统
1.2.5 多道程序设计的分时操作系统
1.2.6 其他操作系统
1.3 内核体系结构模型
1.3.1 大型系统软件分析方法
1.3.2 操作系统结构模型
1.3.3 unix内核系统结构模型
1.4 linux操作系统的出现
1.5 操作系统如何运行一个用户程序
1.5.1 操作系统运行的全过程
1.5.2 客户/服务器工作流程
.1.5.3 客户/服务器实例
1.6 重要思想和理论
1.6.1 重要思想
1.6.2 重要理论
1.7 小结
1.8 练习题
1.9 参考文献
第2章 i386硬件与软件接口技术
2.1 微型计算机硬件组成
2.1.1 微型计算机基本组成
2.1.2 微处理器分类
2.1.3 微处理器结构的发展
2.1.4 微型计算机总线结构
2.2 实模式软件结构
2.2.1 实模式下软件组织
2.2.2 实模式主存储器地址的产生
2.2.3 实模式输入/输出地址空间
2.3 保护模式下存储器管理单元mmu
2.3.1 描述符寄存器
2.3.2 描述符
2.3.3 虚拟地址和虚拟地址空间
2.3.4 虚实地址转换
2.3.5 保护模式指令集
2.4 保护模式和保护
2.4.1 多任务与分时系统
2.4.2 保护环
2.4.3 保护机制
2.4.4 保护性检查
2.4.5 越级访问存储器的代码段和数据段
2.5 任务切换机制
2.6 小结
2.7 练习题
2.8 参考文献
第3章 linux系统引导过程
3.1 bios启动过程
3.1.1 i386芯片的启动状态
3.1.2 bios加载操作系统引导程序
3.2 引导过程
3.2.1 软盘引导过程
3.2.2 硬盘引导过程
3.2.3 lild运行过程分析
3.3 实模式下的系统初始化setup()函数
3.3.1 setup.s代码签名检查
3.3.2 设置参数
3.3.3 准备进入保护模式
3.3.4 setup.s程序流程图
3.3.5 执行setup.s程序后内存分配图
3.3.6 setup.s中全局描述符表分析
3.4 内核解压缩过程startup_32()
3.5 保护模式下的系统初始化startup_32()
3.5.1 在startup_32中完成临时页表的初始化
3.5.2 设置全局描述符表
3.6 小结
3.7 练习题
3.8 参考文献
第4章 启动linux内核
4.1 初始化系统内核
4.1.1 初始化与体系结构相关的硬件数据结构
4.1.2 解析内核选项
4.2 init()函数与init进程
4.3 init()函数执行流程
4.3.1 继续初始化系统内核
4.3.2 系统进程的生成
4.3.3 init进程
4.4 shell命令文本的执行
4.4.1 执行脚本文件/etc/rc.d/re.sysinit
4.4.2 执行脚本文件/etc/rc.d/ron.d目录中的各个命令
4.4.3 各终端进程的生成
4.5 小结
4.6 练习题
4.7 参考文献
第二部分 并发控制原理及其实现
第5章 程序和进程
5.1 并发控制
5.1.1 多道程序设计与分时共享
5.1.2 并发控制的硬件支持
5.2 进程的定义和特征
5.2.1 程序与进程
5.2.2 从并发机制理解进程
5.2.3 进程的特征
5.3 线程
5.3.1 多线程
5.3.2 内核线程和用户线程
5.4 操作系统控制进程的基本方法
5.5 内核中进程的实现
5.5.1 进程控制块pcb
5.5.2 进程状态
5.5.3 linux进程控制块
5.5.4 linux系统0号进程的控制块
5.5.5 linux进程状态
5.6 进程的组织
5.6.1 进程链表和运行队列链表
5.6.2 pidhash链表
5.6.3 如何寻址当前进程的pcb
5.7 内核创建新进程
5.8 linux fork的编程实现
5.8.1 内核函数do_fork
5.8.2 调用fork()的编程实例
5.8.3 内核怎样运行一个新程序
5.9 linux exec的编程实现
5.9.1 运行新程序的do_execve()
5.9.2 二进制处理程序load_binary()完成的工作
5.9.3 使用fork__exec组合的编程实例
5.10 从程序到进程
5.10.1 文件系统中可执行文件的一般格式
5.10.2 shell进程执行用户程序的过程
5.11 进程的终止
5.12 编程实例--linux守护进程的编程方法
5.12.1 进程组、会话和控制终端
5.12.2 linux守护进程编程细则
5.12.3 linux守护进程实例
5.13 小结
5.14 练习题
5.15 参考文献
第6章 互斥与同步
6.1 并发进程控制的基本原理
6.1.1 竞争条件
6.1.2 同步与互斥
6.1.3 对互斥操作的要求
6.2 竞争条件产生的原因
6.2.1 原子操作
6.2.2 原子操作的实例
6.3 基于共享变量的同步操作
6.3.1 忙等待
6.3.2 锁变量
6.3.3 testandset与swap指令
6.4 信号量
6.5 内核使用的p、v操作实例
6.5.1 down操作
6.5.2 up操作
6.5.3 同步slab高速缓存的信号量
6.5.4 同步内存描述符的信号量
6.5.5 同步索引节点的信号量
6.6 内核采用的其他同步技术
6.6.1 内核是不可强占的
6.6.2 关中断
6.7 等待对列及其操作
6.8 小结
6.9 练习题
6.10 参考文献
第7章 死锁与饥饿
7.1 死锁分析
7.1.1 可剥夺资源与不可剥夺资源
7.1.2 死锁定义
7.1.3 死锁的条件
7.1.4 资源分配模型图
7.2 死锁预防
7.3 死锁避免
7.3.1 系统资源分配的表示方法
7.3.2 系统拒绝启动进程
7.3.3 系统拒绝分配资源
7.4 死锁检测和恢复
7.4.1 死锁检测算法
7.4.2 死锁检测的时机
7.4.3 从死锁中恢复
7.5 最简单的死锁策略
7.6 饥饿
7.7 小结
7.8 练习题
7.9 参考文献
第8章 进程调度
8.1 进程调度的基本原理
8.1.1 调度程序的设计目标
8.1.2 选择合适的调度策略
8.1.3 时间测度指标
8.2 非强占方式调度算法
8.2.1 先来先服务
8.2.2 最短作业优先
8.2.3 优先级调度
8.3 强占式调度算法
8.3.1 轮转法
8.3.2 多级队列
8.3.3 反馈调度算法
8.4 linux进程调度的实现
8.4.1 在pcb中与调度有关的数据成员
8.4.2 linux调度策略
8.4.3 linux调度函数schedule()
8.4.4 linux调度机制
8.5 调度程序的编程实例
8.6 小结
8.7 练习题
8.8 参考文献
第9章 中断技术
9.1 基于ibm pc机的中断接口电路
9.1.1 intel 80386芯片的中断接口
9.1.2 使用82c59芯片连结外围设备的中断接口电路
9.2 中断和异常
9.2.1 异常
9.2.2 中断和异常的优先级
9.3 中断向量表和中断描述符表
9.3.1 中断和异常向量
9.3.2 中断门和陷阱门的区别
9.4 linux中断系统的初始化过程
9.4.1 第一次初始化中断描述符表
9.4.2 第二次初始化中断描述符表
9.5 异常处理
9.5.1 异常处理过程
9.5.2 异常处理程序
9.5.3 内核管理硬件资源的两种异常
9.6 中断处理
9.6.1 硬件设备使用的中断向量
9.6.2 中断处理使用的数据结构
9.6.3 中断系统初始化函数init_irq
9.6.4 中断处理程序的执行过程
9.6.5 保存断点现场
9.6.6 执行所有的中断服务例程
9.6.7 内核模式的设备驱动程序
9.7 下半部分
9.7.1 linux对下半部分的组织
9.7.2 执行do_bottom_half()函数
9.7.3 调度do_bottom_half()函数运行的时机
9.8 动态安装和释放中断处理程序
9.9 从中断和异常返回
9.10 一个中断处理实例
9.10.1 定时器中断的上半部
9.10.2 定时器中断的下半部
9.10.3 预定义的任务队列
9.11 小结
9.12 练习题
9.13 参考文献
第10章 系统调用接口
10.1 标准c函数库和系统调用
10.2 模式转换的硬件处理
10.2.1 陷阱门处理的模式转换
10.2.2 调用门处理的模式转换
10.3 系统调用接口
10.3.1 内核对系统调用的初始化
10.3.2 系统调用的执行流程
10.3.3 封装例程
10.3.4 系统调用号与系统调用表
10.3.5 system_call的执行过程
10.4 lcall7的执行过程
10.5 内核中添加新系统调用的实例
10.6 小结
10.7 练习题
10.8 参考文献
第三部分 os资源管理及其实现
第11章 存储器管理及linux实现
11.1 存储器功能需求分析
11.1.1 重定位
11.1.2 保护
11.1.3 共享
11.2 存储器的组织方式
11.2.1 逻辑组织
11.2.2 物理组织
11.3 内存管理
11.3.1 固定分区
11.3.2 动态分区
11.4 位图
11.5 伙伴系统
11.6 重定位技术
11.6.1 存储器管理使用的地址类型
11.6.2 固定分区使用的重定位技术
11.6.3 分页使用的重定位技术
11.6.4 分段使用的重定位技术
11.7 虚拟存储器管理技术
11.7.1 局部性原理
11.7.2 虚拟存储器管理软件
11.7.3 交换区
11.8 通用存储器管理模型
11.9 linux在i386中的分段和分页
11.9.1 linux使用的分段
11.9.2 linux使用的分页
11.9.3 linux在i386平台上定义的页表项格式
11.10 linux内存管理
11.10.1 描述内存页框的page数据结构
11.10.2 基于buddy算法的内存页框管理
11.11 基于slab算法的内存区管理
11.11.1 slab分配器的组成
11.11.2 slab分配器与页框级分配器的接口和实现
11.11.3 连续内存区的分配和释放函数
11.12 非连续内存区的分配和释放
11.12.1 描述非连续内存区的数据结构
11.12.2 分配和释放非连续内存区的函数
11.13 进程的地址空间
11.13.1 struct mm_struct和struct vm_area_struct结构
11.13.2 进程地址空间的存取权限
11.13.3 对线性区进行处理的底层函数
11.13.4 进程线性地址空间的映射do_mmap()
11.13.5 释放进程线性地址空间do_munmap()
11.14 页面失效处理
11.14.1 缺页异常处理程序do_page_fault()
11.14.2 请求调页
11.14.3 写时拷贝
11.14.4 调用sys_brk动态增长内存
11.15 交换
11.15.1 描述交换空间的数据结构
11.15.2 页面替换策略
11.16 页换出操作
11.16.1 页交换守护进程kswapd
11.16.2 kswapd()的执行流程
11.16.3 页换人do_swap_page()
11.16.4 页换出
11.17 对交换区数据结构进行操作的函数
11.18 小结
11.19 练习题
11.20 参考文献
第12章 文件管理及linux实现
12.1 磁盘的物理组织与调度
12.1.1 磁盘结构
12.1.2 磁盘的逻辑组织
12.1.3 磁盘性能参数
12.1.4 磁盘调度算法
12.1.5 磁盘纠错
12.2 文件管理需求分析
12.2.1 文件管理的设计目标
12.2.2 文件管理系统结构模型
12.3 文件
12.3.1 文件结构
12.3.2 文件类型和存取方式
12.3.3 文件属性
12.4 目录
12.4.1 目录结构
12.4.2 路径名
12.4.3 目录操作
12.5 文件系统的组织
12.5.1 文件组织
12.5.2 目录表表项的格式
12.5.3 共享文件
12.5.4 磁盘空间管理
12.5.5 文件系统的一致性
12.6 文件系统的保护机制
12.7 虚拟文件系统vfs
12.7.1 虚拟文件系统的设计思路
12.7.2 虚拟文件系统vfs框架
12.8 linux虚拟文件系统的数据结构
12.8.1 vfs超级块数据结构
12.8.2 vfs的目录项数据结构
12.8.3 vfs的inode节点数据结构
12.8.4 vfs中数据结构之间的关系
12.9 对虚拟文件系统的管理
12.9.1 文件系统注册链表
12.9.2 文件系统安装注册链表
12.9.3 根文件系统的安装
12.10 对文件系统模块的安装和卸载
12.10.1 安装一个文件系统sys_mount()
12.10.2 卸载一个文件系统sys_umount()
12.11 进程与文件系统的联系
12.11.1 文件对象
12.11.2 用户打开文件表
12.11.3 根目录和当前工作目录
12.12 文件加锁
12.13 磁盘数据的内存高速缓冲区
12.13.1 缓冲区高速缓存的数据结构
12.13.2 buffer cache的组织
12.13.3 对buffer cache的基本操作
12.13.4 把脏缓冲区写入磁盘
12.14 ext2文件系统
12.14.1 ext2对物理磁盘的组织
12.14.2 ext2减少碎片的方案
12.14.3 ext2对磁盘块的分配原则
12.15 ext2磁盘重要数据结构
12.15.1 ext2的目录项数据结构
12.15.2 ext2的磁盘i节点结构
12.15.3 ext2磁盘上的超级块
12.15.4 ext2的组描述符
12.15.5 ext2的块位图和索引节点位图
12.15.6 ext2存放文件的数据块
12.16 ext2的内核组织'
12.16.1 ext2的内存超级块
12.16.2 ext2的内存i节点
12.16.3 磁盘i节点读入高速缓存的过程
12.17 如何通过路径名找到索引节点
12.18 ext3文件系统
12.18.1 关于日志式文件系统
12.18.2 ext2文件系统的不足
12.18.3 日志文件系统的工作原理
12.18.4 ext3日志文件系统的具体实现
12.18.5 ext3文件系统的额外开销
12.19 小结
12.20 练习题
12.21 参考文献
第13章 i/o设备管理与设备驱动程序
13.1 i/o系统的基本组成
13.1.1 i/o设备的分类
13.1.2 内核对设备的分类
13.1.3 i/o接口功能
13.1.4 cpu与i/o设备交互的控制方式
13.2 i/o系统管理软件的设计原理
13.3 用户程序
13.4 逻辑i/o管理
13.4.1 设备命名方法
13.4.2 访问设备的权限和设备保护
13.4.3 为设备分配和释放缓冲区
13.5 设备驱动程序和中断控制层
13.6 设备驱动程序的组织实例
13.6.1 设备驱动程序的工作原理
13.6.2 逻辑i/o与设备驱动程序接口
13.6.3 系统调用与驱动程序接口
13.6.4 安装中断处理程序
13.7 设备驱动程序模块
13.7.1 静态链接的设备驱动程序模块
13.7.2 可动态加载和卸载的设备驱动程序模块
13.7.3 用户空间的设备驱动程序
13.8 了解系统基本配置
13.8. 1 i/o端口
13.8.2 内核中驱动程序清单
13.8.3 内核的中断报告显示
13.9 设备驱动程序中使用的内核函数
13.9.1 操作i/o端口的函数
13.9.2 分配和释放内存的函数
13.9.3 访问设备卡上内存的函数
13.9.4 同步和计时要使用的内核函数
13.9.5 中断管理内核函数
13.9.6 注册和注销设备的内核函数
13.9.7 其他内核函数
13.10 编制设备驱动程序的基本方法
13.10.1 设备驱动程序与内核
13.10.2 驱动程序与硬件
13.10.3 驱动程序与引导
13.u 内核级设备驱动程序编程实例
13.11.1 编程用到的硬件
13.11.2 上半部与下半部各自的功能
13.11.3 内核驱动程序的上半部编程
13.11.4 内核驱动程序的下半部编程
13.11.5 模块的安装与卸载
13.11.6 访问设备驱动程序的用户程序
13.11.7 编译设备驱动程序
13.11.8 使用内核设备驱动程序模块
13.12 小结
13.13 练习题
13.14 参考文献
第四部分 ipc和网络编程接口
第14章 最早的ipc方法:信号与管道
14.1 进程间通信的设计目标
14.2 信号机制
14.2.1 什么是信号
14.2.2 信号的产生与处理
14.3 发送信号
14.3.1 信号操作用到的数据结构
14.3.2 数据结构sigset_t上的一组简单操作函数
14.3.3 传送信号
14.4 接收信号
14.4.1 分析do_signal()函数
14.4.2 忽略信号
14.4.3 执行一个默认操作
14.4.4 捕获一个信号
14.4.5 执行信号处理程序
14.4.6 终止信号处理程序
14.4.7 被中断的系统调用获得重新执行
14.5 捕获一个信号的编程实例
14.6 管道
14.6.1 struct pipe_inode_info数据结构
14.6.2 do-pipe()--创建一个管道
14.6.3 读管道
14.6.4 写管道
14.6.5 撤销管道
14.7 无名管道的编程实例
14.8 有名管道fifo
14.8.1 创建一个fifo
14.8.2 打开fifo
14.8.3 读写fifo
14.9 编写有名管道的实用程序
14.10 小结
14.11 练习题
14.12 参考文献
第15章 system v进程间通信
15.1 与ipc相关的系统调用
15.1.1 创建ipc资源的系统调用
15.1.2 控制ipc资源的系统调用
15.1. 3 操作ipc资源的系统调用
15.1.4 ipc系统调用在i386体系结构中的实现
15.2 ipc资源中的公共元素及属性
15.3 ipc信号量
15.3.1 与信号量操作相关的数据结构
15.3.2 sys_semop()函数的功能
15.3.3 sys_semctl()函数的功能
15.4 ipc信号量的编程示例
15.5 信号量小结
15.6 ipc消息队列
15.6.1 与消息队列操作相关的数据结构
15.6.2 发送一个消息
15.6.3 接收消息和释放消息队列
15.7 ipc消息队列的编程示例
15.8 消息队列小结
15.9 共享内存
15.9.1 ipc共享内存的数据结构
15.9.2 连接ipc共享内存
15.9.3 ipc共享内存请求调页的过程
15.9.4 剥离和释放ipc共享内存段
15.10 ipc共享内存编程示例
15.11 小结
15.12 练习题
15.13 参考文献
第16章 linux网络接口及内核实现
16.1 linux网络系统分层结构
16.1.1 osi模型和网际协议族
16.1.2 linux网络协议族分层结构
16.2 tcp和udp
16.2.1 传输控制协议--tcp
16.2.2 用户数据报协议--udp
16.3 内核中与发送/接收相关的数据结构
16.3.1 套接口地址结构
16.3.2 数据包结构
16.3.3 建立网络连接的数据结构
16.3.4 协议操作函数使用的数据结构
16.4 网络连接的建立和关闭
16.4.1 网络连接的建立
16.4.2 关闭网络连接
16.5 发送数据
16.5.1 发送数据的系统调用接口
16.5.2 从inet协议层到ip层
16.5.3 ip层到硬件层的数据发送过程
16.5.4 硬件层的数据发送过程
16.6 接收数据
16.6.1 接收数据的系统调用接口
16.6.2 硬件层接收数据分析
16.6.3 从ip层接收数据
16.6.4 从inet层接收数据
16.7 小结
16.8 练习题
16.9 参考文献
第17章 tcp套接口编程的基本方法
17.1 套接口函数
17.1.1 socket()函数
17.1.2 其他套接口函数
17.2 连接的建立和终止过程
17.2.1 建立tcp连接的过程
17.2.2 终止tcp连接的过程
17.3 编制tcp客户程序
17.3.1 tcp客户程序设计方法
17.3.2 tcp客户程序的实现
17.4 编制tcp服务器程序
17.4.1 一个简单tcp服务器的编程方法
17.4.2 一个简单tcp服务器的实现
17.4.3 tcp并发服务器的实现
17.5 小结
17.6 练习题
17.7 参考文献
第18章 udp套接口编程的基本方法
18.i udp程序使用的套接口函数
18.2 发送udp数据报的编程实例
18.3 接收udp数据报的编程实例
18.4 小结
18.5 练习题
18.6 参考文献
附录 linux源代码目录结构与内容
第1章 操作系统概述
1.1 操作系统的定义
1.1.1 计算机系统层次结构图
1.1.2 操作系统的定义
1.2 操作系统发展过程中的设计需求分析
1.2.1 没有操作系统的第一代计算机
1.2.2 具有简单批处理操作系统的第二代计算机
1.2.3 简单批处理操作系统功能分析
1.2.4 多道程序设计的批处理操作系统
1.2.5 多道程序设计的分时操作系统
1.2.6 其他操作系统
1.3 内核体系结构模型
1.3.1 大型系统软件分析方法
1.3.2 操作系统结构模型
1.3.3 unix内核系统结构模型
1.4 linux操作系统的出现
1.5 操作系统如何运行一个用户程序
1.5.1 操作系统运行的全过程
1.5.2 客户/服务器工作流程
.1.5.3 客户/服务器实例
1.6 重要思想和理论
1.6.1 重要思想
1.6.2 重要理论
1.7 小结
1.8 练习题
1.9 参考文献
第2章 i386硬件与软件接口技术
2.1 微型计算机硬件组成
2.1.1 微型计算机基本组成
2.1.2 微处理器分类
2.1.3 微处理器结构的发展
2.1.4 微型计算机总线结构
2.2 实模式软件结构
2.2.1 实模式下软件组织
2.2.2 实模式主存储器地址的产生
2.2.3 实模式输入/输出地址空间
2.3 保护模式下存储器管理单元mmu
2.3.1 描述符寄存器
2.3.2 描述符
2.3.3 虚拟地址和虚拟地址空间
2.3.4 虚实地址转换
2.3.5 保护模式指令集
2.4 保护模式和保护
2.4.1 多任务与分时系统
2.4.2 保护环
2.4.3 保护机制
2.4.4 保护性检查
2.4.5 越级访问存储器的代码段和数据段
2.5 任务切换机制
2.6 小结
2.7 练习题
2.8 参考文献
第3章 linux系统引导过程
3.1 bios启动过程
3.1.1 i386芯片的启动状态
3.1.2 bios加载操作系统引导程序
3.2 引导过程
3.2.1 软盘引导过程
3.2.2 硬盘引导过程
3.2.3 lild运行过程分析
3.3 实模式下的系统初始化setup()函数
3.3.1 setup.s代码签名检查
3.3.2 设置参数
3.3.3 准备进入保护模式
3.3.4 setup.s程序流程图
3.3.5 执行setup.s程序后内存分配图
3.3.6 setup.s中全局描述符表分析
3.4 内核解压缩过程startup_32()
3.5 保护模式下的系统初始化startup_32()
3.5.1 在startup_32中完成临时页表的初始化
3.5.2 设置全局描述符表
3.6 小结
3.7 练习题
3.8 参考文献
第4章 启动linux内核
4.1 初始化系统内核
4.1.1 初始化与体系结构相关的硬件数据结构
4.1.2 解析内核选项
4.2 init()函数与init进程
4.3 init()函数执行流程
4.3.1 继续初始化系统内核
4.3.2 系统进程的生成
4.3.3 init进程
4.4 shell命令文本的执行
4.4.1 执行脚本文件/etc/rc.d/re.sysinit
4.4.2 执行脚本文件/etc/rc.d/ron.d目录中的各个命令
4.4.3 各终端进程的生成
4.5 小结
4.6 练习题
4.7 参考文献
第二部分 并发控制原理及其实现
第5章 程序和进程
5.1 并发控制
5.1.1 多道程序设计与分时共享
5.1.2 并发控制的硬件支持
5.2 进程的定义和特征
5.2.1 程序与进程
5.2.2 从并发机制理解进程
5.2.3 进程的特征
5.3 线程
5.3.1 多线程
5.3.2 内核线程和用户线程
5.4 操作系统控制进程的基本方法
5.5 内核中进程的实现
5.5.1 进程控制块pcb
5.5.2 进程状态
5.5.3 linux进程控制块
5.5.4 linux系统0号进程的控制块
5.5.5 linux进程状态
5.6 进程的组织
5.6.1 进程链表和运行队列链表
5.6.2 pidhash链表
5.6.3 如何寻址当前进程的pcb
5.7 内核创建新进程
5.8 linux fork的编程实现
5.8.1 内核函数do_fork
5.8.2 调用fork()的编程实例
5.8.3 内核怎样运行一个新程序
5.9 linux exec的编程实现
5.9.1 运行新程序的do_execve()
5.9.2 二进制处理程序load_binary()完成的工作
5.9.3 使用fork__exec组合的编程实例
5.10 从程序到进程
5.10.1 文件系统中可执行文件的一般格式
5.10.2 shell进程执行用户程序的过程
5.11 进程的终止
5.12 编程实例--linux守护进程的编程方法
5.12.1 进程组、会话和控制终端
5.12.2 linux守护进程编程细则
5.12.3 linux守护进程实例
5.13 小结
5.14 练习题
5.15 参考文献
第6章 互斥与同步
6.1 并发进程控制的基本原理
6.1.1 竞争条件
6.1.2 同步与互斥
6.1.3 对互斥操作的要求
6.2 竞争条件产生的原因
6.2.1 原子操作
6.2.2 原子操作的实例
6.3 基于共享变量的同步操作
6.3.1 忙等待
6.3.2 锁变量
6.3.3 testandset与swap指令
6.4 信号量
6.5 内核使用的p、v操作实例
6.5.1 down操作
6.5.2 up操作
6.5.3 同步slab高速缓存的信号量
6.5.4 同步内存描述符的信号量
6.5.5 同步索引节点的信号量
6.6 内核采用的其他同步技术
6.6.1 内核是不可强占的
6.6.2 关中断
6.7 等待对列及其操作
6.8 小结
6.9 练习题
6.10 参考文献
第7章 死锁与饥饿
7.1 死锁分析
7.1.1 可剥夺资源与不可剥夺资源
7.1.2 死锁定义
7.1.3 死锁的条件
7.1.4 资源分配模型图
7.2 死锁预防
7.3 死锁避免
7.3.1 系统资源分配的表示方法
7.3.2 系统拒绝启动进程
7.3.3 系统拒绝分配资源
7.4 死锁检测和恢复
7.4.1 死锁检测算法
7.4.2 死锁检测的时机
7.4.3 从死锁中恢复
7.5 最简单的死锁策略
7.6 饥饿
7.7 小结
7.8 练习题
7.9 参考文献
第8章 进程调度
8.1 进程调度的基本原理
8.1.1 调度程序的设计目标
8.1.2 选择合适的调度策略
8.1.3 时间测度指标
8.2 非强占方式调度算法
8.2.1 先来先服务
8.2.2 最短作业优先
8.2.3 优先级调度
8.3 强占式调度算法
8.3.1 轮转法
8.3.2 多级队列
8.3.3 反馈调度算法
8.4 linux进程调度的实现
8.4.1 在pcb中与调度有关的数据成员
8.4.2 linux调度策略
8.4.3 linux调度函数schedule()
8.4.4 linux调度机制
8.5 调度程序的编程实例
8.6 小结
8.7 练习题
8.8 参考文献
第9章 中断技术
9.1 基于ibm pc机的中断接口电路
9.1.1 intel 80386芯片的中断接口
9.1.2 使用82c59芯片连结外围设备的中断接口电路
9.2 中断和异常
9.2.1 异常
9.2.2 中断和异常的优先级
9.3 中断向量表和中断描述符表
9.3.1 中断和异常向量
9.3.2 中断门和陷阱门的区别
9.4 linux中断系统的初始化过程
9.4.1 第一次初始化中断描述符表
9.4.2 第二次初始化中断描述符表
9.5 异常处理
9.5.1 异常处理过程
9.5.2 异常处理程序
9.5.3 内核管理硬件资源的两种异常
9.6 中断处理
9.6.1 硬件设备使用的中断向量
9.6.2 中断处理使用的数据结构
9.6.3 中断系统初始化函数init_irq
9.6.4 中断处理程序的执行过程
9.6.5 保存断点现场
9.6.6 执行所有的中断服务例程
9.6.7 内核模式的设备驱动程序
9.7 下半部分
9.7.1 linux对下半部分的组织
9.7.2 执行do_bottom_half()函数
9.7.3 调度do_bottom_half()函数运行的时机
9.8 动态安装和释放中断处理程序
9.9 从中断和异常返回
9.10 一个中断处理实例
9.10.1 定时器中断的上半部
9.10.2 定时器中断的下半部
9.10.3 预定义的任务队列
9.11 小结
9.12 练习题
9.13 参考文献
第10章 系统调用接口
10.1 标准c函数库和系统调用
10.2 模式转换的硬件处理
10.2.1 陷阱门处理的模式转换
10.2.2 调用门处理的模式转换
10.3 系统调用接口
10.3.1 内核对系统调用的初始化
10.3.2 系统调用的执行流程
10.3.3 封装例程
10.3.4 系统调用号与系统调用表
10.3.5 system_call的执行过程
10.4 lcall7的执行过程
10.5 内核中添加新系统调用的实例
10.6 小结
10.7 练习题
10.8 参考文献
第三部分 os资源管理及其实现
第11章 存储器管理及linux实现
11.1 存储器功能需求分析
11.1.1 重定位
11.1.2 保护
11.1.3 共享
11.2 存储器的组织方式
11.2.1 逻辑组织
11.2.2 物理组织
11.3 内存管理
11.3.1 固定分区
11.3.2 动态分区
11.4 位图
11.5 伙伴系统
11.6 重定位技术
11.6.1 存储器管理使用的地址类型
11.6.2 固定分区使用的重定位技术
11.6.3 分页使用的重定位技术
11.6.4 分段使用的重定位技术
11.7 虚拟存储器管理技术
11.7.1 局部性原理
11.7.2 虚拟存储器管理软件
11.7.3 交换区
11.8 通用存储器管理模型
11.9 linux在i386中的分段和分页
11.9.1 linux使用的分段
11.9.2 linux使用的分页
11.9.3 linux在i386平台上定义的页表项格式
11.10 linux内存管理
11.10.1 描述内存页框的page数据结构
11.10.2 基于buddy算法的内存页框管理
11.11 基于slab算法的内存区管理
11.11.1 slab分配器的组成
11.11.2 slab分配器与页框级分配器的接口和实现
11.11.3 连续内存区的分配和释放函数
11.12 非连续内存区的分配和释放
11.12.1 描述非连续内存区的数据结构
11.12.2 分配和释放非连续内存区的函数
11.13 进程的地址空间
11.13.1 struct mm_struct和struct vm_area_struct结构
11.13.2 进程地址空间的存取权限
11.13.3 对线性区进行处理的底层函数
11.13.4 进程线性地址空间的映射do_mmap()
11.13.5 释放进程线性地址空间do_munmap()
11.14 页面失效处理
11.14.1 缺页异常处理程序do_page_fault()
11.14.2 请求调页
11.14.3 写时拷贝
11.14.4 调用sys_brk动态增长内存
11.15 交换
11.15.1 描述交换空间的数据结构
11.15.2 页面替换策略
11.16 页换出操作
11.16.1 页交换守护进程kswapd
11.16.2 kswapd()的执行流程
11.16.3 页换人do_swap_page()
11.16.4 页换出
11.17 对交换区数据结构进行操作的函数
11.18 小结
11.19 练习题
11.20 参考文献
第12章 文件管理及linux实现
12.1 磁盘的物理组织与调度
12.1.1 磁盘结构
12.1.2 磁盘的逻辑组织
12.1.3 磁盘性能参数
12.1.4 磁盘调度算法
12.1.5 磁盘纠错
12.2 文件管理需求分析
12.2.1 文件管理的设计目标
12.2.2 文件管理系统结构模型
12.3 文件
12.3.1 文件结构
12.3.2 文件类型和存取方式
12.3.3 文件属性
12.4 目录
12.4.1 目录结构
12.4.2 路径名
12.4.3 目录操作
12.5 文件系统的组织
12.5.1 文件组织
12.5.2 目录表表项的格式
12.5.3 共享文件
12.5.4 磁盘空间管理
12.5.5 文件系统的一致性
12.6 文件系统的保护机制
12.7 虚拟文件系统vfs
12.7.1 虚拟文件系统的设计思路
12.7.2 虚拟文件系统vfs框架
12.8 linux虚拟文件系统的数据结构
12.8.1 vfs超级块数据结构
12.8.2 vfs的目录项数据结构
12.8.3 vfs的inode节点数据结构
12.8.4 vfs中数据结构之间的关系
12.9 对虚拟文件系统的管理
12.9.1 文件系统注册链表
12.9.2 文件系统安装注册链表
12.9.3 根文件系统的安装
12.10 对文件系统模块的安装和卸载
12.10.1 安装一个文件系统sys_mount()
12.10.2 卸载一个文件系统sys_umount()
12.11 进程与文件系统的联系
12.11.1 文件对象
12.11.2 用户打开文件表
12.11.3 根目录和当前工作目录
12.12 文件加锁
12.13 磁盘数据的内存高速缓冲区
12.13.1 缓冲区高速缓存的数据结构
12.13.2 buffer cache的组织
12.13.3 对buffer cache的基本操作
12.13.4 把脏缓冲区写入磁盘
12.14 ext2文件系统
12.14.1 ext2对物理磁盘的组织
12.14.2 ext2减少碎片的方案
12.14.3 ext2对磁盘块的分配原则
12.15 ext2磁盘重要数据结构
12.15.1 ext2的目录项数据结构
12.15.2 ext2的磁盘i节点结构
12.15.3 ext2磁盘上的超级块
12.15.4 ext2的组描述符
12.15.5 ext2的块位图和索引节点位图
12.15.6 ext2存放文件的数据块
12.16 ext2的内核组织'
12.16.1 ext2的内存超级块
12.16.2 ext2的内存i节点
12.16.3 磁盘i节点读入高速缓存的过程
12.17 如何通过路径名找到索引节点
12.18 ext3文件系统
12.18.1 关于日志式文件系统
12.18.2 ext2文件系统的不足
12.18.3 日志文件系统的工作原理
12.18.4 ext3日志文件系统的具体实现
12.18.5 ext3文件系统的额外开销
12.19 小结
12.20 练习题
12.21 参考文献
第13章 i/o设备管理与设备驱动程序
13.1 i/o系统的基本组成
13.1.1 i/o设备的分类
13.1.2 内核对设备的分类
13.1.3 i/o接口功能
13.1.4 cpu与i/o设备交互的控制方式
13.2 i/o系统管理软件的设计原理
13.3 用户程序
13.4 逻辑i/o管理
13.4.1 设备命名方法
13.4.2 访问设备的权限和设备保护
13.4.3 为设备分配和释放缓冲区
13.5 设备驱动程序和中断控制层
13.6 设备驱动程序的组织实例
13.6.1 设备驱动程序的工作原理
13.6.2 逻辑i/o与设备驱动程序接口
13.6.3 系统调用与驱动程序接口
13.6.4 安装中断处理程序
13.7 设备驱动程序模块
13.7.1 静态链接的设备驱动程序模块
13.7.2 可动态加载和卸载的设备驱动程序模块
13.7.3 用户空间的设备驱动程序
13.8 了解系统基本配置
13.8. 1 i/o端口
13.8.2 内核中驱动程序清单
13.8.3 内核的中断报告显示
13.9 设备驱动程序中使用的内核函数
13.9.1 操作i/o端口的函数
13.9.2 分配和释放内存的函数
13.9.3 访问设备卡上内存的函数
13.9.4 同步和计时要使用的内核函数
13.9.5 中断管理内核函数
13.9.6 注册和注销设备的内核函数
13.9.7 其他内核函数
13.10 编制设备驱动程序的基本方法
13.10.1 设备驱动程序与内核
13.10.2 驱动程序与硬件
13.10.3 驱动程序与引导
13.u 内核级设备驱动程序编程实例
13.11.1 编程用到的硬件
13.11.2 上半部与下半部各自的功能
13.11.3 内核驱动程序的上半部编程
13.11.4 内核驱动程序的下半部编程
13.11.5 模块的安装与卸载
13.11.6 访问设备驱动程序的用户程序
13.11.7 编译设备驱动程序
13.11.8 使用内核设备驱动程序模块
13.12 小结
13.13 练习题
13.14 参考文献
第四部分 ipc和网络编程接口
第14章 最早的ipc方法:信号与管道
14.1 进程间通信的设计目标
14.2 信号机制
14.2.1 什么是信号
14.2.2 信号的产生与处理
14.3 发送信号
14.3.1 信号操作用到的数据结构
14.3.2 数据结构sigset_t上的一组简单操作函数
14.3.3 传送信号
14.4 接收信号
14.4.1 分析do_signal()函数
14.4.2 忽略信号
14.4.3 执行一个默认操作
14.4.4 捕获一个信号
14.4.5 执行信号处理程序
14.4.6 终止信号处理程序
14.4.7 被中断的系统调用获得重新执行
14.5 捕获一个信号的编程实例
14.6 管道
14.6.1 struct pipe_inode_info数据结构
14.6.2 do-pipe()--创建一个管道
14.6.3 读管道
14.6.4 写管道
14.6.5 撤销管道
14.7 无名管道的编程实例
14.8 有名管道fifo
14.8.1 创建一个fifo
14.8.2 打开fifo
14.8.3 读写fifo
14.9 编写有名管道的实用程序
14.10 小结
14.11 练习题
14.12 参考文献
第15章 system v进程间通信
15.1 与ipc相关的系统调用
15.1.1 创建ipc资源的系统调用
15.1.2 控制ipc资源的系统调用
15.1. 3 操作ipc资源的系统调用
15.1.4 ipc系统调用在i386体系结构中的实现
15.2 ipc资源中的公共元素及属性
15.3 ipc信号量
15.3.1 与信号量操作相关的数据结构
15.3.2 sys_semop()函数的功能
15.3.3 sys_semctl()函数的功能
15.4 ipc信号量的编程示例
15.5 信号量小结
15.6 ipc消息队列
15.6.1 与消息队列操作相关的数据结构
15.6.2 发送一个消息
15.6.3 接收消息和释放消息队列
15.7 ipc消息队列的编程示例
15.8 消息队列小结
15.9 共享内存
15.9.1 ipc共享内存的数据结构
15.9.2 连接ipc共享内存
15.9.3 ipc共享内存请求调页的过程
15.9.4 剥离和释放ipc共享内存段
15.10 ipc共享内存编程示例
15.11 小结
15.12 练习题
15.13 参考文献
第16章 linux网络接口及内核实现
16.1 linux网络系统分层结构
16.1.1 osi模型和网际协议族
16.1.2 linux网络协议族分层结构
16.2 tcp和udp
16.2.1 传输控制协议--tcp
16.2.2 用户数据报协议--udp
16.3 内核中与发送/接收相关的数据结构
16.3.1 套接口地址结构
16.3.2 数据包结构
16.3.3 建立网络连接的数据结构
16.3.4 协议操作函数使用的数据结构
16.4 网络连接的建立和关闭
16.4.1 网络连接的建立
16.4.2 关闭网络连接
16.5 发送数据
16.5.1 发送数据的系统调用接口
16.5.2 从inet协议层到ip层
16.5.3 ip层到硬件层的数据发送过程
16.5.4 硬件层的数据发送过程
16.6 接收数据
16.6.1 接收数据的系统调用接口
16.6.2 硬件层接收数据分析
16.6.3 从ip层接收数据
16.6.4 从inet层接收数据
16.7 小结
16.8 练习题
16.9 参考文献
第17章 tcp套接口编程的基本方法
17.1 套接口函数
17.1.1 socket()函数
17.1.2 其他套接口函数
17.2 连接的建立和终止过程
17.2.1 建立tcp连接的过程
17.2.2 终止tcp连接的过程
17.3 编制tcp客户程序
17.3.1 tcp客户程序设计方法
17.3.2 tcp客户程序的实现
17.4 编制tcp服务器程序
17.4.1 一个简单tcp服务器的编程方法
17.4.2 一个简单tcp服务器的实现
17.4.3 tcp并发服务器的实现
17.5 小结
17.6 练习题
17.7 参考文献
第18章 udp套接口编程的基本方法
18.i udp程序使用的套接口函数
18.2 发送udp数据报的编程实例
18.3 接收udp数据报的编程实例
18.4 小结
18.5 练习题
18.6 参考文献
附录 linux源代码目录结构与内容
操作系统原理·技术与编程
- 名称
- 类型
- 大小
光盘服务联系方式: 020-38250260 客服QQ:4006604884
云图客服:
用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问
Video Player
×
Audio Player
×
pdf Player
×
亲爱的云图用户,
光盘内的文件都可以直接点击浏览哦
无需下载,在线查阅资料!
