本書內容基于Linux 4.x內核,主要選取了Linux內核中比較基本和常用的內存管理、進程管理、并發與同步,以及中斷管理這4個內核模塊進行講述。全書共分為6章,依次介紹了ARM體系結構、Linux內存管理、進程調度管理、并發與同步、中斷管理、內核調試技巧等內容。本書的每節內容都是一個Linux內核的話題或者技術點,讀者可以根據每小節前的問題進行思考,進而圍繞問題進行內核源代碼的分析。
本書內容豐富,講解清晰透徹,不僅適合有一定Linux相關基礎的人員,包括從事與Linux相關的開發人員、操作系統的研究人員、嵌入式開發人員及Android底層開發人員等學習和使用,而且適合作為對Linux感興趣的程序員的學習用書,也可以作為大專院校相關專業師生的學習用書和培訓學校的教材。
1.基于Linux 4.x內核
2.Linux內核奔跑卷,提高讀者興趣,方便面試人員復習。
3.以實際問題為導向的內核分析書籍,給讀者提供一個以解決實際問題為引導的閱讀方式。
4.基于Linux 4.x內核和Android 7.x內核
5.基于ARM32 ARM64體系架構
6.內容詳實,講解深入透徹,反映內核社區技術發展
7.新型黑科技:EAS調度器、MCS鎖、QSpinlock、DirtyCOW
張天飛,筆名笨叔叔。Linux內核愛好者,從事Linux內核和驅動開發十余年,在多家芯片公司從事過手機芯片底層軟件開發和客戶支持工作。
目 錄
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 vmalloc113
2.7 VMA操作120
2.7.1 查找VMA122
2.7.2 插入VMA124
2.7.3 合并VMA129
2.7.4 紅黑樹例子131
2.7.5 小結133
2.8 malloc133
2.8.1 brk實現134
2.8.2 VM_LOCK情況138
2.8.3 小結148
2.9 mmap150
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_Locked192
2.11.4 小結192
2.12 反向映射RMAP192
2.12.1 父進程分配匿名頁面193
2.12.2 父進程創建子進程198
2.12.3 子進程發生COW200
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 KSM273
2.17.1 KSM實現274
2.17.2 匿名頁面和KSM頁面的區別293
2.17.3 小結294
2.18 Dirty COW內存漏洞296
2.19 總結內存管理數據結構和API309
2.19.1 內存管理數據結構的關系圖309
2.19.2 內存管理中常用API312
2.20 最新更新和展望315
2.20.1 頁面回收策略從zone遷移到node315
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 fork325
3.1.3 小結344
3.2 CFS調度器345
3.2.1 權重計算346
3.2.2 進程創建358
3.2.3 進程調度369
3.2.4 scheduler tick379
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 spinlock508
4.2.1 spinlock實現509
4.2.2 spinlock變種511
4.2.3 spinlock和raw_spin_lock512
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 RCU544
4.6.1 經典RCU和Tree RCU547
4.6.2 Tree RCU設計551
4.6.3 小結573
4.7 內存管理中的鎖574
4.8 最新更新與展望584
4.8.1 Queued Spinlock584
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 軟中斷和tasklet637
5.2.1 SoftIRQ軟中斷638
5.2.2 tasklet642
5.2.3 local_bh_disable local_bh_enable647
5.2.4 小結649
5.3 workqueue工作隊列650
5.3.1 初始化工作隊列652
5.3.2 創建工作隊列659
5.3.3 調度一個work665
5.3.4 取消一個work675
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 ftrace694
6.2.1 irqs跟蹤器695
6.2.2 preemptoff跟蹤器696
6.2.3 preemptirqsoff跟蹤器697
6.2.4 function跟蹤器698
6.2.5 動態ftrace699
6.2.6 事件跟蹤700
6.2.7 添加tracepoint702
6.2.8 trace-cmd和kernelshark705
6.2.9 trace marker707
6.2.10 小結709
6.3 SystemTap710
6.4 內存檢測714
6.4.1 slub_debug714
6.4.2 內存泄漏檢測kmemleak718
6.4.3 kasan內存檢測720
6.5 死鎖檢測722
6.6 內核調試秘籍728
6.6.1 printk728
6.6.2 動態打印730
6.6.3 RAM Console731
6.6.4 OOPS分析731
6.6.5 BUG_ON()和WARN_ON()734