第1章 Linux内核学习基础 1
1.1为什么研究Linux内核 2
1.1.1 Linux的历史来源 2
1.1.2 Linux的发展现状 3
1.1.3 Linux的前景展望 3
1.2选择什么版本进行研究 3
1.3内核基本结构 4
1.3.1内核在操作系统中的地位 4
1.3.2 Linux 2.6内核源代码目录树简介 5
1.3.3 Linux 2.6内核的新特性 8
1.4如何阅读本书 9
1.4.1内核探索工具 10
1.4.2推荐阅读方法 12
第2章 引导过程分析 14
2.1内核镜像的构建过程 15
2.1.1编译内核的步骤及分析 15
2.1.2内核镜像构建过程分析 16
2.2系统引导过程分析 18
2.2.1傀儡引导扇区 18
2.2.2探测系统资源 21
2.2.3解压内核镜像 35
2.2.4进入保护模式 40
2.2.5系统最终初始化 47
2.3系统引导过程总结 47
第3章 内存管理 50
3.1基础知识 51
3.1.1存储器地址 51
3.1.2分段机制 52
3.1.3分页机制 59
3.2内核页表的初始化过程 65
3.2.1启用分页机制 65
3.2.2构建内核页表 68
3.3物理内存的描述方法 76
3.3.1内存节点 77
3.3.2内存区域 81
3.3.3物理页框 85
3.4物理内存的初始化过程 86
3.4.1探测系统物理内存 87
3.4.2初始化内存分配器 89
3.5物理内存的分配与回收 101
3.5.1伙伴分配算法 101
3.5.2对象缓冲技术 103
3.6内核地址空间 105
3.6.1常规映射地址空间 105
3.6.2固定映射地址空间 107
3.6.3长久内核映射空间 109
3.6.4临时内核映射空间 116
3.6.5非连续映射地址空间 119
第4章 进程管理 128
4.1进程与线程的概念 129
4.1.1程序与进程 129
4.1.2进程与线程 129
4.2进程描述符 131
4.2.1进程标识符 132
4.2.2进程的状态 132
4.2.3进程上下文 134
4.2.4当前进程 139
4.3进程的组织形式 143
4.3.1进程标识符构成的哈希表 143
4.3.2所有进程构成的双向链表 148
4.3.3执行态进程组成的运行队列 149
4.3.4阻塞态进程组成的等待队列 152
4.4进程的创建过程 155
4.4.1进程创建的接口函数 156
4.4.2进程创建的处理过程 162
4.5进程调度算法 177
4.5.1进程的分类 178
4.5.2进程优先级 178
4.5.3时间片分配 181
4.5.4进程调度时机 182
4.6进程切换过程分析 183
4.6.1选取合适进程 183
4.6.2完成上下文切换 184
4.7空闲进程的初始化 187
4.7.1空闲进程的内核态栈 187
4.7.2空闲进程的内存描述符 188
4.7.3空闲进程的硬件上下文 190
4.7.4空闲进程的任务状态段 190
第5章 中断和异常 192
5.1基础知识 193
5.1.1中断和异常的定义 193
5.1.2中断和异常的分类 193
5.1.3中断和异常的对比 194
5.2处理机制 195
5.2.1 IA32架构下的处理机制 195
5.2.2 Linux内核的实现策略 200
5.3中断描述符表的初始化 204
5.3.1中断描述符表的初步初始化 204
5.3.2中断描述符表的最终初始化 206
5.4具体处理过程 216
5.4.1公用的硬件处理阶段 217
5.4.2中断的软件处理阶段 218
5.4.3异常的软件处理阶段 229
5.5延迟处理机制 233
5.5.1 softirq延迟处理 234
5.5.2 tasklet延迟处理 239
5.5.3 work queue延迟处理 242
第6章 时间度量 249
6.1硬件支持 250
6.1.1实时钟RTC 250
6.1.2系统时钟 250
6.2软件架构 252
6.2.1相对时间 252
6.2.2墙上时间 257
6.2.3内核定时器 257
6.3时间度量的初始化过程 260
6.3.1内核定时器初始化 260
6.3.2系统时钟的初始化 263
6.3.3初始化时钟中断源 265
6.4时钟中断处理过程 266
6.4.1找回遗失的时钟中断 267
6.4.2更新jiffies 64、 xtime 269
6.4.3对当前进程记账 271
6.4.4时钟中断处理小结 272
6.5内核定时器工作原理 273
6.5.1初始化内核定时器节点 273
6.5.2激活内核定时器节点 273
6.5.3内核定时器的处理过程 277
6.6微秒级延迟 280
6.6.1微妙级延迟的访问接口 281
6.6.2微妙级延迟的实现方法 281
第7章 系统调用 285
7.1系统服务接口的种类 286
7.1.1系统调用接口 286
7.1.2应用编程接口 286
7.2系统调用的访问手段 286
7.2.1使用封装函数 286
7.2.2使用通用接口 287
7.2.3使用内嵌汇编 288
7.3系统调用的工作机制 289
7.3.1系统调用的基本要素 290
7.3.2系统调用门的初始化 292
7.3.3系统调用的处理过程 292
7.4系统调用的参数传递 297
7.4.1少量参数的情况 297
7.4.2大量参数的情况 298
7.5如何添加新系统调用 299
7.5.1前期准备工作 299
7.5.2添加处理函数 300
7.5.3测试新系统调用 301
7.6什么是快速系统调用 302
7.6.1工作机制 302
7.6.2实现策略 305
7.6.3处理过程 309
第8章 内核同步机制 312
8.1同步基本原理 313
8.1.1原子变量 313
8.1.2中断禁用 315
8.1.3内核态抢占 316
8.2系统引导过程分析 318
8.2.1普通自旋锁 318
8.2.2读写自旋锁 325
8.2.3顺序自旋锁 331
8.3信号量机制 334
8.3.1普通信号量 335
8.3.2读写信号量 339
8.4其他同步机制 340
8.4.1每处理器变量 341
8.4.2 RCU同步机制 345
附录A Linux内核双向链表 350
A.1内核链表表头 351
A.2内核链表遍历 352
A.3内核链表遍历 353
附录B 跟踪调试内核 354
B.1安装辅助工具 355
B.2准备内核镜像 355
B.3准备根文件系统 355
B.4进行源码级调试 356
附录C Linux内核汇编语法 358
C.1常规汇编语法 359
C.1.1寄存器前缀 359
C.1.2立即数前缀 359
C.1.3操作数顺序 359
C.1.4操作数宽度 359
C.1.5内存寻址格式 359
C.2内嵌汇编语法 360
C.2.1内嵌汇编举例 360
C.2.2内嵌汇编格式——格式框架 361
C.2.3内嵌汇编格式——语句模板 361
C.2.4内嵌汇编格式——输出列表 361
C.2.5内嵌汇编格式——输入列表 362
C.2.6内嵌汇编格式——修饰字符 362
C.2.7内嵌汇编格式——破坏描述 364
附录D 参考文献 366
D.1关于IA32体系结构的资源 367
D.2关于Linux内核的相关资源 367
D.3关于计算机基本原理的资源 367
D.4其他相关资源 368