第1章 Linux内核简介 1
1.1 Linux简介 1
1.1.1 Linux发展历史 1
1.1.2 常见的Linux介绍 2
1.2 Linux内核版本信息 3
1.2.1 Linux内核版本 3
1.2.2 GPL相关术语 4
1.3 Linux内核体系结构 4
1.4 源代码及组成 6
1.5 内核编译方法 7
1.6 小结 10
1.7 习题 10
第2章 内核探索工具 11
2.1 内核数据结构 11
2.1.1 链表 11
2.1.2 散列表 11
2.1.3 抽象接口 12
2.2 Linux汇编 12
2.2.1 Linux汇编简介 12
2.2.2 Linux汇编语法格式 13
2.2.3 程序实例 14
2.2.4 Linux汇编系统调用 16
2.2.5 GCC内联汇编 17
2.3 Linux C语言 19
2.3.1 C语言标准 19
2.3.2 函数库和系统调用 19
2.3.3 C语言编程风格 21
2.3.4 库和头文件的保存位置 22
2.4 GNU/GCC,GNU/GDB 23
2.4.1 运行gcc 23
2.4.2 gcc的主要选项 24
2.4.3 gdb介绍 25
2.4.4 gdb的常用命令 26
2.4.5 gdb使用范例 26
2.5 GNU make工具介绍 27
2.5.1 GNU make概述 27
2.5.2 makefile基本结构 28
2.5.3 makefile变量 29
2.5.4 GNU make的主要预定义变量 29
2.5.5 隐含规则 30
2.5.6 运行make 31
2.6 内核探测工具 31
2.6.1 objdump/readelf 31
2.6.2 hexdump 33
2.6.3 nm 33
2.6.4 objcopy 33
2.6.5 ar 33
2.7 小结 33
2.8 习题 34
第3章 Linux内核引导 35
3.1 BIOS和Open Firmware 35
3.1.1 BIOS 35
3.1.2 Open Firmware 36
3.2 Bootloader介绍 36
3.2.1 GRUB 36
3.2.2 LILO 38
3.2.3 U-Boot 38
3.3 系统引导过程 40
3.3.1 概述 40
3.3.2 系统启动 41
3.3.3 第一阶段引导加载程序 42
3.3.4 第二阶段引导加载程序 42
3.3.5 内核 43
3.3.6 init 44
3.4 小结 46
3.5 习题 46
第4章 进程管理 47
4.1 进程描述符及任务结构体 47
4.2 进程创建 55
4.2.1 概述 55
4.2.2 fork()函数 56
4.2.3 vfork()函数 58
4.2.4 clone()函数 58
4.2.5 do_fork()函数 59
4.2.6 exec()函数族 61
4.3 进程终止 62
4.3.1 概述 62
4.3.2 进程终止过程 63
4.3.3 进程的状态 64
4.4 线程的实现 65
4.5 工业监控场景应用 67
4.5.1 场景描述 67
4.5.2 处理流程 67
4.5.3 程序范例 68
4.6 小结 71
4.7 习题 72
第5章 进程调度 73
5.1 调度策略 73
5.1.1 优先级调度 73
5.1.2 时间片轮转 74
5.1.3 三种调度策略 75
5.2 调度算法分析 75
5.3 等待队列 79
5.4 抢占和上下文切换分析 80
5.4.1 上下文切换 80
5.4.2 抢占 81
5.5 调度相关系统调用 82
5.6 动态更改进程优先级程序实例 84
5.6.1 场景描述 84
5.6.2 处理流程 85
5.6.3 程序范例 85
5.7 小结 86
5.8 习题 86
第6章 系统调用 88
6.1 API、POSIX及C库 88
6.2 系统调用及实现分析 89
6.2.1 基本概念 89
6.2.2 系统调用简述 90
6.2.3 系统调用功能模块的初始化 92
6.2.4 内核服务 92
6.2.5 实现过程 93
6.2.6 调用流程实例 95
6.3 添加系统调用 96
6.4 增加系统调用场景应用 98
6.4.1 场景描述 98
6.4.2 添加流程 98
6.4.3 计算数值平方的系统调用添加实例 100
6.5 小结 100
6.6 习题 101
第7章 中断机制 102
7.1 中断 102
7.1.1 中断分类 102
7.1.2 中断请求 103
7.2 中断处理程序 104
7.3 管理中断的数据结构 105
7.3.1 结构体irq_desc_t 106
7.3.2 结构体irqaction 107
7.3.3 结构体hw_interrupt_type 108
7.4 注册中断处理程序 110
7.5 释放中断处理程序 111
7.6 编写中断处理程序 111
7.7 中断上下文 112
7.8 中断处理机制的实现 112
7.8.1 中断处理总体流程 112
7.8.2 中断处理具体过程 113
7.8.3 与中断处理相关的主要函数 113
7.8.4 下半部机制 123
7.8.5 软中断 123
7.8.6 tasklet 125
7.8.7 工作队列 132
7.9 中断处理程序场景应用 142
7.9.1 场景描述 142
7.9.2 处理流程 142
7.9.3 程序范例 143
7.10 小结 144
7.11 习题 145
第8章 内核同步机制 146
8.1 临界区和竞争条件 146
8.2 原子操作 146
8.3 自旋锁 150
8.4 读/写自旋锁 154
8.5 信号量 156
8.6 读/写信号量 157
8.7 完成变量 159
8.8 BKL 160
8.9 生产者/消费者场景应用 160
8.9.1 场景描述 160
8.9.2 处理流程 161
8.9.3 程序范例 161
8.10 小结 166
8.11 习题 167
第9章 定时器和时间管理机制 168
9.1 内核中的时间概念 168
9.2 节拍率 169
9.3 jiffies 169
9.4 硬时钟和定时器 171
9.4.1 硬时钟 171
9.4.2 定时器 175
9.5 时钟中断处理程序 175
9.6 内核时间管理函数 178
9.7 定时器 180
9.7.1 动态定时器机制实现原理 180
9.7.2 定时器竞争条件 180
9.7.3 定时器实现 181
9.8 定时显示信息的场景应用 183
9.8.1 场景描述 183
9.8.2 处理流程 183
9.8.3 程序范例 184
9.9 小结 185
9.10 习题 185
第10章 模块机制 187
10.1 模块概念 187
10.2 modutils介绍 188
10.2.1 insmod的使用 188
10.2.2 lsmod的使用 189
10.2.3 rmmod的使用 189
10.2.4 modprobe的使用 190
10.2.5 从kerneld到kmod 191
10.3 模块实现机制分析 191
10.3.1 基本概念 191
10.3.2 Linux内核模块实现机制 192
10.3.3 如何构建自己的模块 195
10.4 模块编程注意事项 197
10.4.1 内核中的并发 197
10.4.2 版本相关性 198
10.5 模块机制的改变对设备驱动的影响 198
10.5.1 获取内核版本 199
10.5.2 模块编译 199
10.5.3 模块装载时的版本检查 200
10.5.4 模块的初始化与退出 200
10.5.5 模块使用计数 200
10.5.6 模块输出的内核符号 200
10.5.7 模块的命令行输入参数 201
10.5.8 模块的许可证声明 202
10.6 增加模块应用场景 202
10.6.1 场景描述 202
10.6.2 处理流程 202
10.6.3 程序范例 203
10.7 小结 205
10.8 习题 205
第11章 内存管理机制 206
11.1 基本机制 206
11.1.1 页 206
11.1.2 区 208
11.2 伙伴算法 212
11.3 slab分配器 214
11.4 内存分配释放函数 218
11.5 虚拟内存 222
11.6 高速缓存 223
11.7 Linux页表 224
11.8 进程内存映射 225
11.9 内存管理应用实例 225
11.10 小结 227
11.11 习题 228
第12章 虚拟文件系统 229
12.1 和平共处通用文件系统接口 229
12.2 VFS对象及数据结构 230
12.3 超级块对象 231
12.3.1 超级块结构体 231
12.3.2 超级块操作 234
12.4 索引节点对象 236
12.4.1 索引节点结构体 236
12.4.2 索引节点操作 238
12.5 目录项对象 240
12.5.1 目录项结构体 240
12.5.2 目录项操作 241
12.6 文件对象 242
12.6.1 文件对象结构体 242
12.6.2 文件对象操作 244
12.7 VFS中挂载与卸载文件系统 246
12.7.1 登记文件系统 246
12.7.2 安装文件系统 247
12.7.3 卸载文件系统 248
12.8 小结 248
12.9 习题 248
第13章 I/O设备管理 249
13.1 I/O管理机制 249
13.2 块设备管理 249
13.2.1 缓冲区和缓冲区头 250
13.2.2 bio结构体 252
13.2.3 请求队列 254
13.3 驱动程序设计 257
13.3.1 驱动程序框架 257
13.3.2 块设备驱动程序 259
13.4 驱动程序设计实例 262
13.4.1 字符设备驱动程序 262
13.4.2 块设备驱动程序 265
13.5 小结 266
13.6 习题 267
参考文献 268