《Linux内核设计与实现》PDF下载

  • 购买积分:11 如何计算积分?
  • 作  者:(美)Robert Love著;陈莉君,康华,张波译
  • 出 版 社:北京:机械工业出版社
  • 出版年份:2004
  • ISBN:7111152417
  • 页数:257 页
图书介绍:本书介绍Linux 内核设计和实现的内容。

第1章 Linux内核简介 1

1.1 Linux简介 2

1.2操作系统和内核简介 3

1.3 Linux内核和传统Unix内核的比较 4

1.4 Linux内核版本 5

1.5 Linux内核开发者社区 6

1.6 内核开发的特点 6

1.6.1 没有libc库 7

1.6.2 GNUC 7

1.6.3 没有内存保护机制 8

1.6.4 不要轻易在内核中使用浮点数 9

1.6.5 容积小而固定的栈 9

1.6.6 同步和并发 9

1.6.7 可移植性的重要性 9

1.7 编译内核 10

1.8 小结 11

第2章 进程管理 13

2.1 进程描述符及任务队列 14

2.1.1 分配进程描述符 14

2.1 2 进程描述符的存放 15

2.1.3 进程状态 16

2.1.4 设置当前进程状态 17

2.1.5 进程上下文 17

2.2进程创建 19

2.2.1写时拷贝 19

2.2.2 fork() 19

2.2.3 vfork() 20

2.3线程在Linux中的实现 20

2.4进程终结 22

2.4.1删除进程描述符 23

2.4.2孤儿进程造成的进退维谷 24

3.1策略 25

第3章 调度 25

3.1.1 I/O消耗型和处理器消耗型的进程 26

3.1.2 进程优先级 26

3.1.3 时间片 26

3.1.4 进程抢占 27

3.1.5 调度策略的活动 28

3.2 调度算法 28

3.2.1 可执行队列 28

3.2.2 优先级数组 30

3.2.3重新计算时间片 31

3.2.4 计算优先级和时间片 33

3.2.5 睡眠和唤醒 34

3.2.6 负载平衡程序 36

3.3 抢占和上下文切换 38

3.3.1用户抢占 38

3.4 实时 39

3.3.2内核抢占 39

3.5 与调度相关的系统调用 40

3.5.1 与调度策略和优先级相关的系统调用 40

3.5.2 与处理器绑定有关的系统调用 41

3.5.3 放弃处理器时间 41

第4章 系统调用 43

4.1 API、POSIX和C库 43

4.2 系统调用 44

4.3 系统调用处理程序 45

4.3.1 指定恰当的系统调用 45

4.2.1 系统调用号 45

4.2.2 系统调用的性能 45

4.3.2 参数传递 46

4.4 系统调用的实现 46

4.5系统调用上下文 48

4.5.1 绑定一个系统调用的最后步骤 48

4.5.2从用户空间访问系统调用 50

4.5.3 为什么不通过系统调用的方式实现 51

5.1 中断 53

第5章 中断和中断处理程序 53

5.2 中断处理程序 54

5.3 注册中断处理程序 55

5.4 编写中断处理程序 56

5.4.1 共享的中断处理程序 57

5.4.2 中断处理程序实例 58

5.4.3 中断上下文 59

5.5 中断处理机制的实现 60

5.6.1 禁止和激活中断 63

5.6 中断控制 63

5.6.2 禁止指定中断线 64

5.6.3 中断系统的状态 65

第6章 下半部和推后执行的工作 67

6.1 下半部 67

6.1.1 为什么要用下半部 68

6.1.2 下半部的环境 68

6.2.1 软中断的实现 70

6.2软中断 70

6.2.2 使用软中断 72

6.3 Tasklets 73

6.3.1 Tasklets的实现 74

6.3.2 使用Tasklets 75

6.3.3 ksoftirqd 77

6.3.4 老的BH机制 78

6.4 工作队列 79

6.4.1 工作队列的实现 79

6.4.2 使用工作队列 82

6.4.3 老的任务队列机制 85

6.5 下半部机制的选择 85

6.6 在下半部之间加锁 86

第7章 内核同步介绍 89

7.1 临界区和竞争条件 89

7.2加锁 90

7.2.1到底是什么造成了并发执行 91

7.2.2需要保护什么 92

7.3死锁 93

7.4争用和扩展性 95

7.5小结 96

第8章 内核同步方法 97

8.1原子操作 97

8.1.1原子整数操作 97

8.1.2原子位操作 99

8.2 自旋锁 100

8.2.1 其他针对自旋锁的操作 102

8.2.2自旋锁和下半部 103

8.3 读-写自旋锁 103

8.4信号量 105

8.4.1创建和初始化信号量 106

8.4.2使用信号量 107

8.5 读-写信号量 108

8.7 BKL 109

8.6 完成变量 109

8.8 Seq锁 110

8.9 禁止抢占 111

8.10 屏障 112

第9章 定时器和时间管理 115

9.1 内核中的时间概念 115

9.2 节拍率:Hz 116

9.3 jiffes 119

9.3.1 jiffies的内部表示 119

9.3.2 jiffies的回绕 120

9.3.3用户空间和Hz 121

9.4 硬时钟和定时器 122

9.4.1 实时时钟 122

9.4.2系统定时器 122

9.5 时钟中断处理程序 122

9.6 实际时间 124

9.7.1 使用定时器 126

9.7 定时器 126

9.7.3实现定时器 128

9.8延迟执行 128

9.7.2定时器竞争条件 128

9.8.1 忙等待 129

9.8.2 短延迟 130

第10章 内存管理 133

10.1 页 133

10.2 区 134

10.3 获得页 136

10.3.1 获得填充为0的页 137

10.3.2 释放页 137

10.4 slab层 143

10.5 slab分配器的接口 145

10.6 在栈的静态分配 148

10.7 高端内存的映射 148

10.7.2 临时映射 149

10.7.1 永久映射 149

10.8 分配函数的选择 150

第11章 虚拟文件系统 151

11.1 通用文件系统接口 151

11.2 文件系统抽象层 151

11.3 Unix文件系统 152

11.4 VFS对象及其数据结构 153

11.5 超级块对象 154

11.6 索引节点对象 157

11.7 目录项对象 161

11.7 1 目录项状态 162

11.7.2 目录项缓存 163

11.7.3 目录项操作 163

11.8 文件对象 164

11.9 和文件系统相关的数据结构 168

11.10 和进程相关的数据结构 170

11.11 Linux中的文件系统 171

第12章 块I/O层 173

12.1解剖一个块设备 173

12.2缓冲区和缓冲区头 174

12.3 bio结构体 176

12.4 请求队列 178

12.5 I/O调度程序 179

12.5.1 I/O调度程序的工作 179

12.5.2 Linus电梯 180

12.5.3 最终期限I/O调度程序 180

12.5.4 预测I/O调度程序 182

第13章 进程地址空间 185

13.1内存描述符 186

13.1.1 分配内存描述符 187

13.1.2 销毁内存描述符 188

13.1.3 mm_struct与内核线程 188

13.2内存区域 188

13.2.1 VMA标志 189

13.2.2 VM操作 190

13.2.3内存区域的树型结构和内存区域的链表结构 191

13.2.4实际使用中的内存区域 191

13.3操作内存区域 193

13.3.1 find_vma() 193

13.3.2 find_vma_prev() 193

13.3.3 find_vma_intersection() 194

13.4 mmap()和do_mmap():创建地址区间 195

13.5 mummap()和 do_mummap():删除地址区间 196

13.6页表 197

第14章 页高速缓存和页回写 199

14.1页高速缓存 199

14.2基树 202

14.3缓冲区高速缓存 203

14.4 pdflush后台例程 203

14.4.1 bdflush和kupdatcd 204

14.4.2避免拥塞的方法:使用多线程 205

15.1调度前需要准备什么 207

15.2内核中的bug 207

第15章 调试 207

15.2.1 pintk() 208

15.2.2记录等级 209

15.2.3记录缓冲区 210

15.2.4 syslogd和klogd 210

15.2.5 printk()和内核开发时需要留意的一点 210

15.3 oops 210

15.3.1 ksymoops 212

15.3.2 kallsyms 212

15.4内核调试配置选项 212

15.5 引发bug并打印信息 213

15.6神奇的系统请求键 214

15.7内核调试器的传奇 214

15.7.3 kdb 215

15.7.1 gdb 215

15.7.2 kgdb 215

15.8 刺探系统 216

15.8.1 用UID作为选择条件 216

15.8.2 使用条件变量 216

15.8.3 使用统计量 216

15.8.4 重复频率限制 217

15.9 用二分查找法找出引发罪恶的变更 218

15.10 当所有的努力都失败时:社区 218

第16章 可移植性 219

16.1 Linux移植史 220

16.2字长和数据类型 220

16.2.1不透明类型 222

16.2.2指定数据类型 223

16.2.3长度明确的类型 223

16.3.1 避免对齐引发的问题 224

16.3 数据对齐 224

16.2.4 char型的符号问题 224

16.3.2 非标准类型的对齐 225

16.3.3 结构体填补 225

16.4 字节顺序 226

16.4.1 高位优先和低位优先的历史 227

16.4.2 内核中的字节顺序 228

16.5 时间 228

16.6 页长度 228

16.8 SMP、内核抢占、高端内存 229

16.7 处理器排序 229

16.9小结 230

第17章 补丁、开发和社区 231

17.1 社区 231

17.2 Linux编码风格 231

17.2.1 缩进 232

17.2.2 括号 232

17.2.5 注释 233

17.2.3 命名规范 233

17.2.4 函数 233

17.2.6 Typedefs 234

17.2.7 多用现成的东西 234

17.2.8 在源码中不要使用ifdef 234

17.2.9 结构初始化 235

17.2.10 代码的事后修正 235

17.3 管理系统 236

17.4 提交错误报告 236

17.5 创建补丁 236

17.6 提交补丁 237

附录A 链表 239

附录B 单CPU接口 245

附录C 内核随机数产生器 249

附录D 算法复杂度 253

参考资料 255