第1章 Linux内核概述 3
1.1 UNIX与Linux 3
1.1.1 UNIX 3
1.1.2 Linux 3
1.1.3 宏内核与微内核 6
1.1.4 Linux内核源码及版本 6
1.2 Linux内核模型 11
1.2.1 多视角下的内核 11
1.2.2 功能模型 14
1.2.3 内存模型 15
1.2.4 时空模型 16
1.2.5 特权模型 17
1.3 本书局限性 18
小结 18
第2章 进程影像 20
2.1 从源代码到进程 20
2.1.1 源代码、目标文件 20
2.1.2 可执行文件与进程影像 26
2.2 proc中的进程 32
2.2.1 进程内存空间 32
2.2.2 进程运行状态等信息 33
2.3 进程空间 35
2.3.1 进程空间描述符 36
2.3.2 虚存区域VMA 40
2.3.3 VMA属性 45
2.4 ELF可执行文件装入过程 48
2.4.1 ELF装入函数 49
2.4.2 ELF格式 49
2.5 进程空间的动态变化 54
2.5.1 VMA上的操作 54
2.5.2 文件映射 55
2.5.3 堆的调整 58
2.5.4 栈的变化 60
2.6 并发的进程空间 60
小结 61
第3章 虚拟空间的物理支撑 63
3.1 物理内存组织与管理 64
3.1.1 节点与内存域 64
3.1.2 物理页帧 79
3.1.3 buddy系统 84
3.1.4 页帧迁移 94
3.1.5 内存热插拔 98
3.2 地址映射与页表 99
3.2.1 分页机制与页表 99
3.2.2 缺页异常 103
3.3 内核空间 104
3.3.1 一致映射与高端内存 104
3.3.2 一致内存分配 108
3.3.3 非一致内存分配 109
3.3.4 slub分配器 115
小结 130
第4章 进程组织与基础行为 131
4.1 进程组织管理 131
4.1.1 PCB进程控制块 131
4.1.2 命名空间 135
4.1.3 进程标识 141
4.1.4 进程间关系 148
4.1.5 进程资源限制 151
4.2 进程创建与撤销 152
4.2.1 进程创建 152
4.2.2 execve系统调用 159
4.2.3 内核线程 160
4.2.4 Linux进程树 162
4.2.5 进程的撤销 167
4.3 进程切换 167
4.3.1 切换时机 168
4.3.2 切换过程 169
4.3.3 切换示例 178
小结 181
第5章 进程调度与负载均衡 193
5.1 调度与均衡基本框架 193
5.2 进程状态与转换 194
5.2.1 进程调度状态 194
5.2.2 进程状态变迁 196
5.3 进程调度 198
5.3.1 调度框架 198
5.3.2 完全公平调度 215
5.3.3 实时调度 230
5.3.4 STOP和IDLE调度类 234
5.3.5 调度控制与proc接口 236
5.4 负载均衡 241
5.4.1 处理器层次结构 242
5.4.2 调度的层次管理 243
5.4.3 CFS任务的负载均衡 250
5.4.4 实时负载均衡 254
小结 258
第6章 进程间通信与同步 259
6.1 管道通信 260
6.1.1 无名管道 260
6.1.2 命名管道 261
6.1.3 管道数据结构 261
6.1.4 管道操作 266
6.2 System V IPC 269
6.2.1 IPC标识与命名空间 269
6.2.2 IPC公共框架 275
6.2.3 IPC信号量 279
6.2.4 IPC消息队列 283
6.2.5 IPC共享内存 287
6.3 信号 290
6.3.1 信号分类 290
6.3.2 数据结构 294
6.3.3 信号产生与发送 302
6.3.4 信号的递交和处理 305
小结 312
第7章 内核活动 313
7.1 中断分类 313
7.1.1 x86的中断和异常 314
7.1.2 后半部机制与软中断 315
7.1.3 中断相关概念的关系 315
7.2 中断处理 316
7.2.1 中断号 317
7.2.2 中断描述符表 320
7.2.3 公共入口 325
7.2.4 异常处理 329
7.3 高层中断处理 332
7.3.1 转向高层处理 333
7.3.2 中断的高层数据结构 336
7.3.3 中断返回处理 342
7.3.4 中断的线程化 349
7.4 中断嵌套与中断管理 350
7.4.1 中断嵌套与中断上下文 350
7.4.2 中断管理 353
7.5 软中断和tasklet 355
7.5.1 中断的下半部 355
7.5.2 软中断执行时机 356
7.5.3 相关数据结构 360
7.5.4 软中断的执行 361
7.5.5 软中断的相关操作 363
7.5.6 tasklet 365
7.6 工作队列 369
7.6.1 工作队列机制 369
7.6.2 cmwq数据结构 371
7.6.3 工作项 371
7.6.4 cmwq工作队列 375
7.6.5 工作者池worker_pool 383
7.6.6 并发度、应急处理等 386
7.7 系统调用 388
7.7.1 POSIX API、C库和系统调用 388
7.7.2 系统调用的实现 389
小结 399
第8章 时间管理 400
8.1 时间管理框架 400
8.1.1 基本概念 400
8.1.2 时间中断和事件 406
8.1.3 clock_event_device与tick_device 407
8.1.4 TIMER_SOFTIRQ软中断 413
8.1.5 timekeeper 414
8.2 定时器 416
8.2.1 低分辨率定时器 416
8.2.2 高精度定时器 419
8.2.3 模拟tick事件 422
8.2.4 通知链技术 423
小结 424
第9章 内核并发与同步 426
9.1 同步的需求 426
9.1.1 内核并发情形 426
9.1.2 内核抢占 429
9.2 内核共享变量的保护 432
9.2.1 被保护对象 432
9.2.2 保护原则 433
9.2.3 禁止内核并发 435
9.3 内核同步手段 437
9.3.1 原子操作 437
9.3.2 自旋锁、读写锁和顺序锁 439
9.3.3 RCU机制 444
9.3.4 顺序和屏障 447
9.3.5 信号量与互斥量 448
9.3.6 等待队列与完成变量 452
9.3.7 每CPU变量 455
小结 458
第二篇 盘根错节的文件系统
第10章 文件系统 461
10.1 文件系统的抽象层次 461
10.1.1 进程视角下的文件 462
10.1.2 VFS虚拟文件系统 468
10.1.3 多角度分层模型 472
10.2 VFS核心对象 475
10.2.1 文件对象 475
10.2.2 目录项对象 479
10.2.3 索引节点对象 484
10.2.4 超级块对象 490
10.3 文件系统类型与挂载 495
10.3.1 文件系统类型与注册 495
10.3.2 挂载操作 503
10.3.3 挂载模式 513
10.3.4 特殊文件系统 519
小结 525
第11章 页缓存和块缓存 526
11.1 页高速缓存 527
11.1.1 address_space 528
11.1.2 页高速缓存的组织 530
11.1.3 反向映射 534
11.2 块高速缓存 540
11.2.1 块缓存 540
11.2.2 LRU块缓存 542
11.2.3 块缓存操作 543
小结 547
第12章 VFS的文件操作 548
12.1 VFS系统调用 548
12.2 open()与close()系统调用 549
12.2.1 open的框架 549
12.2.2 文件定位过程 552
12.2.3 close()系统调用 558
12.3 读/写系统调用 558
12.3.1 入口代码 560
12.3.2 通用write写例程 568
12.3.3 通用read读例程 570
12.3.4 其他读写细节 583
12.3.5 向BIO层提交请求 587
小结 588
第13章 ext2文件系统 590
13.1 ext2磁盘数据结构 590
13.1.1 磁盘分区的组织 590
13.1.2 块组描述符和位图 591
13.1.3 盘上和内存数据结构 592
13.2 ext2超级块 593
13.2.1 ext2超级块数据结构 593
13.2.2 挂载与访问 597
13.3 ext2索引节点 598
13.3.1 盘上ext2索引节点 599
13.3.2 内存ext2索引节点 601
13.3.3 inode_operations 603
13.3.4 ext2地址空间与文件操作 604
13.4 目录及目录项 607
13.4.1 ext2_dir_entry 607
13.4.2 ext2_lookup() 609
小结 610
第14章 页缓存同步(回写) 611
14.1 同步/回写、交换与回收 611
14.2 脏页同步(回写) 613
14.2.1 回写机制演变 613
14.2.2 同步时机与框架 615
14.2.3 基本数据结构 617
14.3 回写接口 627
14.3.1 sync系列系统调用 627
14.3.2 sys_sync() 628
14.3.3 sys_syncfs 633
14.3.4 单个文件的同步 635
14.3.5 被动回写 637
14.4 回写工作队列 638
14.4.1 初始化 638
14.4.2 工作队列处理函数 640
14.5 回写操作 643
14.5.1 do_writepages() 644
14.5.2 ext2_writepages() 645
14.5.3 回写等待 647
小结 649
第15章 内存回收与交换 650
15.1 页帧回收 650
15.1.1 直接释放 650
15.1.2 LRU页帧组织 651
15.1.3 PFRA回收算法 655
15.2 核心回收操作 659
15.2.1 shrink_zone() 659
15.2.2 shrink_slab() 666
15.2.3 解除页表映射 667
15.3 交换 667
15.3.1 交换功能 668
15.3.2 交换分区 668
15.3.3 交换缓存 673
小结 675
第16章 设备管理 676
16.1 设备管理组织 676
16.1.1 设备驱动模型 677
16.1.2 sysfs 678
16.1.3 基础组件 679
16.1.4 容器 682
16.2 设备的VFS接口 688
16.2.1 设备文件 689
16.2.2 从VFS中访问设备 691
16.3 字符设备 693
16.3.1 设备的散列组织 694
16.3.2 初始化与注册 695
16.3.3 打开字符设备 696
16.4 PCI设备 698
16.4.1 pci_bus_type和pci_bus 699
16.4.2 pci_driver 700
16.4.3 pci_dev 701
16.4.4 uevent 704
小结 705
第17章 块设备 706
17.1 基本概念 706
17.1.1 块设备层 706
17.1.2 传送单位 708
17.2 块设备层组件 709
17.2.1 磁盘与磁盘分区 709
17.2.2 块设备 712
17.2.3 请求队列 715
17.3 提交请求及处理 728
17.3.1 plug/unplug机制 728
17.3.2 提交请求 733
17.3.3 提交到驱动程序 742
17.3.4 硬盘的request_fn 744
17.3.5 中断处理 746
17.4 IO调度 749
17.4.1 IO调度器 749
17.4.2 调度器数据结构 751
17.5 初始化及注册 754
17.5.1 块设备初始化 754
17.5.2 硬盘初始化 759
小结 764
附录 765
后记 774
· · · · · · (
收起)