Linux 内核设计与实现 第3版 PDF 文档
本书基于 Linux 2.6.34 内核详细介绍了 Linux 内核系统,覆盖了从核心内核系统的应用到内核设计与实现等各方面的内容。本书主要内容包括:进程管理、进程调度、时间管理和定时器、系统调用接口、内存寻址、内存管理和页缓存、VFS、内核同步以及调试技术等。
同时本书也涵盖了 Linux 2.6 内核中颇具特色的内容,包括 CFS 调度程序、抢占式内核、块VO层 以及 IVO调度程序等。本书采用理论与实践相结合的路线,能够带领读者快速走进 Linux 内核世界,真正开发内核代码。
本书适合作为高等院校操作系统课程的教材或参考书,也可供相关技术人员参考。
目录
第1章 Linux内核简介
1.1 Unix的历史
1.2 追寻Linus足迹:Linux简介
1.3 操作系统和内核简介
1.4 Linux内核和传统Unix内核的比较
1.5 Linux内核版本
1.6 Linux内核开发者社区
1.7 小结
第2章 从内核出发
2.1 获取内核源码
2.1.1 使用Git
2.1.1 安装内核源代码
2.1.3 使用补丁
2.2 内核源码树
2.3 编译内核
2.3.1 配置内核
2.3.2 减少编译的垃圾信息
2.3.3 衍生多个编译作业
2.3.4 安装新内核
2.4 内核开发的特点
2.4.1 无libc库抑或无标准头文件
2.4.2 GNUC
2.4.3 没有内存保护机制
2.4.4 不要轻易在内核中使用浮点数
2.4.5 容积小而固定的栈
2.4.6 同步和并发
2.4.7 可移植性的重要性
2.5 小结
第3章 进程管理
3.1 进程
3.2 进程描述符及任务结构
3.2.1 分配进程描述符
3.2.2 进程描述符的存放
3.2.3 进程状态
3.2.4 设置当前进程状态
3.2.5 进程上下文
3.2.6 进程家族树
3.3 进程创建
3.3.1 写时拷贝
3.3.2 forkO
3.3.3 vforkO
3.4 线程在Linux中的实现
3.4.1 创建线程
3.4.2 内核线程
3.5 进程终结
3.5.1 删除进程描述符
3.5.2 孤儿进程造成的进退维谷
3.6 小结
第4章 进程调度
4.1 多任务
4.2 Linux的进程调度
4.3 策略
4.3.1 I/O消耗型和处理器消耗型的进程
4.3.2 进程优先级
4.3.3 时间片
4.3.4 调度策略的活动
4.4 Linux调度算法
4.4.1 调度器类
4.4.2 Unix系统中的进程调度
4.4.3 公平调度
4.5 Linux调度的实现
4.5.1 时间记账
4.5.2 进程选择
4.5.3 调度器入口
4.5.4 睡眠和唤醒
4.6 抢占和上下文切换
4.6.1 用户抢占
4.6.2 内核抢占
4.7 实时调度策略
4.8 与调度相关的系统调用
4.8.1 与调度策略和优先级相关的系统调用
4.8.2 与处理器绑定有关的系统调用
4.8.3 放弃处理器时间
4.9 小结
第5章 系统调用
5.1 与内核通信
5.2 API、POSIX和C库
5.3 系统调用
5.3.1 系统调用号
5.3.2 系统调用的性能
5.4 系统调用处理程序
5.4.1 指定恰当的系统调用
5.4.2 参数传递
5.5 系统调用的实现
5.5.1 实现系统调用
5.5.2 参数验证
5.6 系统调用上下文
5.6.1 绑定一个系统调用的最后步骤
5.6.2 从用户空间访问系统调用
5.6.3 为什么不通过系统调用的方式实现
5.7 小结
第6章 内核数据结构
6.1 链表
6.1.1 单向链表和双向链表
6.1.2 环形链表
6.1.3 沿链表移动
6.1.4 Linux内核中的实现
6.1.5 操作链表
6.1.6 遍历链表
6.2 队列
6.2.1 kfifo
6.2.2 创建队列
6.2.3 推入队列数据
6.2.4 摘取队列数据
6.2.5 获取队列长度
6.2.6 重置和撤销队列
6.2.7 队列使用举例
6.3 映射
6.3.1 初始化一个idr
6.3.2 分配一个新的UID
6.3.3 查找UID
6.3.4 删除UID
6.3.5 撤销idr
6.4 二叉树
6.4.1 二叉搜索树
6.4.2 自平衡二叉搜索树
6.5 数据结构以及选择
6.6 算法复杂度
6.6.1 算法
6.6.2 大O符号
6.6.3 大θ符号
6.6.4 时间复杂度
6.7 小结
第7章 中断和中断处理
7.1 中断
7.2 中断处理程序
7.3 上半部与下半部的对比
7.4 注册中断处理程序
7.4.1 中断处理程序标志
7.4.2 一个中断例子
7.4.3 释放中断处理程序
7.5 编写中断处理程序
7.5.1 共享的中断处理程序
7.5.2 中断处理程序实例
7.6 中断上下文
7.7 中断处理机制的实现
7.8 /proc/interrupts
7.9 中断控制
7.9.1 禁止和激活中断
7.9.2 禁止指定中断线
7.9.3 中断系统的状态
7.10 小结
第8章 下半部和推后执行的工作
8.1 下半部
8.1.1 为什么要用下半部
8.1.2 下半部的环境
8.2 软中断
8.2.1 软中断的实现
8.2.2 使用软中断
8.3 tasklet
8.3.1 tasklet的实现
8.3.2 使用 tasklet
8.3.3 老的BH机制
8.4 工作队列
8.4.1 工作队列的实现
8.4.2 使用工作队列
8.4.3 老的任务队列机制
8.5 下半部机制的选择
8.6 在下半部之间加锁
8.7 禁止下半部
fnbsp; 8.8 小结
fnbsp; 第9 章 内核同步介绍
9.1 临界区和竞争条件
&n"sp; 9.1.1 为什么我们需要保护
9.1.2 单个变量
9.2 加锁
9.2.1 造成并发执行的原因
9.2.2 了解要保护些什么
9.3 死锁
9.4 争用和扩展性
9.5 小结
第10章 内核同步方法
10.1 原子操作
10.1.1 原子整数操作
10.1.264 位原子操作
10.1.3 原子位操作
10.2 自旋锁
10.2.1 自旋锁方法
10.2.2 其他针对自旋锁的操作
10.2.3 自旋锁和下半部
10.3 读一写自旋锁
10.4 信号量
10.4.1 计数信号量和二值信号量
10.4.2 创建和初始化信号量
10.4.3 使用信号量
10.5 读一写信号量
10.6 互斥体
10.6.1 信号量和互斥体
10.6.2 自旋锁和互斥体
10.7 完成变量
10.8 BLK:大内核锁
10.9 顺序锁
10.10 禁止抢占
10.11 顺序和屏障
10.12 小结
第11章 定时器和时间管理
11.1 内核中的时间概念
11.2 节拍率:HZ
11.2.1 理想的HZ值
11.2.2 高HZ的优势
11.2.3 高HZ的劣势
11.3 jiffies
11.3.1 jiffies的内部表示
11.3.2 jiffies的回绕
11.3.3 用户空间和HZ
11.4 硬时钟和定时器
11.4.1 实时时钟
11.4.2 系统定时器
11.5 时钟中断处理程序
11.6 实际时间
11.7 定时器
11.7.1 使用定时器
11.7.2 定时器竞争条件
11.7.3 实现定时器
11.8 延迟执行
&.bsp; 11.8.1 忙等待
11.8.2 短延迟
11.8.3 schedule timeoutO
11.9 小结
第12章 内存管理
12.1 页
12.2 区
12.3 获得页
12.3.1 获得填充为0的页
12.3.2 释放页
12.4 kmallocO
12.4.1 gfp_mask标志
12.4.2 kfreeO
12.5 vmallocO
12.6 slab层
12.6.1 slab层的设计
12.6.2 slab分配器的接口
12.7 在栈上的静态分配
12.7.1 单页内核栈
12.7.2 在栈上光明正大地工作
12.8 高端内存的映射
12.8.1 永久映射
12.8.2 临时映射
12.9 每个CPU的分配
12.10 新的每个CPU接口
12.10.1 编译时的每个CPU数据
12.10.2 运行时的每个CPU数据
12.11 使用每个CPU数据的原因
12.12 分配函数的选择
12.13 小结
第13章 虚拟文件系统
13.1 通用文件系统接口
13.2 文件系统抽象层
13.3 Unix文件系统
13.4 VFS对象及其数据结构
13.5 超级块对象
13.6 超级块操作
13.7 索引节点对象
13.8 索引节点操作
13.9 目录项对象
13.9.1 目录项状态
13.9.2 目录项缓存
13.10 目录项操作
13.11 文件对象
13.12 文件操作
13.13 和文件系统相关的数据结构
13.14 和进程相关的数据结构
13.15 小结
第14章 块I/O层
14.1 剖析一个块设备
14.2 缓冲区和缓冲区头
14.3 bio结构体
14.3.1 I/O向量
14.3.2 新老方法对比
14.4 请求队列
14.5 I/O调度程序
14.5.1 I/O调度程序的工作
14.5.2 Linus电梯
14.5.3 最终期限I/O调度程序
14.5.4 预测I/O调度程序
14.5.5 完全公正的排队I/O调度程序
14.5.6 空操作的I/O调度程序
14.5.7 I/O调度程序的选择
14.6 小结
第15章 进程地址空间
15.1 地址空间
15.2 内存描述符
15.2.2 撤销内存描述符
15.2.3 mm_struct与内核线程
15.3 虚拟内存区域
15.3.1 VMA标志
15.3.2 VMA操作
15.3.3 内存区域的树型结构和内存区域的链表结构
15.3.4 实际使用中的内存区域
15.4 操作内存区域
15.4.1 find_vmaO
15.4.2 find_vma_prevO
15.4.3 find_vma_intersectionO
15.5 mmapO和do_mmapO:创建地址区间
15.6 mummapO和do_mummapO:删除地址区间
15.7 页表
15.8 小结
第16章 页高速缓存和页回写
16.1 缓存手段
16.1.1 写缓存
16.1.2 缓存回收
16.2 Linux页高速缓存
16.2.1 address_space对象
16.2.2 address_space操作
16.2.3 基树
16.2.4 以前的页散列表
16.3 缓冲区高速缓存
16.4 fiusher线程
16.4.1 膝上型计算机模式
16.4.2 历史上的bdflush、kupdated和pdflush
16.4.3 避免拥塞的方法:使用多线程
16.5 小结
第17章 设备与模块
17.1 设备类型
17.2 模块
17.2.1 Hello,World
17.2.2 构建模块
17.2.3 安装模块
17.2.4 产生模块依赖性
17.2.5 载入模块
17.2.6 管理配置选项
17.2.7 模块参数
17.2.8 导出符号表
17.3 设备模型
17.3.1 kobject
17.3.2 ktype
17.3.3 kset
17.3.4 kobject、ktype和kset的相互关系
17.3.5 管理和操作kobject
17.3.6 引用计数
17.4 sysfs
17.4.1 sysfs中添加和删除kobject
17.4.2 向sysfs中添加文件
17.4.3 内核事件层
17.5 小结
第18章 调试
18.1 准备开始
18.2 内核中的bug
18.3 通过打印来调试
18.3.1 健壮性
18.3.2 日志等级
18.3.3 记录缓冲区
18.3.4 syslogd和klogd
18.3.5 从printfO到printkO的转换
18.4 oops
18.4.1 ksymoops
18.4.2 kallsyms
18.5 内核调试配置选项
18.6 引发bug并打印信息
18.7 神奇的系统请求键
18.8 内核调试器的传奇
18.8.1 gdb
18.8.2 kgdb
18.9 探测系统
18.9.1 用UID作为选择条件 第304|/font>页
18.9.2 使用条件变量
18.9.3 使用统计量
18.9.4 重复频率限制
18.10 用二分查找法找出引发罪恶的变更
18.11 使用Git进行二分搜索
18.12 当所有的努力都失败时:社区
18.13 小结
第19章 可移植性
19.1 可移植操作系统
19.2 Linux移植史
19.3 字长和数据类型
19.3.1 不透明类型
19.3.2 指定数据类型
19.3.3 长度明确的类型
19.3.4 char型的符号问题
19.4 数据对齐
19.4.1 避免对齐引发的问题
19.4.2 非标准类型的对齐
19.4.3 结构体填补
19.5 字节顺序
19.6 时间
19.7 页长度
19.8 处理器排序
19.9 SMP、内核抢占、高端内存
19.10 小结
第20章 补丁、开发和社区
20.1 社区
20.2 Linux编码风格
20.2.1 缩进
20.2.2 switch语句
20.2.3 空格
20.2.4 花括号
20.2.5 每行代码的长度
20.2.6 命名规范
20.2.7 函数
20.2.8 注释
20.2.9 typedef
20.2.10 多用现成的东西
20.2.11 在源码中减少使用ifdef
20.2.12 结构初始化
20.2.13 代码的事后修正
20.3 管理系统
20.4 提交错误报告
20.5 补丁
20.5.1 创建补丁
20.5.2 用Git创建补丁
20.5.3 提交补丁
20.6 小结
下载地址:https://www.wenjiangs.com/wp-content/uploads/2023/06/14eoYwFl05fyKuoC.zip
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Java 编程思想 第4版 PDF 文档
下一篇: Linux 常用命令手册 PDF 文档
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论