本書基于4.x版本的Linux內(nèi)核,介紹了Linux內(nèi)核的若干關(guān)鍵子系統(tǒng)的技術(shù)原理。本書主要內(nèi)容包括內(nèi)核的引導(dǎo)過程、內(nèi)核管理和調(diào)度進(jìn)程的技術(shù)原理、內(nèi)核管理虛擬內(nèi)存和物理內(nèi)存的技術(shù)原理、內(nèi)核處理異常和中斷的技術(shù)原理,以及系統(tǒng)調(diào)用的實(shí)現(xiàn)方式等。此外,本書還詳細(xì)講解了內(nèi)核實(shí)現(xiàn)的各種保護(hù)臨界區(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)、進(jìn)程管理、內(nèi)存管理、異常處理、互斥技術(shù)和文件系統(tǒng)等關(guān)鍵子系統(tǒng)的實(shí)現(xiàn)。
3.內(nèi)核引導(dǎo)部分詳解從處理器上電到用戶空間的進(jìn)程產(chǎn)生的整個(gè)過程,并介紹多處理器系統(tǒng)的啟動(dòng)過程。
4.結(jié)合源代碼分析,詳細(xì)解讀每種技術(shù)的使用方法及其原理。
5.通過圖例幫助讀者理解各種數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系。
6.通過執(zhí)行流程圖幫助讀者理解函數(shù)的執(zhí)行過程。
7.對同類技術(shù)進(jìn)行歸納總結(jié)和對比分析,例如3種塊分配器、巨型頁的兩種實(shí)現(xiàn)、解決內(nèi)存碎片問題的各種技術(shù)、3種中斷下半部和3種RCU技術(shù),等等。
余華兵,2005年畢業(yè)于華中科技大學(xué)計(jì)算機(jī)學(xué)院,取得碩士學(xué)位。畢業(yè)后的十余年一直在網(wǎng)絡(luò)通信行業(yè)從事軟件設(shè)計(jì)和開發(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 標(biāo)號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進(jìn)程 15
第 2章 進(jìn)程管理 17
2.1 進(jìn)程 17
2.2 命名空間 18
2.3 進(jìn)程標(biāo)識符 20
2.4 進(jìn)程關(guān)系 21
2.5 啟動(dòng)程序 23
2.5.1 創(chuàng)建新進(jìn)程 23
2.5.2 裝載程序 41
2.6 進(jìn)程退出 48
2.6.1 線程組退出 49
2.6.2 終止進(jìn)程 51
2.6.3 查詢子進(jìn)程終止原因 53
2.7 進(jìn)程狀態(tài) 55
2.8 進(jìn)程調(diào)度 55
2.8.1 調(diào)度策略 55
2.8.2 進(jìn)程優(yōu)先級 56
2.8.3 調(diào)度類 57
2.8.4 運(yùn)行隊(duì)列 59
2.8.5 任務(wù)分組 60
2.8.6 調(diào)度進(jìn)程 65
2.8.7 調(diào)度時(shí)機(jī) 75
2.8.8 帶寬管理 85
2.9 SMP調(diào)度 93
2.9.1 進(jìn)程的處理器親和性 93
2.9.2 對調(diào)度器的擴(kuò)展 96
2.9.3 限期調(diào)度類的處理器負(fù)載均衡 96
2.9.4 實(shí)時(shí)調(diào)度類的處理器負(fù)載均衡 98
2.9.5 公平調(diào)度類的處理器負(fù)載均衡 99
2.9.6 遷移線程 108
2.9.7 隔離處理器 110
2.10 進(jìn)程的安全上下文 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ù)可移動(dòng)性分組 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表項(xiàng)格式 226
3.12.2 TLB管理 226
3.12.3 地址空間標(biāo)識符 228
3.12.4 虛擬機(jī)標(biāo)識符 232
3.13 巨型頁 233
3.13.1 處理器對巨型頁的支持 233
3.13.2 標(biāo)準(zhǔn)巨型頁 235
3.13.3 透明巨型頁 245
3.14 頁錯(cuò)誤異常處理 257
3.14.1 處理器架構(gòu)特定部分 257
3.14.2 用戶空間頁錯(cuò)誤異!266
3.14.3 內(nèi)核模式頁錯(cuò)誤異!283
3.15 反碎片技術(shù) 288
3.15.1 虛擬可移動(dòng)區(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 計(jì)算掃描的頁數(shù) 320
3.16.4 收縮活動(dòng)頁鏈表 321
3.16.5 回收不活動(dòng)頁 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 緩存維護(hù) 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)存錯(cuò)誤檢測工具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ū)動(dòng)初始化 415
4.2.4 Linux中斷處理 422
4.2.5 中斷線程化 428
4.2.6 禁止/開啟中斷 430
4.2.7 禁止/開啟單個(gè)中斷 431
4.2.8 中斷親和性 431
4.2.9 處理器間中斷 432
4.3 中斷下半部 434
4.3.1 軟中斷 435
4.3.2 小任務(wù) 441
4.3.3 工作隊(duì)列 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 實(shí)時(shí)互斥鎖 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 進(jìn)程和軟中斷互斥 483
5.11 進(jìn)程和硬中斷互斥 483
5.12 每處理器變量 484
5.12.1 靜態(tài)每處理器變量 484
5.12.2 動(dòng)態(tài)每處理器變量 484
5.12.3 訪問每處理器變量 485
5.13 每處理器計(jì)數(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é)點(diǎn) 556
6.2.5 目錄項(xiàng) 559
6.2.6 文件的打開實(shí)例和打開文件表 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