LINUX內核奔跑捲 1
第1章 處理器體係結構 4
本章思考題 4
第2章 內存管理 32
本章思考題 32
2.1 物理內存初始化 36
2.1.1 內存管理概述 36
2.1.2 內存大小 37
2.1.3 物理內存映射 38
2.1.4 zone初始化 40
2.1.5 空間劃分 44
2.1.6 物理內存初始化 45
2.2 頁錶的映射過程 51
2.2.1 ARM32頁錶映射 51
2.2.2 ARM64頁錶映射 60
2.3 內核內存的布局圖 67
2.3.1 ARM32內核內存布局圖 67
2.3.2 ARM64內核內存布局圖 70
2.4 分配物理頁麵 72
2.4.1 夥伴係統分配內存 72
2.4.2 釋放頁麵 85
2.4.3 小結 89
2.5 slab分配器 90
2.5.1 創建slab描述符 91
2.5.2 分配slab對象 103
2.5.3 釋放slab緩衝對象 108
2.5.4 kmalloc分配函數 111
2.5.5 小結 112
2.6 vmalloc 113
2.7 VMA操作 120
2.7.1 查找VMA 122
2.7.2 插入VMA 124
2.7.3 閤並VMA 129
2.7.4 紅黑樹例子 131
2.7.5 小結 133
2.8 malloc 133
2.8.1 brk實現 134
2.8.2 VM_LOCK情況 138
2.8.3 小結 148
2.9 mmap 150
2.9.1 mmap概述 151
2.9.2 小結 153
2.10 缺頁中斷處理 155
2.10.1 do_page_fault() 157
2.10.2 匿名頁麵缺頁中斷 165
2.10.3 文件映射缺頁中斷 169
2.10.4 寫時復製 175
2.10.5 小結 183
2.11 page引用計數 184
2.11.1 struct page數據結構 185
2.11.2 _count和_mapcount的區彆 188
2.11.3 頁麵鎖PG_Locked 192
2.11.4 小結 192
2.12 反嚮映射RMAP 192
2.12.1 父進程分配匿名頁麵 193
2.12.2 父進程創建子進程 198
2.12.3 子進程發生COW 200
2.12.4 RMAP應用 201
2.12.5 小結 202
2.13 迴收頁麵 204
2.13.1 LRU鏈錶 204
2.13.2 kswapd內核綫程 216
2.13.3 balance_pgdat函數 219
2.13.4 shrink_zone函數 228
2.13.5 shrink_active_list函數 233
2.13.6 shrink_inactive_list函數 238
2.13.7 跟蹤LRU活動情況 244
2.13.8 Refault Distance算法 244
2.13.9 小結 249
2.14 匿名頁麵生命周期 251
2.14.1 匿名頁麵的誕生 251
2.14.2 匿名頁麵的使用 252
2.14.3 匿名頁麵的換齣 252
2.14.4 匿名頁麵的換入 254
2.14.5 匿名頁麵銷毀 254
2.15 頁麵遷移 254
migrate_pages()函數 255
2.16 內存規整(memory compaction) 262
2.16.1 內存規整實現 263
2.16.2 小結 272
2.17 KSM 273
2.17.1 KSM實現 274
2.17.2 匿名頁麵和KSM頁麵的區彆 293
2.17.3 小結 294
2.18 Dirty COW內存漏洞 296
2.19 總結內存管理數據結構和API 309
2.19.1 內存管理數據結構的關係圖 309
2.19.2 內存管理中常用API 312
2.20 最新更新和展望 315
2.20.1 頁麵迴收策略從zone遷移到node 315
2.20.2 OOM Killer改進 316
2.20.3 swap優化 317
2.20.4 展望 318
第3章 進程管理 319
本章思考題 319
3.1 進程的誕生 320
3.1.1 init進程 321
3.1.2 fork 325
3.1.3 小結 344
3.2 CFS調度器 345
3.2.1 權重計算 346
3.2.2 進程創建 358
3.2.3 進程調度 369
3.2.4 scheduler tick 379
3.2.5 組調度 382
3.2.6 PELT算法改進 386
3.2.7 小結 387
3.3 SMP負載均衡 389
3.3.1 CPU域初始化 389
3.3.2 SMP負載均衡 401
3.3.3 喚醒進程 415
3.3.4 調試 421
3.3.5 小結 422
3.4 HMP調度器 422
3.4.1 初始化 423
3.4.2 HMP負載調度 425
3.4.3 新創建的進程 436
3.4.4 小結 437
3.5 NUMA調度器 438
3.5.1 node和page的關係 439
3.5.2 掃描進程 441
3.5.3 NUMA缺頁中斷 442
3.5.4 進程遷移 450
3.5.5 小結 455
3.6 EAS綠色節能調度器 457
3.6.1 能效模型 459
3.6.2 WALT算法 465
3.6.3 喚醒進程 480
3.6.4 CPU動態調頻 491
3.6.5 小結 494
3.7 實時調度 496
3.8 最新更新與展望 500
3.8.1 進程管理更新 500
3.8.2 展望 500
第4章 並發與同步 501
本章思考題 501
4.1 原子操作與內存屏障 503
4.1.1 原子操作 503
4.1.2 內存屏障 506
4.2 spinlock 508
4.2.1 spinlock實現 509
4.2.2 spinlock變種 511
4.2.3 spinlock和raw_spin_lock 512
4.3 信號量 513
4.3.1 信號量 513
4.3.2 小結 516
4.4 Mutex互斥體 517
4.4.1 MCS鎖機製 518
4.4.2 Mutex鎖的實現 525
4.4.3 小結 531
4.5 讀寫鎖 531
4.5.1 讀者信號量 532
4.5.2 寫者鎖 538
4.5.3 小結 544
4.6 RCU 544
4.6.1 經典RCU和Tree RCU 547
4.6.2 Tree RCU設計 551
4.6.3 小結 573
4.7 內存管理中的鎖 574
4.8 最新更新與展望 584
4.8.1 Queued Spinlock 584
4.8.2 讀寫信號量優化 591
4.8.3 展望 592
4.8.4 推薦書籍 593
第5章 中斷管理 594
本章思考題 594
5.1 Linux中斷管理機製 595
5.1.1 ARM中斷控製器 595
5.1.2 硬件中斷號和Linux中斷號的映射 599
5.1.3 注冊中斷 610
5.1.4 ARM底層中斷處理 618
5.1.5 高層中斷處理 626
5.1.6 小結 636
5.2 軟中斷和tasklet 637
5.2.1 SoftIRQ軟中斷 638
5.2.2 tasklet 642
5.2.3 local_bh_disable/local_bh_enable 647
5.2.4 小結 649
5.3 workqueue工作隊列 650
5.3.1 初始化工作隊列 652
5.3.2 創建工作隊列 659
5.3.3 調度一個work 665
5.3.4 取消一個work 675
5.3.5 和調度器的交互 680
5.3.6 小結 682
第6章 內核調試 684
6.1 QEMU調試Linux內核 684
6.1.1 QEMU運行ARM Linux內核 684
6.1.2 QEMU調試ARM Linux內核 687
6.1.3 QEMU運行ARMv8開發平颱 688
6.1.4 文件係統支持 690
6.1.5 圖形化調試 691
6.1.6 實驗進階 693
6.2 ftrace 694
6.2.1 irqs跟蹤器 695
6.2.2 preemptoff跟蹤器 696
6.2.3 preemptirqsoff跟蹤器 697
6.2.4 function跟蹤器 698
6.2.5 動態ftrace 699
6.2.6 事件跟蹤 700
6.2.7 添加tracepoint 702
6.2.8 trace-cmd和kernelshark 705
6.2.9 trace marker 707
6.2.10 小結 709
6.3 SystemTap 710
6.4 內存檢測 714
6.4.1 slub_debug 714
6.4.2 內存泄漏檢測kmemleak 718
6.4.3 kasan內存檢測 720
6.5 死鎖檢測 722
6.6 內核調試秘籍 728
6.6.1 printk 728
6.6.2 動態打印 730
6.6.3 RAM Console 731
6.6.4 OOPS分析 731
6.6.5 BUG_ON()和WARN_ON() 734
· · · · · · (
收起)