书籍详情
Linux内核设计与实现
作者:(美)Robert Love著;陈莉君,康华,张波译;陈莉君译
出版社:机械工业出版社
出版时间:2005-03-01
ISBN:9787111152415
定价:¥35.00
购买这本书可以去
内容简介
“如果有这样一本书,既能提纲挈领,为我理顺思绪、指引方向;同时又能照顾小节、阐述细微,帮助我更好更快地理解源码,那该有多好。”说这话的先生虽然针对的是C++,但道出的是研习源码的人们共同的心声。我们能不能做点儿什么,让学习Linux内核的过程更符合程序员的习惯呢?本书回答了这个问题。本书作者RobertLove是一个狂热的内核爱好者,所以他的想法自然贴近程序员。本书内容涉及Linux 2.6内核,包含许多新特性,如O(1)调度程序、块I/0层、I/0调度程序等。本书提供Linux内核设计和实现的概述性信息,覆盖了从核心内核系统的应用到内核设计与实现等各方面内容,能够带领读者快速走进Linux内核世界。本书不但介绍了理论,而且也讨论了具体应用,可以满足不同读者的需要,适合于各类希望理解Linux内核软件开发的读者。
作者简介
Robert Love:很早就开始使用Linux, 而且一直活跃于开源社区. 最近, 他受聘于Monta Vista软件公司, 作为软件工程师继续做开发Linux内核的工作. 他的内核项目包括进程调度程序. 抢占式内核, 还有VM和多任务处理性能优化. 他负责维护的另外两个开源项目是schedutils和procps. 此外, 他对内核还有不少精彩评论, 并担任Linux Journal杂志的特邀编辑.
目录
第1章 Linux内核简介
1. 1 Linux简介
1. 2 操作系统和内核简介
1. 3 Linux内核和传统Unix内核的比较
1. 4 Linux内核版本
1. 5 Linux内核开发者社区
1. 6 内核开发的特点
1. 6. 1 没有libc库
1. 6. 2 GNU C
1. 6. 3 没有内存保护机制
1. 6. 4 不要轻易在内核中使用浮点数
1. 6. 5 容积小而固定的栈
1. 6. 6 同步和并发
1. 6. 7 可移植性的重要性
1. 7 编译内核
1. 8 小结
第2章 进程管理
2. 1 进程描述符及任务队列
2. 1. 1 分配进程描述符
2. 1. 2 进程描述符的存放
2. 1. 3 进程状态
2. 1. 4 设置当前进程状态
2. 1. 5 进程上下文
2. 2 进程创建
2. 2. 1 写时拷贝
2. 2. 2 fork()
2. 2. 3 vfork()
2. 3 线程在Linux中的实现
2. 4 进程终结
2. 4. 1 删除进程描述符
2. 4. 2 孤儿进程造成的进退维谷
第3章 调度
3. 1 策略
3. 1. 1 I/O消耗型和处理器消耗型的进程
3. 1. 2 进程优先级
3. 1. 3 时间片
3. 1. 4 进程抢占
3. 1. 5 调度策略的活动
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 内核抢占
3. 4 实时
3. 5 与调度相关的系统调用
3. 5. 1 与调度策略和优先级相关的系统调用
3. 5. 2 与处理器绑定有关的系统调用
3. 5. 3 放弃处理器时间
第4章 系统调用
4. 1 API. POSIX和C库
4. 2 系统调用
4. 2. 1 系统调用号
4. 2. 2 系统调用的性能
4. 3 系统调用处理程序
4. 3. 1 指定恰当的系统调用
4. 3. 2 参数传递
4. 4 系统调用的实现
4. 5 系统调用上下文
4. 5. 1 绑定一个系统调用的最后步骤
4. 5. 2 从用户空间访问系统调用
4. 5. 3 为什么不通过系统调用的方式实现
第5章 中断和中断处理程序
5. 1 中断
5. 2 中断处理程序
5. 3 注册中断处理程序
5. 4 编写中断处理程序
5. 4. 1 共享的中断处理程序
5. 4. 2 中断处理程序实例
5. 4. 3 中断上下文
5. 5 中断处理机制的实现
5. 6 中断控制
5. 6. 1 禁止和激活中断
5. 6. 2 禁止指定中断线
5. 6. 3 中断系统的状态
第6章 下半部和推后执行的工作
6. 1 下半部
6. 1. 1 为什么要用下半部
6. 1. 2 下半部的环境
6. 2 软中断
6. 2. 1 软中断的实现
6. 2. 2 使用软中断
6. 3 Tasklets
6. 3. 1 Tasklets的实现
6. 3. 2 使用Tasklets
6. 3. 3 ksoftirqd
6. 3. 4 老的BH机制
6. 4 工作队列
6. 4. 1 工作队列的实现
6. 4. 2 使用工作队列
6. 4. 3 老的任务队列机制
6. 5 下半部机制的选择
6. 6 在下半部之间加锁
第7章 内核同步介绍
7. 1 临界区和竞争条件
7. 2 加锁
7. 2. 1 到底是什么造成了并发执行
7. 2. 2 需要保护什么
7. 3 死锁
7. 4 争用和扩展性
7. 5 小结
第8章 内核同步方法
8. 1 原子操作
8. 1. 1 原子整数操作
8. 1. 2 原子位操作
8. 2 自旋锁
8. 2. 1 其他针对自旋锁的操作
8. 2. 2 自旋锁和下半部
8. 3 读-写自旋锁
8. 4 信号量
8. 4. 1 创建和初始化信号量
8. 4. 2 使用信号量
8. 5 读-写信号量
8. 6 完成变量
8. 7 BKL
8. 8 Seq锁
8. 9 禁止抢占
8. 10 屏障
第9章 定时器和时间管理
9. 1 内核中的时间概念
9. 2 节拍率:Hz
9. 3 jiffes
9. 3. 1 jiffies的内部表示
9. 3. 2 jiffies的回绕
9. 3. 3 用户空间和Hz
9. 4 硬时钟和定时器
9. 4. 1 实时时钟
9. 4. 2 系统定时器
9. 5 时钟中断处理程序
9. 6 实际时间
9. 7 定时器
9. 7. 1 使用定时器
9. 7. 2 定时器竞争条件
9. 7. 3 实现定时器
9. 8 延迟执行
9. 8. 1 忙等待
9. 8. 2 短延迟
第10章 内存管理
10. 1 页
10. 2 区
10. 3 获得页
10. 3. 1 获得填充为0的页
10. 3. 2 释放页
10. 4 slab层
10. 5 slab分配器的接口
10. 6 在栈上的静态分配
10. 7 高端内存的映射
10. 7. 1 永久映射
10. 7. 2 临时映射
10. 8 分配函数的选择
第11章 虚拟文件系统
11. 1 通用文件系统接口
11. 2 文件系统抽象层
11. 3 Unix文件系统
11. 4 VFS对象及其数据结构
11. 5 超级块对象
11. 6 索引节点对象
11. 7 目录项对象
11. 7. 1 目录项状态
11. 7. 2 目录项缓存
11. 7. 3 目录项操作
11. 8 文件对象
11. 9 和文件系统相关的数据结构
11. 10 和进程相关的数据结构
11. 11 Linux中的文件系统
第12章 块I/O层
12. 1 解剖一个块设备
12. 2 缓冲区和缓冲区头
12. 3 bio结构体
12. 4 请求队列
12. 5 I/O调度程序
12. 5. 1 I/O调度程序的工作
12. 5. 2 Linus电梯
12. 5. 3 最终期限I/O调度程序
12. 5. 4 预测I/O调度程序
第13章 进程地址空间
13. 1 内存描述符
13. 1. 1 分配内存描述符
13. 1. 2 销毁内存描述符
13. 1. 3 mm_struct与内核线程
13. 2 内存区域
13. 2. 1 VMA标志
13. 2. 2 VM操作
13. 2. 3 内存区域的树型结构和内存区域的链表结构
13. 2. 4 实际使用中的内存区域
13. 3 操作内存区域
13. 3. 1 find_vma()
13. 3. 2 find_vma_prev()
13. 3. 3 find_vma_intersection()
13. 4 mmap()和do_mmap():创建地址区间
13. 5 mummap()和do_mummap():删除地址区间
13. 6 页表
第14章 页高速缓存和页回写
14. 1 页高速缓存
14. 2 基树
14. 3 缓冲区高速缓存
14. 4 pdflush后台例程
14. 4. 1 bdflush和kupdated
14. 4. 2 避免拥塞的方法:使用多线程
第15章 调试
15. 1 调度前需要准备什么
15. 2 内核中的bug
15. 2. 1 pintk()
15. 2. 2 记录等级
15. 2. 3 记录缓冲区
15. 2. 4 syslogd和klogd
15. 2. 5 printk()和内核开发时需要留意的一点
15. 3 oops
15. 3. 1 ksymoops
15. 3. 2 kallsyms
15. 4 内核调试配置选项
15. 5 引发bug并打印信息
15. 6 神奇的系统请求键
15. 7 内核调试器的传奇
15. 7. 1 gdb
15. 7. 2 kgdb
15. 7. 3 kdb
15. 8 刺探系统
15. 8. 1 用UID作为选择条件
15. 8. 2 使用条件变量
15. 8. 3 使用统计量
15. 8. 4 重复频率限制
15. 9 用二分查找法找出引发罪恶的变更
15. 10 当所有的努力都失败时:社区
第16章 可移植性
16. 1 Linux移植史
16. 2 字长和数据类型
16. 2. 1 不透明类型
16. 2. 2 指定数据类型
16. 2. 3 长度明确的类型
16. 2. 4 char型的符号问题
16. 3 数据对齐
16. 3. 1 避免对齐引发的问题
16. 3. 2 非标准类型的对齐
16. 3. 3 结构体填补
16. 4 字节顺序
16. 4. 1 高位优先和低位优先的历史
16. 4. 2 内核中的字节顺序
16. 5 时间
16. 6 页长度
16. 7 处理器排序
16. 8 SMP. 内核抢占. 高端内存
16. 9 小结
第17章 补丁. 开发和社区
17. 1 社区
17. 2 Linux编码风格
17. 2. 1 缩进
17. 2. 2 括号
17. 2. 3 命名规范
17. 2. 4 函数
17. 2. 5 注释
17. 2. 6 Typedefs
17. 2. 7 多用现成的东西
17. 2. 8 在源码中不要使用ifdef
17. 2. 9 结构初始化
17. 2. 10 代码的事后修正
17. 3 管理系统
17. 4 提交错误报告
17. 5 创建补丁
17. 6 提交补丁
附录A 链表
附录B 单CPU接口
附录C 内核随机数产生器
附录D 算法复杂度
参考资料
1. 1 Linux简介
1. 2 操作系统和内核简介
1. 3 Linux内核和传统Unix内核的比较
1. 4 Linux内核版本
1. 5 Linux内核开发者社区
1. 6 内核开发的特点
1. 6. 1 没有libc库
1. 6. 2 GNU C
1. 6. 3 没有内存保护机制
1. 6. 4 不要轻易在内核中使用浮点数
1. 6. 5 容积小而固定的栈
1. 6. 6 同步和并发
1. 6. 7 可移植性的重要性
1. 7 编译内核
1. 8 小结
第2章 进程管理
2. 1 进程描述符及任务队列
2. 1. 1 分配进程描述符
2. 1. 2 进程描述符的存放
2. 1. 3 进程状态
2. 1. 4 设置当前进程状态
2. 1. 5 进程上下文
2. 2 进程创建
2. 2. 1 写时拷贝
2. 2. 2 fork()
2. 2. 3 vfork()
2. 3 线程在Linux中的实现
2. 4 进程终结
2. 4. 1 删除进程描述符
2. 4. 2 孤儿进程造成的进退维谷
第3章 调度
3. 1 策略
3. 1. 1 I/O消耗型和处理器消耗型的进程
3. 1. 2 进程优先级
3. 1. 3 时间片
3. 1. 4 进程抢占
3. 1. 5 调度策略的活动
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 内核抢占
3. 4 实时
3. 5 与调度相关的系统调用
3. 5. 1 与调度策略和优先级相关的系统调用
3. 5. 2 与处理器绑定有关的系统调用
3. 5. 3 放弃处理器时间
第4章 系统调用
4. 1 API. POSIX和C库
4. 2 系统调用
4. 2. 1 系统调用号
4. 2. 2 系统调用的性能
4. 3 系统调用处理程序
4. 3. 1 指定恰当的系统调用
4. 3. 2 参数传递
4. 4 系统调用的实现
4. 5 系统调用上下文
4. 5. 1 绑定一个系统调用的最后步骤
4. 5. 2 从用户空间访问系统调用
4. 5. 3 为什么不通过系统调用的方式实现
第5章 中断和中断处理程序
5. 1 中断
5. 2 中断处理程序
5. 3 注册中断处理程序
5. 4 编写中断处理程序
5. 4. 1 共享的中断处理程序
5. 4. 2 中断处理程序实例
5. 4. 3 中断上下文
5. 5 中断处理机制的实现
5. 6 中断控制
5. 6. 1 禁止和激活中断
5. 6. 2 禁止指定中断线
5. 6. 3 中断系统的状态
第6章 下半部和推后执行的工作
6. 1 下半部
6. 1. 1 为什么要用下半部
6. 1. 2 下半部的环境
6. 2 软中断
6. 2. 1 软中断的实现
6. 2. 2 使用软中断
6. 3 Tasklets
6. 3. 1 Tasklets的实现
6. 3. 2 使用Tasklets
6. 3. 3 ksoftirqd
6. 3. 4 老的BH机制
6. 4 工作队列
6. 4. 1 工作队列的实现
6. 4. 2 使用工作队列
6. 4. 3 老的任务队列机制
6. 5 下半部机制的选择
6. 6 在下半部之间加锁
第7章 内核同步介绍
7. 1 临界区和竞争条件
7. 2 加锁
7. 2. 1 到底是什么造成了并发执行
7. 2. 2 需要保护什么
7. 3 死锁
7. 4 争用和扩展性
7. 5 小结
第8章 内核同步方法
8. 1 原子操作
8. 1. 1 原子整数操作
8. 1. 2 原子位操作
8. 2 自旋锁
8. 2. 1 其他针对自旋锁的操作
8. 2. 2 自旋锁和下半部
8. 3 读-写自旋锁
8. 4 信号量
8. 4. 1 创建和初始化信号量
8. 4. 2 使用信号量
8. 5 读-写信号量
8. 6 完成变量
8. 7 BKL
8. 8 Seq锁
8. 9 禁止抢占
8. 10 屏障
第9章 定时器和时间管理
9. 1 内核中的时间概念
9. 2 节拍率:Hz
9. 3 jiffes
9. 3. 1 jiffies的内部表示
9. 3. 2 jiffies的回绕
9. 3. 3 用户空间和Hz
9. 4 硬时钟和定时器
9. 4. 1 实时时钟
9. 4. 2 系统定时器
9. 5 时钟中断处理程序
9. 6 实际时间
9. 7 定时器
9. 7. 1 使用定时器
9. 7. 2 定时器竞争条件
9. 7. 3 实现定时器
9. 8 延迟执行
9. 8. 1 忙等待
9. 8. 2 短延迟
第10章 内存管理
10. 1 页
10. 2 区
10. 3 获得页
10. 3. 1 获得填充为0的页
10. 3. 2 释放页
10. 4 slab层
10. 5 slab分配器的接口
10. 6 在栈上的静态分配
10. 7 高端内存的映射
10. 7. 1 永久映射
10. 7. 2 临时映射
10. 8 分配函数的选择
第11章 虚拟文件系统
11. 1 通用文件系统接口
11. 2 文件系统抽象层
11. 3 Unix文件系统
11. 4 VFS对象及其数据结构
11. 5 超级块对象
11. 6 索引节点对象
11. 7 目录项对象
11. 7. 1 目录项状态
11. 7. 2 目录项缓存
11. 7. 3 目录项操作
11. 8 文件对象
11. 9 和文件系统相关的数据结构
11. 10 和进程相关的数据结构
11. 11 Linux中的文件系统
第12章 块I/O层
12. 1 解剖一个块设备
12. 2 缓冲区和缓冲区头
12. 3 bio结构体
12. 4 请求队列
12. 5 I/O调度程序
12. 5. 1 I/O调度程序的工作
12. 5. 2 Linus电梯
12. 5. 3 最终期限I/O调度程序
12. 5. 4 预测I/O调度程序
第13章 进程地址空间
13. 1 内存描述符
13. 1. 1 分配内存描述符
13. 1. 2 销毁内存描述符
13. 1. 3 mm_struct与内核线程
13. 2 内存区域
13. 2. 1 VMA标志
13. 2. 2 VM操作
13. 2. 3 内存区域的树型结构和内存区域的链表结构
13. 2. 4 实际使用中的内存区域
13. 3 操作内存区域
13. 3. 1 find_vma()
13. 3. 2 find_vma_prev()
13. 3. 3 find_vma_intersection()
13. 4 mmap()和do_mmap():创建地址区间
13. 5 mummap()和do_mummap():删除地址区间
13. 6 页表
第14章 页高速缓存和页回写
14. 1 页高速缓存
14. 2 基树
14. 3 缓冲区高速缓存
14. 4 pdflush后台例程
14. 4. 1 bdflush和kupdated
14. 4. 2 避免拥塞的方法:使用多线程
第15章 调试
15. 1 调度前需要准备什么
15. 2 内核中的bug
15. 2. 1 pintk()
15. 2. 2 记录等级
15. 2. 3 记录缓冲区
15. 2. 4 syslogd和klogd
15. 2. 5 printk()和内核开发时需要留意的一点
15. 3 oops
15. 3. 1 ksymoops
15. 3. 2 kallsyms
15. 4 内核调试配置选项
15. 5 引发bug并打印信息
15. 6 神奇的系统请求键
15. 7 内核调试器的传奇
15. 7. 1 gdb
15. 7. 2 kgdb
15. 7. 3 kdb
15. 8 刺探系统
15. 8. 1 用UID作为选择条件
15. 8. 2 使用条件变量
15. 8. 3 使用统计量
15. 8. 4 重复频率限制
15. 9 用二分查找法找出引发罪恶的变更
15. 10 当所有的努力都失败时:社区
第16章 可移植性
16. 1 Linux移植史
16. 2 字长和数据类型
16. 2. 1 不透明类型
16. 2. 2 指定数据类型
16. 2. 3 长度明确的类型
16. 2. 4 char型的符号问题
16. 3 数据对齐
16. 3. 1 避免对齐引发的问题
16. 3. 2 非标准类型的对齐
16. 3. 3 结构体填补
16. 4 字节顺序
16. 4. 1 高位优先和低位优先的历史
16. 4. 2 内核中的字节顺序
16. 5 时间
16. 6 页长度
16. 7 处理器排序
16. 8 SMP. 内核抢占. 高端内存
16. 9 小结
第17章 补丁. 开发和社区
17. 1 社区
17. 2 Linux编码风格
17. 2. 1 缩进
17. 2. 2 括号
17. 2. 3 命名规范
17. 2. 4 函数
17. 2. 5 注释
17. 2. 6 Typedefs
17. 2. 7 多用现成的东西
17. 2. 8 在源码中不要使用ifdef
17. 2. 9 结构初始化
17. 2. 10 代码的事后修正
17. 3 管理系统
17. 4 提交错误报告
17. 5 创建补丁
17. 6 提交补丁
附录A 链表
附录B 单CPU接口
附录C 内核随机数产生器
附录D 算法复杂度
参考资料
猜您喜欢