本书主要描述Linux系统的总体框架和设计思想,包含很多可以直接操作的实例。编写本书的目的是希望读者对Linux系统背后的逻辑有一个全面的了解。本书对比较核心且常用的技术点有更加深入的解释,对实际使用Linux系统工作大有裨益,同时,选择重点的方向进行源码级深度分析,包含大量的案例,而且增加了与Windows同类操作系统的对比,涉及Fuchsia?OS和Android系统的一些实现,对操作系统的描述更清晰。 本书适合Linux系统开发人员、嵌入式系统开发人员阅读,也可供计算机相关专业的师生阅读。
刘京洋,从事Linux内核相关研发十余年,工作内容包括对内核子系统的实际产业应用。尤其擅长网络研发与性能调优,对Linux之外的操作系统同样兴趣浓厚。目前,在腾讯前沿技术中心从事云游戏研发工作。
第1章 操作系统总览 1
1.1 操作系统简介 1
1.2 如何形成一个内核 4
1.3 主要操作系统与Linux的对比 6
1.3.1 Linux和Android 6
1.3.2 Windows下Linux运行环境的发展 8
1.3.3 Fuchsia OS与Windows、Linux的对比 9
第2章 系统结构 15
2.1 Linux内核整体结构 15
2.1.1 内核模块 17
2.1.2 内核符号表 23
2.2 Linux内核数据结构 25
2.2.1 链表与哈希表 25
2.2.2 双向链表 26
2.3 hlist 28
2.3.1 llist 34
2.3.2 树与IDR 37
2.3.3 xarray 38
第3章 锁与系统调用 46
3.1 原子操作 47
3.1.1 内存一致性 51
3.1.2 原子类型定义 54
3.1.3 cmpxchg实现 56
3.2 引用计数 60
3.3 自旋锁 65
自旋锁的性能 77
3.4 读写锁与顺序锁 79
3.5 信号量 82
3.6 读写信号量 86
3.6.1 获得读锁 87
3.6.2 锁状态与锁交接 90
3.6.3 锁持有 92
3.6.4 等待链表 94
3.6.5 读锁慢速路径 99
3.7 互斥锁 103
3.8 RCU锁 110
3.8.1 RCU锁基本接口 114
3.8.2 grace period等待 115
3.8.3 SRCU 117
3.8.4 RCU锁、读写锁与顺序锁对比 118
3.8.5 hlist中的RCU锁 119
3.8.6 reuseport中的RCU锁 121
3.9 引用计数 123
percpu-ref 124
第4章 信号、中断与系统调用 129
4.1 信号 129
4.1.1 Linux信号处理机制的设计 129
4.1.2 Windows的Event语义设计 139
4.2 中断 141
4.2.1 IDT(中断描述符表) 141
4.2.2 IPI中断 148
4.3 系统调用 156
4.3.1 系统调用原理 156
4.3.2 vsyscall与VDSO 163
4.3.3 系统调用截断 168
第5章 Linux系统的启动与进程 171
5.1 Linux启动过程的组件 171
5.1.1 启动过程相关组件 171
5.1.2 最小系统的制作和启动 182
5.2 内核启动流程:EFI stub 183
5.3 进程 199
5.3.1 进程概述 199
5.3.2 进程内存和PID 201
5.3.3 进程生命周期 205
第6章 调度 220
6.1 任务调度 220
6.1.1 调度优先级 220
6.1.2 上下文切换 223
6.1.3 运行队列与调度类 228
6.1.4 调度域、调度组与调度实体 230
6.1.5 TTWU(唤醒) 239
6.2 时钟 244
6.2.1 时钟概念 244
6.2.2 计时器与定时器 248
6.3 Futex系统调用 256
6.4 C-State 263
第7章 内存管理 275
7.1 地址空间 275
7.1.1 64位Linux地址空间 275
7.1.2 32位Linux地址空间 276
7.2 寻址 280
7.2.1 64位下的寻址 280
7.2.2 Intel的硬件四级寻址过程 284
7.2.3 操作系统的页状态和权限控制 291
7.2.4 页框回收算法 293
7.2.5 段寄存器 301
7.3 堆内存管理 306
7.3.1 用户空间与内核空间的堆内存管理 306
7.3.2 Buddy思想与Slab思想 307
7.3.3 内存回收(PFRA) 314
7.3.4 BDI 316
第8章 存储 319
8.1 VFS 319
8.1.1 文件句柄与文件描述符表 319
8.1.2 _alloc_fd、fd_install、dup2与close_on_exec 322
8.1.3 open系统调用 325
8.1.4 flock文件锁与文件内容锁 328
8.2 通用块层 339
8.2.1 通用块层功能概览 339
8.2.2 bio和bio_set 342
8.2.3 request和request_queue 343
8.2.4 电梯算法 345
8.3 缓存层 354
8.3.1 Linux与Windows在缓存设计上的不同 354
8.3.2 Linux下的缓存机制 355
8.4 文件系统与Ext4 362
8.4.1 Linux文件系统的特性与框架 362
8.4.2 文件系统的种类 367
8.4.3 文件系统的抽象:VFS 372
8.4.4 Ext4文件系统实践 375
8.5 预读机制 383
8.5.1 预读机制框架 383
8.5.2 预读算法 388
第9章 套接字(socket) 393
9.1 socket概览 393
9.1.1 socket类型与接口 394
9.1.2 Linux socket连接模型 397
9.1.3 Linux socket的锁 398
9.1.4 epoll 400
9.2 Netlink 402
9.2.1 Netlink消息格式 402
9.2.2 Netlink功能模块 406
9.2.3 genetlink的使用 408
9.2.4 inet_diag模块 410
9.2.5 RTNETLINK 414
9.3 BPF与eBPF 418
9.3.1 BPF 419
9.3.2 eBPF 422
第10章 网络 430
10.1 网络架构 430
10.2 IP 434
10.2.1 路由条目的意义 434
10.2.2 IP管理 437
10.2.3 IP隧道 439
10.3 TCP 446
10.3.1 TCP的无损特性 446
10.3.2 TCP的连接状态 447
10.3.3 TCP拥塞控制 452
10.4 负载均衡 460
10.4.1 负载均衡的核心技术点 460
10.4.2 四层负载均衡常见架构 461
10.4.3 一致性哈希和分布式哈希 463
10.5 网络服务质量与安全性 465
10.5.1 TCP安全性 465
10.5.2 QoS 469
10.5.3 NAT 472
10.6 netfilter 475
第11章 设备管理 479
11.1 设备模型 479
11.1.1 sys文件系统 479
11.1.2 设备变化通知用户端 484
11.1.3 设备类型 485
11.2 tty子系统 491
11.2.1 tty框架与ttyS硬件 491
11.2.2 terminal硬件 493
11.2.3 tty结构 494
11.2.4 getty、login与shell 496
11.2.5 /dev/ptmx与/dev/pts/n 496
11.2.6 SSH 501
11.3 PCI与USB 502
11.3.1 PCI 502
11.3.2 USB 510
第12章 二进制 516
12.1 二进制原理 516
12.1.1 编译、链接与执行 516
12.1.2 裸程序 518
12.1.3 加载器 519
12.1.4 链接过程 523
12.2 ELF格式 525
12.2.1 ABI 525
12.2.2 ELF 529
12.3 函数调用约定 547
12.4 二进制安全 552