当前位置:首页 > 工业技术
Linux内核设计与实现  第2版
Linux内核设计与实现  第2版

Linux内核设计与实现 第2版PDF电子书下载

工业技术

  • 电子书积分:11 积分如何计算积分?
  • 作 者:(美)Robert Love著;陈莉君,康华,张波译(西安邮电学院)
  • 出 版 社:北京:机械工业出版社
  • 出版年份:2006
  • ISBN:7111178653
  • 页数:289 页
图书介绍:《Linux内核设计与实现》基于Linux2.6内核系列详细介绍Linux内核系统,覆盖了从核心内核系统的应用到内核设计与实现等各方面的内容。主要内容包括:进程管理、系统调用、中断和中断处理程序、内核同步、时间管理、内存管理、地址空间、调试技术等。本书理论联系实践,既介绍理论也讨论具体应用,能够带领读者快速走进Linux内核世界,真正开发内核代码。 本书适合作为高等院校操作系统课程的教材或参考书,也可供相关技术人员参考。
《Linux内核设计与实现 第2版》目录

译者序 1

序言 1

前言 1

第1章 Linux内核简介 1

目录 1

1.1 追寻Linus的足迹:Linux简介 2

1.2 操作系统和内核简介 3

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

1.4 Linux内核版本 6

1.6 小结 7

1.5 Linux内核开发者社区 7

第2章 从内核出发 8

2.1 获取内核源码 8

2.1.1 安装内核源代码 8

2.1.2 使用补丁 8

2.2 内核源码树 9

2.3 编译内核 9

2.3.1 减少编译的垃圾信息 10

2.3.3 安装内核 11

2.4 内核开发的特点 11

2.3.2 衍生多个编译作业 11

2.4.1 没有libc库 12

2.4.2 GNU C 12

2.4.3 没有内存保护机制 14

2.4.4 不要轻易在内核中使用浮点数 14

2.4.5 容积小而固定的栈 14

2.4.6 同步和并发 15

2.4.7 可移植性的重要性 15

2.5 小结 15

第3章 进程管理 16

3.1.1 分配进程描述符 17

3.1 进程描述符及任务结构 17

3.1.2 进程描述符的存放 18

3.1.3 进程状态 19

3.1.4 设置当前进程状态 20

3.1.5 进程上下文 21

3.1.6 进程家族树 21

3.2 进程创建 22

3.2.1 写时拷贝 22

3.2.2 fork() 23

3.2.3 vfork() 23

3.3 线程在Linux中的实现 24

3.4 进程终结 26

3.4.1 删除进程描述符 27

3.4.2 孤儿进程造成的进退维谷 27

3.5 进程小结 28

第4章 进程调度 29

4.1 策略 30

4.1.1 I/O消耗型和处理器消耗型的进程 30

4.1.2 进程优先级 30

4.1.3 时间片 31

4.2 Linux调度算法 32

4.1.5 调度策略的活动 32

4.1.4 进程抢占 32

4.2.1 可执行队列 33

4.2.2 优先级数组 35

4.2.3 重新计算时间片 36

4.2.4 schedule() 36

4.2.5 计算优先级和时间片 37

4.2.6 睡眠和唤醒 39

4.2.7 负载平衡程序 41

4.3 抢占和上下文切换 44

4.3.2 内核抢占 45

4.3.1 用户抢占 45

4.5 与调度相关的系统调用 46

4.4 实时 46

4.5.1 与调度策略和优先级相关的系统调用 47

4.5.2 与处理器绑定有关的系统调用 47

4.5.3 放弃处理器时间 47

4.6 调度程序小结 48

第5章 系统调用 49

5.1 API、POSIX和C库 49

5.2 系统调用 50

5.3 系统调用处理程序 51

5.2.1 系统调用号 51

5.2.2 系统调用的性能 51

5.3.1 指定恰当的系统调用 52

5.3.2 参数传递 52

5.4 系统调用的实现 53

5.5 系统调用上下文 55

5.5.1 绑定一个系统调用的最后步骤 55

5.5.2 从用户空间访问系统调用 57

5.5.3 为什么不通过系统调用的方式实现 57

5.6 系统调用小结 58

6.1 中断 59

第6章 中断和中断处理程序 59

6.2 中断处理程序 60

6.3 注册中断处理程序 61

6.4 编写中断处理程序 63

6.4.1 共享的中断处理程序 64

6.4.2 中断处理程序实例 65

6.5 中断上下文 66

6.6 中断处理机制的实现 67

6.7.1 禁止和激活中断 70

6.7 中断控制 70

6.7.2 禁止指定中断线 71

6.7.3 中断系统的状态 72

6.8 别打断我,马上结束 73

第7章 下半部和推后执行的工作 74

7.1 半部 74

7.1.1 为什么要用下半部 75

7.1.2 下半部的环境 75

7.2 软中断 77

7.2.1 软中断的实现 77

7.2.2 使用软中断 79

7.3 tasklet 80

7.3.1 tasklet的实现 81

7.3.2 使用tasklet 82

7.3.3 ksoftirqd 84

7.3.4 老的BH机制 85

7.4 工作队列 86

7.4.1 工作队列的实现 86

7.4.2 使用工作队列 89

7.4.3 老的任务队列机制 92

7.5 下半部机制的选择 92

7.6 在下半部之间加锁 93

7.7 下半部处理小结 95

第8章 内核同步介绍 96

8.1 临界区和竞争条件 96

8.2 加锁 98

8.2.1 到底是什么造成了并发执行 100

8.2.2 要保护些什么 101

8.3 死锁 102

8.4 争用和扩展性 103

8.5 小结 104

9.1.1 原子整数操作 105

第9章 内核同步方法 105

9.1 原子操作 105

9.1.2 原子位操作 107

9.2 自旋锁 109

9.2.1 其他针对自旋锁的操作 111

9.2.2 自旋锁和下半部 112

9.3 读-写自旋锁 112

9.4 信号量 114

9.4.1 创建和初始化信号量 115

9.5 读-写信号量 116

9.4.2 使用信号量 116

9.6 自旋锁与信号量 117

9.7 完成变量 118

9.8 BKL 118

9.9 禁止抢占 120

9.10 顺序和屏障 121

9.11 小结 124

第10章 定时器和时间管理 125

10.1 内核中的时间概念 125

10.2 节拍率:HZ 126

10.3 jiffies 128

10.3.1 jiffies的内部表示 129

10.3.2 jiffies的回绕 130

10.3.3 用户空间和HZ 131

10.4 硬时钟和定时器 132

10.4.1 实时时钟 132

10.4.2 系统定时器 132

10.5 时钟中断处理程序 132

10.6 实际时间 134

10.7.1 使用定时器 136

10.7 定时器 136

10.7.2 定时器竞争条件 138

10.7.3 实现定时器 138

10.8 延迟执行 138

10.8.1 忙等待 139

10.8.2 短延迟 140

10.8.3 schedule_timeout() 141

10.8.4 设置超时时间,在等待队列上睡眠 142

10.9 小结 143

第11章 内存管理 144

11.1 页 144

11.2 区 145

11.3 获得页 147

11.3.1 获得填充为0的页 148

11.3.2 释放页 148

11.4 kmalloc() 149

11.4.1 gfp_mask标志 149

11.4.2 kfree() 152

11.5 vmalloc() 153

11.6 slab层 154

11.7 slab分配器的接口 157

11.8 在栈上的静态分配 159

11.9 高端内存的映射 160

11.9.1 永久映射 160

11.9.2 临时映射 161

11.10 每个CPU的分配 162

11.11 新的每个CPU接口 162

11.11.1 编译时的每个CPU数据 162

11.11.2 运行时的每个CPU数据 163

11.12 使用每个CPU数据的原因 164

11.13 分配函数的选择 165

12.2 文件系统抽象层 166

12.1 通用文件系统接口 166

第12章 虚拟文件系统 166

12.3 Unix文件系统 167

12.4 VFS对象及其数据结构 168

12.5 超级块对象 169

12.6 索引节点对象 172

12.7 目录项对象 177

12.7.1 目录项状态 177

12.7.2 目录项缓存 178

12.7.3 目录项操作 179

12.8 文件对象 180

12.9 和文件系统相关的数据结构 184

12.10 和进程相关的数据结构 185

12.11 Linux中的文件系统 187

第13章 块I/O层 188

13.1 解剖一个块设备 188

13.2 缓冲区和缓冲区头 189

13.3 bio结构体 191

13.4 请求队列 193

13.5 I/O调度程序 194

13.5.1 I/O调度程序的工作 194

13.5.3 最终期限I/O调度程序 195

13.5.2 Linus电梯 195

13.5.4 预测I/O调度程序 197

13.5.5 完全公正的排队I/O调度程序 198

13.5.6 空操作的I/O调度程序 198

13.5.7 I/O调度程序的选择 198

13.6 小结 199

第14章 进程地址空间 200

14.1 内存描述符 201

14.1.1 分配内存描述符 202

14.2 内存区域 203

14.1.3 mm_struct与内核线程 203

14.1.2 销毁内存描述符 203

14.2.1 VMA标志 204

14.2.2 VMA操作 205

14.2.3 内存区域的树型结构和内存区域的链表结构 206

14.2.4 实际使用中的内存区域 207

14.3 操作内存区域 208

14.3.1 find_vma() 208

14.3.2 find_vma_prev() 209

14.3.3 find_vma_intersection() 209

14.4 mmap()和do_mmap():创建地址区间 210

14.5 munmap()和do_munmap():删除地址区间 211

14.6 页表 212

14.7 小结 213

第15章 页高速缓存和页回写 214

15.1 页高速缓存 214

15.2 基树 217

15.3 缓冲区高速缓存 218

15.4 pdflush后台例程 218

15.4.2 bdflush和kupdated 219

15.4.1 膝上型电脑模式 219

15.4.3 避免拥塞的方法:使用多线程 220

15.5 小结 221

第16章 模块 222

16.1 构建模块 223

16.1.1 放在内核源代码树中 223

16.1.2 放在内核代码外 225

16.2 安装模块 225

16.3 产生模块依赖性 225

16.4 载入模块 225

16.5 管理配置选项 226

16.6 模块参数 228

16.7 导出符号表 229

16.8 小结 230

第17章 kobject sysfs 231

17.1 kobject 231

17 2 ktype 232

17 3 kset 233

17.4 subsystem 233

17.5 别混淆了这些结构体 234

17.6 管理和操作kobject 234

17.7 引用计数 235

17 8 sysfs 236

17.8.1 sysfs中添加和删除kobject 238

17.8.2 向sysfs中添加文件 238

17.9 内核事件层 241

17.10 小结 242

第18章 调试 243

18.1 调试前需要准备什么 243

18.2 内核中的bug 244

18.3 printk() 244

18.3.1 printk()函数的健壮性 244

18.3.2 记录等级 245

18.3.4 syslogd和klogd 246

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

18.3.3 记录缓冲区 246

18.4 oops 247

18.4.1 ksymoops 248

18.4.2 kallsyms 248

18.5 内核调试配置选项 248

18.6 引发bug并打印信息 249

18.7 神奇的SysRq 250

18.8.2 kgdb 251

18.8 内核调试器的传奇 251

18.8.1 gdb 251

18.8.3 kdb 252

18.9 刺探系统 252

18.9.1 用UID作为选择条件 252

18.9.2 使用条件变量 252

18.9.3 使用统计量 252

18.9.4 重复频率限制 253

18.10 用二分查找法找出引发灾难的变更 254

18.11 当所有的努力都失败时 254

第19章 可移植性 255

19.1 Linux的可移植性 256

19.2 字长和数据类型 257

19.2.1 不透明类型 258

19.2.2 指定数据类型 259

19.2.3 长度明确的类型 259

19.2.4 char型的符号问题 260

19.3 数据对齐 260

19.3.2 非标准类型的对齐 261

19.3.3 结构体填补 261

19.3.1 避免对齐引发的问题 261

19.4 字节顺序 262

19.4.1 高位优先和低位优先的历史 264

19.4.2 内核中的字节顺序 264

19.5 时间 264

19.6 页长度 264

19.7 处理器排序 265

19.8 SMP、内核抢占、高端内存 265

19.9 小结 266

20.1 社区 267

20.2 Linux编码风格 267

第20章 补丁、开发和社区 267

20.2.1 缩进 268

20.2.2 括号 268

20.2.3 每行代码的长度 269

20.2.4 命名规范 269

20.2.5 函数 269

20.2.6 注释 269

20.2.7 typedef 270

20.2.9 在源码中不要使用ifdef 271

20.2.10 结构初始化 271

20.2.8 多用现成的东西 271

20.2.11 代码的事后修正 272

20.3 管理系统 272

20.4 提交错误报告 272

20.5 创建补丁 273

20.6 提交补丁 273

20.7 小结 274

附录A 链表 275

附录B 内核随机数产生器 281

附录C 复杂度算法 285

参考资料 287

相关图书
作者其它书籍
返回顶部