第1章 操作系统总览\t1
1.1 操作系统简介\t1
1.2 如何形成一个内核\t4
1.3 主要操作系统与Linux的对比\t6
1.3.1 Linux和Android\t6
1.3.2 Windows下Linux运行环境的发展\t8
1.3.3 Fuchsia OS与Windows、Linux的对比\t9
第2章 系统结构\t15
2.1 Linux内核整体结构\t15
2.1.1 内核模块\t17
2.1.2 内核符号表\t23
2.2 Linux内核数据结构\t25
2.2.1 链表与哈希表\t25
2.2.2 双向链表\t26
2.3 hlist\t28
2.3.1 llist\t34
2.3.2 树与IDR\t37
2.3.3 xarray\t38
第3章 锁与系统调用\t46
3.1 原子操作\t47
3.1.1 内存一致性\t51
3.1.2 原子类型定义\t54
3.1.3 cmpxchg实现\t56
3.2 引用计数\t60
3.3 自旋锁\t65
自旋锁的性能\t77
3.4 读写锁与顺序锁\t79
3.5 信号量\t82
3.6 读写信号量\t86
3.6.1 获得读锁\t87
3.6.2 锁状态与锁交接\t90
3.6.3 锁持有\t92
3.6.4 等待链表\t94
3.6.5 读锁慢速路径\t99
3.7 互斥锁\t103
3.8 RCU锁\t110
3.8.1 RCU锁基本接口\t114
3.8.2 grace period等待\t115
3.8.3 SRCU\t117
3.8.4 RCU锁、读写锁与顺序锁对比\t118
3.8.5 hlist中的RCU锁\t119
3.8.6 reuseport中的RCU锁\t121
3.9 引用计数\t123
percpu-ref\t124
第4章 信号、中断与系统调用\t129
4.1 信号\t129
4.1.1 Linux信号处理机制的设计\t129
4.1.2 Windows的Event语义设计\t139
4.2 中断\t141
4.2.1 IDT(中断描述符表)\t141
4.2.2 IPI中断\t148
4.3 系统调用\t156
4.3.1 系统调用原理\t156
4.3.2 vsyscall与VDSO\t163
4.3.3 系统调用截断\t168
第5章 Linux系统的启动与进程\t171
5.1 Linux启动过程的组件\t171
5.1.1 启动过程相关组件\t171
5.1.2 最小系统的制作和启动\t182
5.2 内核启动流程:EFI stub\t183
5.3 进程\t199
5.3.1 进程概述\t199
5.3.2 进程内存和PID\t201
5.3.3 进程生命周期\t205
第6章 调度\t220
6.1 任务调度\t220
6.1.1 调度优先级\t220
6.1.2 上下文切换\t223
6.1.3 运行队列与调度类\t228
6.1.4 调度域、调度组与调度实体\t230
6.1.5 TTWU(唤醒)\t239
6.2 时钟\t244
6.2.1 时钟概念\t244
6.2.2 计时器与定时器\t248
6.3 Futex系统调用\t256
6.4 C-State\t263
第7章 内存管理\t275
7.1 地址空间\t275
7.1.1 64位Linux地址空间\t275
7.1.2 32位Linux地址空间\t276
7.2 寻址\t280
7.2.1 64位下的寻址\t280
7.2.2 Intel的硬件四级寻址过程\t284
7.2.3 操作系统的页状态和权限控制\t291
7.2.4 页框回收算法\t293
7.2.5 段寄存器\t301
7.3 堆内存管理\t306
7.3.1 用户空间与内核空间的堆内存管理\t306
7.3.2 Buddy思想与Slab思想\t307
7.3.3 内存回收(PFRA)\t314
7.3.4 BDI\t316
第8章 存储\t319
8.1 VFS\t319
8.1.1 文件句柄与文件描述符表\t319
8.1.2 _alloc_fd、fd_install、dup2与close_on_exec\t322
8.1.3 open系统调用\t325
8.1.4 flock文件锁与文件内容锁\t328
8.2 通用块层\t339
8.2.1 通用块层功能概览\t339
8.2.2 bio和bio_set\t342
8.2.3 request和request_queue\t343
8.2.4 电梯算法\t345
8.3 缓存层\t354
8.3.1 Linux与Windows在缓存设计上的不同\t354
8.3.2 Linux下的缓存机制\t355
8.4 文件系统与Ext4\t362
8.4.1 Linux文件系统的特性与框架\t362
8.4.2 文件系统的种类\t367
8.4.3 文件系统的抽象:VFS\t372
8.4.4 Ext4文件系统实践\t375
8.5 预读机制\t383
8.5.1 预读机制框架\t383
8.5.2 预读算法\t388
第9章 套接字(socket)\t393
9.1 socket概览\t393
9.1.1 socket类型与接口\t394
9.1.2 Linux socket连接模型\t397
9.1.3 Linux socket的锁\t398
9.1.4 epoll\t400
9.2 Netlink\t402
9.2.1 Netlink消息格式\t402
9.2.2 Netlink功能模块\t406
9.2.3 genetlink的使用\t408
9.2.4 inet_diag模块\t410
9.2.5 RTNETLINK\t414
9.3 BPF与eBPF\t418
9.3.1 BPF\t419
9.3.2 eBPF\t422
第10章 网络\t430
10.1 网络架构\t430
10.2 IP\t434
10.2.1 路由条目的意义\t434
10.2.2 IP管理\t437
10.2.3 IP隧道\t439
10.3 TCP\t446
10.3.1 TCP的无损特性\t446
10.3.2 TCP的连接状态\t447
10.3.3 TCP拥塞控制\t452
10.4 负载均衡\t460
10.4.1 负载均衡的核心技术点\t460
10.4.2 四层负载均衡常见架构\t461
10.4.3 一致性哈希和分布式哈希\t463
10.5 网络服务质量与安全性\t465
10.5.1 TCP安全性\t465
10.5.2 QoS\t469
10.5.3 NAT\t472
10.6 netfilter\t475
第11章 设备管理\t479
11.1 设备模型\t479
11.1.1 sys文件系统\t479
11.1.2 设备变化通知用户端\t484
11.1.3 设备类型\t485
11.2 tty子系统\t491
11.2.1 tty框架与ttyS硬件\t491
11.2.2 terminal硬件\t493
11.2.3 tty结构\t494
11.2.4 getty、login与shell\t496
11.2.5 /dev/ptmx与/dev/pts/n\t496
11.2.6 SSH\t501
11.3 PCI与USB\t502
11.3.1 PCI\t502
11.3.2 USB\t510
第12章 二进制\t516
12.1 二进制原理\t516
12.1.1 编译、链接与执行\t516
12.1.2 裸程序\t518
12.1.3 加载器\t519
12.1.4 链接过程\t523
12.2 ELF格式\t525
12.2.1 ABI\t525
12.2.2 ELF\t529
12.3 函数调用约定\t547
12.4 二进制安全\t552