本書基于4.x版本的Linux內(nèi)核,介紹了Linux內(nèi)核的若干關(guān)鍵子系統(tǒng)的技術(shù)原理。本書主要內(nèi)容包括內(nèi)核的引導(dǎo)過程、內(nèi)核管理和調(diào)度進程的技術(shù)原理、內(nèi)核管理虛擬內(nèi)存和物理內(nèi)存的技術(shù)原理、內(nèi)核處理異常和中斷的技術(shù)原理,以及系統(tǒng)調(diào)用的實現(xiàn)方式等。此外,本書還詳細講解了內(nèi)核實現(xiàn)的各種保護臨界區(qū)的互斥技術(shù),以及內(nèi)核的文件系統(tǒng)。本書內(nèi)容豐富,深入淺出,通過大量的圖例來描述數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系和函數(shù)的執(zhí)行流程,并結(jié)合代碼分析,引導(dǎo)讀者閱讀和理解內(nèi)核源代碼。
1.基于ARM64架構(gòu)的Linux 4.x內(nèi)核
2.全面介紹內(nèi)核引導(dǎo)、進程管理、內(nèi)存管理、異常處理、互斥技術(shù)和文件系統(tǒng)等關(guān)鍵子系統(tǒng)的實現(xiàn)。
3.內(nèi)核引導(dǎo)部分詳解從處理器上電到用戶空間的進程產(chǎn)生的整個過程,并介紹多處理器系統(tǒng)的啟動過程。
4.結(jié)合源代碼分析,詳細解讀每種技術(shù)的使用方法及其原理。
5.通過圖例幫助讀者理解各種數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系。
6.通過執(zhí)行流程圖幫助讀者理解函數(shù)的執(zhí)行過程。
7.對同類技術(shù)進行歸納總結(jié)和對比分析,例如3種塊分配器、巨型頁的兩種實現(xiàn)、解決內(nèi)存碎片問題的各種技術(shù)、3種中斷下半部和3種RCU技術(shù),等等。
余華兵,2005年畢業(yè)于華中科技大學(xué)計算機學(xué)院,取得碩士學(xué)位。畢業(yè)后的十余年一直在網(wǎng)絡(luò)通信行業(yè)從事軟件設(shè)計和開發(fā)工作,研究方向包括IPv4協(xié)議棧、IPv6協(xié)議棧和Linux內(nèi)核。
目 錄
第 1章 內(nèi)核引導(dǎo)和初始化 1
1.1 到哪里讀取引導(dǎo)程序 1
1.2 引導(dǎo)程序 1
1.2.1 入口_start 1
1.2.2 標號reset 2
1.2.3 函數(shù)_main 4
1.2.4 函數(shù)run_main_loop 6
1.3 內(nèi)核初始化 8
1.3.1 匯編語言部分 8
1.3.2 C語言部分 11
1.3.3 SMP系統(tǒng)的引導(dǎo) 12
1.4 init進程 15
第 2章 進程管理 17
2.1 進程 17
2.2 命名空間 18
2.3 進程標識符 20
2.4 進程關(guān)系 21
2.5 啟動程序 23
2.5.1 創(chuàng)建新進程 23
2.5.2 裝載程序 41
2.6 進程退出 48
2.6.1 線程組退出 49
2.6.2 終止進程 51
2.6.3 查詢子進程終止原因 53
2.7 進程狀態(tài) 55
2.8 進程調(diào)度 55
2.8.1 調(diào)度策略 55
2.8.2 進程優(yōu)先級 56
2.8.3 調(diào)度類 57
2.8.4 運行隊列 59
2.8.5 任務(wù)分組 60
2.8.6 調(diào)度進程 65
2.8.7 調(diào)度時機 75
2.8.8 帶寬管理 85
2.9 SMP調(diào)度 93
2.9.1 進程的處理器親和性 93
2.9.2 對調(diào)度器的擴展 96
2.9.3 限期調(diào)度類的處理器負載均衡 96
2.9.4 實時調(diào)度類的處理器負載均衡 98
2.9.5 公平調(diào)度類的處理器負載均衡 99
2.9.6 遷移線程 108
2.9.7 隔離處理器 110
2.10 進程的安全上下文 111
第3章 內(nèi)存管理 113
3.1 概述 113
3.2 虛擬地址空間布局 115
3.2.1 虛擬地址空間劃分 115
3.2.2 用戶虛擬地址空間布局 115
3.2.3 內(nèi)核地址空間布局 121
3.3 物理地址空間 122
3.4 內(nèi)存映射 124
3.4.1 應(yīng)用編程接口 125
3.4.2 數(shù)據(jù)結(jié)構(gòu) 129
3.4.3 創(chuàng)建內(nèi)存映射 133
3.4.4 虛擬內(nèi)存過量提交策略 137
3.4.5 刪除內(nèi)存映射 139
3.5 物理內(nèi)存組織 140
3.5.1 體系結(jié)構(gòu) 140
3.5.2 內(nèi)存模型 140
3.5.3 三級結(jié)構(gòu) 141
3.6 引導(dǎo)內(nèi)存分配器 144
3.6.1 bootmem分配器 144
3.6.2 memblock分配器 145
3.6.3 物理內(nèi)存信息 148
3.7 伙伴分配器 151
3.7.1 基本的伙伴分配器 151
3.7.2 分區(qū)的伙伴分配器 152
3.7.3 根據(jù)可移動性分組 158
3.7.4 每處理器頁集合 162
3.7.5 分配頁 163
3.7.6 釋放頁 181
3.8 塊分配器 184
3.8.1 編程接口 185
3.8.2 SLAB分配器 186
3.8.3 SLUB分配器 197
3.8.4 SLOB分配器 204
3.9 不連續(xù)頁分配器 207
3.9.1 編程接口 207
3.9.2 數(shù)據(jù)結(jié)構(gòu) 208
3.9.3 技術(shù)原理 209
3.10 每處理器內(nèi)存分配器 210
3.10.1 編程接口 210
3.10.2 技術(shù)原理 212
3.11 頁表 219
3.11.1 統(tǒng)一的頁表框架 219
3.11.2 ARM64處理器的頁表 222
3.12 頁表緩存 226
3.12.1 TLB表項格式 226
3.12.2 TLB管理 226
3.12.3 地址空間標識符 228
3.12.4 虛擬機標識符 232
3.13 巨型頁 233
3.13.1 處理器對巨型頁的支持 233
3.13.2 標準巨型頁 235
3.13.3 透明巨型頁 245
3.14 頁錯誤異常處理 257
3.14.1 處理器架構(gòu)特定部分 257
3.14.2 用戶空間頁錯誤異常 266
3.14.3 內(nèi)核模式頁錯誤異!283
3.15 反碎片技術(shù) 288
3.15.1 虛擬可移動區(qū)域 289
3.15.2 內(nèi)存碎片整理 291
3.16 頁回收 309
3.16.1 數(shù)據(jù)結(jié)構(gòu) 310
3.16.2 發(fā)起頁回收 317
3.16.3 計算掃描的頁數(shù) 320
3.16.4 收縮活動頁鏈表 321
3.16.5 回收不活動頁 323
3.16.6 頁交換 325
3.16.7 回收slab緩存 335
3.17 內(nèi)存耗盡殺手 338
3.17.1 使用方法 338
3.17.2 技術(shù)原理 338
3.18 內(nèi)存資源控制器 340
3.18.1 使用方法 340
3.18.2 技術(shù)原理 344
3.19 處理器緩存 370
3.19.1 緩存結(jié)構(gòu) 370
3.19.2 緩存策略 372
3.19.3 緩存維護 374
3.19.4 SMP緩存一致性 378
3.19.5 利用緩存提高性能的編程技巧 383
3.20 連續(xù)內(nèi)存分配器 384
3.20.1 使用方法 385
3.20.2 技術(shù)原理 386
3.21 userfaultfd 391
3.21.1 使用方法 391
3.21.2 技術(shù)原理 395
3.22 內(nèi)存錯誤檢測工具KASAN 401
3.22.1 使用方法 401
3.22.2 技術(shù)原理 402
第4章 中斷、異常和系統(tǒng)調(diào)用 403
4.1 ARM64異常處理 403
4.1.1 異常級別 403
4.1.2 異常分類 404
4.1.3 異常向量表 405
4.1.4 異常處理 407
4.2 中斷 411
4.2.1 中斷控制器 412
4.2.2 中斷域 413
4.2.3 中斷控制器驅(qū)動初始化 415
4.2.4 Linux中斷處理 422
4.2.5 中斷線程化 428
4.2.6 禁止/開啟中斷 430
4.2.7 禁止/開啟單個中斷 431
4.2.8 中斷親和性 431
4.2.9 處理器間中斷 432
4.3 中斷下半部 434
4.3.1 軟中斷 435
4.3.2 小任務(wù) 441
4.3.3 工作隊列 444
4.4 系統(tǒng)調(diào)用 457
4.4.1 定義系統(tǒng)調(diào)用 457
4.4.2 執(zhí)行系統(tǒng)調(diào)用 459
第5章 內(nèi)核互斥技術(shù) 463
5.1 信號量 464
5.2 讀寫信號量 465
5.3 互斥鎖 466
5.4 實時互斥鎖 467
5.5 原子變量 468
5.6 自旋鎖 472
5.7 讀寫自旋鎖 476
5.8 順序鎖 478
5.8.1 完整版的順序鎖 479
5.8.2 只提供序列號的順序鎖 481
5.9 禁止內(nèi)核搶占 482
5.10 進程和軟中斷互斥 483
5.11 進程和硬中斷互斥 483
5.12 每處理器變量 484
5.12.1 靜態(tài)每處理器變量 484
5.12.2 動態(tài)每處理器變量 484
5.12.3 訪問每處理器變量 485
5.13 每處理器計數(shù)器 485
5.14 內(nèi)存屏障 487
5.14.1 編譯器屏障 488
5.14.2 處理器內(nèi)存屏障 489
5.14.3 MMIO寫屏障 492
5.14.4 隱含內(nèi)存屏障 493
5.14.5 ARM64處理器內(nèi)存屏障 493
5.15 RCU 495
5.15.1 使用方法 496
5.15.2 技術(shù)原理 504
5.16 可睡眠RCU 533
5.16.1 使用方法 533
5.16.2 技術(shù)原理 534
5.17 死鎖檢測工具lockdep 542
5.17.1 使用方法 543
5.17.2 技術(shù)原理 543
第6章 文件系統(tǒng) 548
6.1 概述 548
6.1.1 用戶空間層面 549
6.1.2 硬件層面 549
6.1.3 內(nèi)核空間層面 550
6.2 虛擬文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu) 552
6.2.1 超級塊 552
6.2.2 掛載描述符 554
6.2.3 文件系統(tǒng)類型 555
6.2.4 索引節(jié)點 556
6.2.5 目錄項 559
6.2.6 文件的打開實例和打開文件表 561
6.3 注冊文件系統(tǒng)類型 563
6.4 掛載文件系統(tǒng) 564
6.4.1 系統(tǒng)調(diào)用mount 566
6.4.2 綁定掛載 567
6.4.3 掛載命名空間 568
6.4.4 掛載根文件系統(tǒng) 574
6.5 打開文件 580
6.5.1 編程接口 580
6.5.2 技術(shù)原理 582
6.6 關(guān)閉文件 591
6.7 創(chuàng)建文件 593
6.7.1 使用方法 593
6.7.2 技術(shù)原理 594
6.8 刪除文件 595
6.8.1 使用方法 595
6.8.2 技術(shù)原理 595
6.9 設(shè)置文件權(quán)限 597
6.9.1 使用方法 597
6.9.2 技術(shù)原理 598
6.10 頁緩存 599
6.10.1 地址空間 600
6.10.2 基數(shù)樹 601
6.10.3 編程接口 602
6.11 讀文件 602
6.11.1 編程接口 602
6.11.2 技術(shù)原理 603
6.12 寫文件 606
6.12.1 編程接口 606
6.12.2 技術(shù)原理 607
6.13 文件回寫 610
6.13.1 編程接口 610
6.13.2 技術(shù)原理 610
6.14 DAX 618
6.14.1 使用方法 618
6.14.2 技術(shù)原理 618
6.15 常用的文件系統(tǒng)類型 621
結(jié)束語 622