第1章 总览 1
1.1 简介 1
1.2 Linux学习曲线和职业曲线 4
1.2.1 给自己定级 4
1.2.2 使用者 8
1.2.3 开发者 17
1.3 如何形成一个内核 24
1.3.1 内核形成过程 24
1.3.2 Exokernels和Anykernel 25
1.3.3 内核为何使用C语言 26
第2章 内核架构 29
2.1 常见架构范式与核心系统 29
2.1.1 Linux内核上下层通信方式 29
2.1.2 横向系统和纵向系统 32
2.2 基础功能元素 32
2.2.1 模块支持 32
2.2.2 模块编程可以使用的内核组件 37
2.3 特殊硬件框架 39
2.4 特殊软件机制 41
第3章 内核数据结构 47
3.1 链表与哈希表 47
3.1.1 双向链表 48
3.1.2 hlist 48
3.1.3 ScatterList 50
3.1.4 llist 51
3.2 其他数据结构 53
3.2.1 树 53
3.2.2 FIFO文件 53
3.2.3 位数组bitmap 57
第4章 Linux系统的启动 59
4.1 启动的硬件支持 59
4.1.1 固件 59
4.1.2 磁盘分区管理 60
4.2 Bootloader和内核二进制 62
4.2.1 Bootloader 62
4.2.2 内核二进制 63
4.3 Linux的启动原理 64
4.3.1 Linux的最小系统制作和启动 65
4.3.2 initrd文件系统 66
4.3.3 EFI启动桩 68
4.3.4 启动管理程序 69
4.3.5 Linux内核启动顺序 74
第5章 进程 75
5.1 进程原理 75
5.1.1 服务与进程 75
5.1.2 资源与进程 76
5.1.3 进程概念 76
5.1.4 父子关系 77
5.1.5 ptrace系统调用 82
5.2 进程调度 90
5.2.1 调度策略 91
5.2.2 进程调度策略的配置 92
5.2.3 公平问题 92
5.2.4 内核线程的调度 93
5.3 资源 94
5.3.1 资源锁 94
5.3.2 资源限制 96
5.3.3 进程对系统内存的使用 97
5.4 多进程与进程通信 98
5.4.1 多进程模型 98
5.4.2 用户进程间通信 99
5.4.3 内核与用户空间的进程通信 103
5.4.4 Netlink功能模块 105
5.4.5 其他Netlink种类 106
5.4.6 genetlink的使用 108
5.4.7 inet_diag模块 112
5.4.8 RTNETLINK 116
第6章 Linux内核内存管理 121
6.1 内存模型 121
6.1.1 内存模型概览 121
6.1.2 内存组织方式 122
6.2 申请和释放内存 124
6.2.1 高端内存 124
6.2.2 设备内存映射 125
6.2.3 启动时内存的申请和释放:bootmem 126
6.2.4 Mempool 126
6.2.5 CMA(连续内存分配器) 127
6.2.6 伙伴算法 127
6.2.7 slab 127
6.2.8 用户端内存管理基础组件 128
6.3 内存组件 129
6.3.1 内存回收算法(PFRA) 129
6.3.2 其他内存功能组件 130
6.3.3 内存压缩 132
6.3.4 BDI(backing device info) 133
第7章 安全 137
7.1 概览 137
7.2 密码学 138
7.2.1 密码学概览 138
7.2.2 摘要 139
7.2.3 加密 140
7.2.4 认证 141
7.2.5 数字签名 142
7.2.6 秘钥交换 142
7.3 Linux用户和权限系统 143
7.3.1 系统启动时的权限 143
7.3.2 系统启动后的权限 144
7.3.3 内核中的用户和权限模型 145
7.3.4 Linux安全体系 146
7.4 网络安全 148
7.4.1 netfilter概览 148
7.4.2 Filter(LSF、BPF、eBPF) 151
7.5 函数调用的调试 163
7.6 内核调试 164
7.7 PAM和Apparmor 170
7.8 内核安全 175
7.9 常用安全工具和项目 175
第8章 网络 180
8.1 网络架构 180
8.2 socket 185
8.2.1 socket简介 185
8.2.2 类型与接口 186
8.2.3 Linux socket连接模型 190
8.3 IP 191
8.3.1 IP管理 191
8.3.2 IP隧道 193
8.4 TCP 201
8.4.1 TCP存在的原因 201
8.4.2 TCP的连接状态 202
8.4.3 TCP拥塞控制 207
8.4.4 TCP其他的功能特点 215
8.5 网络服务质量与安全性 217
8.5.1 TCP安全性 217
8.5.2 QoS 221
8.5.3 NAT 225
第9章 总线与设备变动 229
9.1 PCI 229
9.2 USB 238
9.2.1 USB概览 238
9.2.2 USB子系统上层(USB设备驱动层) 239
9.2.3 USB子系统的中层(USB core)和下层 242
9.2.4 Platform总线 244
9.3 用户空间的设备管理 244
9.3.1 设备变化通知用户端 245
9.3.2 设备类型 247
9.3.3 内核数据结构的面向用户组织KObject 253
第10章 二进制 254
10.1 函数调用 254
10.1.1 函数调用约定 254
10.1.2 栈结构 258
10.2 Linux的二进制兼容性问题 260
10.2.1 进程的执行 260
10.2.2 同操作系统下的ABI 261
10.2.3 内核版本 262
10.2.4 库 263
10.2.5 编译器 265
10.3 ELF文件执行原理 265
10.3.1 ELF文件分类 265
10.3.2 ELF文件格式 266
10.3.3 进程加载器 280
10.3.4 链接与执行 281
10.3.5 ELF文件的初始化 284
10.3.6 进程初始化前的加载 285
10.3.7 链接环境变量 287
10.3.8 内核加载ELF 288
10.3.9 Audit接口 289
10.3.10 一个简单的ELF解析程序 289
10.4 ELF的安全性 292
10.4.1 二进制修改 293
10.4.2 二进制格式的病毒和木马 297
10.4.3 二进制安全特性简介 298
第11章 存储 301
11.1 磁盘管理 301
11.2 存储协议 304
11.3 通用块层抽象 314
11.3.1 通用块层功能概览 314
11.3.2 数据完整性校验 316
11.3.3 设备抽象 317
11.3.4 BIO和bio_set 317
11.3.5 request 318
11.3.6 request_queue 319
11.3.7 电梯算法 320
11.4 缓存层 330
11.4.1 BDI:缓存设备 330
11.4.2 页回收 332
11.4.3 缓存机制 334
11.4.4 缓存页的状态 337
11.5 文件系统 338
11.5.1 文件系统的种类和选用 339
11.5.2 拥有特殊功能的文件系统 339
11.5.3 其他领域的文件系统 343
11.5.4 文件系统的意义 344
11.5.5 文件系统的抽象:VFS 345
11.5.6 ext4 346
11.6 存储系统 348
11.6.1 存储形式 348
11.6.2 存储格式 350
11.6.3 分布式存储系统 350
第12章 虚拟化与云 358
12.1 常见的虚拟化方案 358
12.2 虚拟文件系统 361
12.3 cgroup 363
12.4 Docker 369
第13章 硬件专用子系统 374
13.1 无线子系统 374
13.2 音频子系统 380