深入Linux內核架構檢視原始碼討論檢視歷史
《深入Linux內核架構》,[德] Wolfgang Mauerer 著,郭旭 譯,出版社: 人民郵電出版社。
人民郵電出版社,1953年10月成立,隸屬於中國工信出版傳媒集團,是工業和信息化部主管的大型專業出版社[1]。建社以來,人民郵電出版社圍繞「立足工信事業,面向現代社會,傳播科學知識,引領美好生活」的出版宗旨,已發展成為集圖書、期刊、音像電子及數字出版於一體的綜合性出版大社[2]。
內容簡介
本書討論了Linux內核的概念、結構和實現。主要內容包括多任務、調度和進程管理,物理內存的管理以及內核與相關硬件的交互,用戶空間的進程如何訪問虛擬內存,如何編寫設備驅動程序,模塊機制以及虛擬文件系統,Ext文件系統屬性和訪問控制表的實現方式,內核中網絡的實現,系統調用的實現方式,內核對時間相關功能的處理,頁面回收和頁交換的相關機制以及審計的實現等。此外,本書藉助內核源代碼中**關鍵的部分進行講解,幫助讀者掌握重要的知識點,從而在運用中充分展現Linux系統的魅力。
本書適合Linux內核愛好者閱讀。
目錄
第 1章 簡介和概述 1
1.1 內核的任務 2
1.2 實現策略 2
1.3 內核的組成部分 3
1.3.1 進程、進程切換、調度 3
1.3.2 UNIX進程 4
1.3.3 地址空間與特權級別 6
1.3.4 頁表 9
1.3.5 物理內存的分配 11
1.3.6 計時 13
1.3.7 系統調用 13
1.3.8 設備驅動程序、塊設備和字符設備 14
1.3.9 網絡 14
1.3.10 文件系統 14
1.3.11 模塊和熱插拔 15
1.3.12 緩存 16
1.3.13 鍊表處理 16
1.3.14 對象管理和引用計數 17
1.3.15 數據類型 20
1.3.16 本書的局限性 22
1.4 為什麼內核是特別的 23
1.5 行文註記 23
1.6 小結 27
第 2章 進程管理和調度 28
2.1 進程優先級 28
2.2 進程生命周期 30
2.3 進程表示 32
2.3.1 進程類型 37
2.3.2 命名空間 37
2.3.3 進程ID號 43
2.3.4 進程關係 49
2.4 進程管理相關的系統調用 50
2.4.1 進程複製 50
2.4.2 內核線程 62
2.4.3 啟動新程序 63
2.4.4 退出進程 66
2.5 調度器的實現 67
2.5.1 概觀 67
2.5.2 數據結構 69
2.5.3 處理優先級 74
2.5.4 核心調度器 79
2.6 完全公平調度類 84
2.6.1 數據結構 85
2.6.2 CFS操作 85
2.6.3 隊列操作 89
2.6.4 選擇下一個進程 91
2.6.5 處理周期性調度器 92
2.6.6 喚醒搶占 93
2.6.7 處理新進程 93
2.7 實時調度類 94
2.7.1 性質 94
2.7.2 數據結構 95
2.7.3 調度器操作 96
2.8 調度器增強 97
2.8.1 SMP調度 97
2.8.2 調度域和控制組 101
2.8.3 內核搶占和低延遲相關工作 102
2.9 小結 106
第3章 內存管理 107
3.1 概述 107
3.2 (N)UMA模型中的內存組織 109
3.2.1 概述 109
3.2.2 數據結構 111
3.3 頁表 123
3.3.1 數據結構 124
3.3.2 頁表項的創建和操作 129
3.4 初始化內存管理 129
3.4.1 建立數據結構 130
3.4.2 特定於體系結構的設置 135
3.4.3 啟動過程期間的內存管理 153
3.5 物理內存的管理 159
3.5.1 夥伴系統的結構 159
3.5.2 避免碎片 161
3.5.3 初始化內存域和結點數據結構 167
3.5.4 分配器API 172
3.5.5 分配頁 177
3.5.6 釋放頁 192
3.5.7 內核中不連續頁的分配 195
3.5.8 內核映射 201
3.6 slab分配器 205
3.6.1 備選分配器 206
3.6.2 內核中的內存管理 207
3.6.3 slab分配的原理 209
3.6.4 實現 212
3.6.5 通用緩存 226
3.7 處理器高速緩存和TLB控制 228
3.8 小結 230
第4章 進程虛擬內存 231
4.1 簡介 231
4.2 進程虛擬地址空間 231
4.2.1 進程地址空間的布局 232
4.2.2 建立布局 234
4.3 內存映射的原理 237
4.4 數據結構 238
4.4.1 樹和鍊表 238
4.4.2 虛擬內存區域的表示 239
4.4.3 優先查找樹 241
4.5 對區域的操作 244
4.5.1 將虛擬地址關聯到區域 245
4.5.2 區域合併 246
4.5.3 插入區域 247
4.5.4 創建區域 248
4.6 地址空間 250
4.7 內存映射 251
4.7.1 創建映射 251
4.7.2 刪除映射 253
4.7.3 非線性映射 254
4.8 反向映射 257
4.8.1 數據結構 258
4.8.2 建立逆向映射 259
4.8.3 使用逆向映射 259
4.9 堆的管理 261
4.10 缺頁異常的處理 263
4.11 用戶空間缺頁異常的校正 268
4.11.1 按需分配 調頁 269
4.11.2 匿名頁 271
4.11.3 寫時複製 271
4.11.4 獲取非線性映射 272
4.12 內核缺頁異常 272
4.13 在內核和用戶空間之間複製數據 274
4.14 小結 276
第5章 鎖與進程間通信 277
5.1 控制機制 277
5.1.1 競態條件 277
5.1.2 臨界區 278
5.2 內核鎖機制 279
5.2.1 對整數的原子操作 280
5.2.2 自旋鎖 282
5.2.3 信號量 283
5.2.4 RCU機制 284
5.2.5 內存和優化屏障 286
5.2.6 讀者 寫者鎖 287
5.2.7 大內核鎖 288
5.2.8 互斥量 288
5.2.9 近似的per-CPU計數器 290
5.2.10 鎖競爭與細粒度鎖 291
5.3 System V進程間通信 292
5.3.1 System V機制 292
5.3.2 信號量 292
5.3.3 消息隊列 300
5.3.4 共享內存 303
5.4 其他IPC機制 303
5.4.1 信號 303
5.4.2 管道和套接字 310
5.5 小結 311
第6章 設備驅動程序 312
6.1 I O體系結構 312
6.2 訪問設備 316
6.2.1 設備文件 316
6.2.2 字符設備、塊設備和其他設備 317
6.2.3 使用ioctl進行設備尋址 319
6.2.4 主從設備號的表示 320
6.2.5 註冊 321
6.3 與文件系統關聯 324
6.3.1 inode中的設備文件成員 324
6.3.2 標準文件操作 325
6.3.3 用於字符設備的標準操作 325
6.3.4 用於塊設備的標準操作 325
6.4 字符設備操作 326
6.4.1 表示字符設備 326
6.4.2 打開設備文件 326
6.4.3 讀寫操作 328
6.5 塊設備操作 329
6.5.1 塊設備的表示 330
6.5.2 數據結構 331
6.5.3 向系統添加磁盤和分區 338
6.5.4 打開塊設備文件 339
6.5.5 請求結構 341
6.5.6 BIO 343
6.5.7 提交請求 345
6.5.8 I O調度 350
6.5.9 ioctl的實現 352
6.6 資源分配 353
6.6.1 資源管理 353
6.6.2 I O內存 355
6.6.3 I O端口 357
6.7 總線系統 358
6.7.1 通用驅動程序模型 358
6.7.2 PCI總線 363
6.7.3 USB 370
6.8 小結 376
第7章 模塊 377
7.1 概述 377
7.2 使用模塊 378
7.2.1 添加和移除 378
7.2.2 依賴關係 380
7.2.3 查詢模塊信息 381
7.2.4 自動加載 382
7.3 插入和刪除模塊 384
7.3.1 模塊的表示 385
7.3.2 依賴關係和引用 389
7.3.3 模塊的二進制結構 391
7.3.4 插入模塊 396
7.3.5 移除模塊 403
7.4 自動化與熱插拔 404
7.4.1 kmod實現的自動加載 404
7.4.2 熱插拔 405
7.5 版本控制 408
7.5.1 校驗和方法 408
7.5.2 版本控制函數 411
7.6 小結 412
第8章 虛擬文件系統 413
8.1 文件系統類型 413
8.2 通用文件模型 414
8.2.1 inode 415
8.2.2 鏈接 416
8.2.3 編程接口 416
8.2.4 將文件作為通用接口 417
8.3 VFS的結構 417
8.3.1 結構概觀 418
8.3.2 inode 419
8.3.3 特定於進程的信息 423
8.3.4 文件操作 427
8.3.5 目錄項緩存 431
8.4 處理VFS對象 436
8.4.1 文件系統操作 436
8.4.2 文件操作 450
8.5 標準函數 456
8.5.1 通用讀取例程 457
8.5.2 失效機制 459
8.5.3 權限檢查 461
8.6 小結 463
第9章 Ext文件系統族 464
9.1 簡介 464
9.2 Ext2文件系統 465
9.2.1 物理結構 465
9.2.2 數據結構 470
9.2.3 創建文件系統 484
9.2.4 文件系統操作 485
9.3 Ext3文件系統 507
9.3.1 概念 508
9.3.2 數據結構 509
9.4 小結 511
第 10章 無持久存儲的文件系統 512
10.1 proc文件系統 512
10.1.1 proc的內容 513
10.1.2 數據結構 519
10.1.3 初始化 522
10.1.4 裝載proc文件系統 523
10.1.5 管理 proc數據項 525
10.1.6 讀取和寫入信息 528
10.1.7 進程相關的信息 530
10.1.8 系統控制機制 535
10.2 簡單的文件系統 542
10.2.1 順序文件 542
10.2.2 用libfs編寫文件系統 546
10.2.3 調試文件系統 547
10.2.4 偽文件系統 549
10.3 sysfs 549
10.3.1 概述 550
10.3.2 數據結構 550
10.3.3 裝載文件系統 554
10.3.4 文件和目錄操作 556
10.3.5 向sysfs添加內容 562
10.4 小結 564
第 11章 擴展屬性和訪問控制表 565
11.1 擴展屬性 565
11.1.1 到虛擬文件系統的接口 566
11.1.2 Ext3中的實現 570
11.1.3 Ext2中的實現 576
11.2 訪問控制表 577
11.2.1 通用實現 577
11.2.2 Ext3中的實現 580
11.2.3 Ext2中的實現 585
11.3 小結 585
第 12章 網絡 586
12.1 互聯的計算機 586
12.2 ISO OSI和TCP IP參考模型 587
12.3 通過套接字通信 589
12.3.1 創建套接字 590
12.3.2 使用套接字 591
12.3.3 數據報套接字 595
12.4 網絡實現的分層模型 595
12.5 網絡命名空間 597
12.6 套接字緩衝區 599
12.6.1 使用套接字緩衝區管理數據 600
12.6.2 管理套接字緩衝區數據 602
12.7 網絡訪問層 603
12.7.1 網絡設備的表示 603
12.7.2 接收分組 608
12.7.3 發送分組 614
12.8 網絡層 615
12.8.1 IPv4 615
12.8.2 接收分組 617
12.8.3 交付到本地傳輸層 618
12.8.4 分組轉發 619
12.8.5 發送分組 620
12.8.6 netfilter 623
12.8.7 IPv6 627
12.9 傳輸層 628
12.9.1 UDP 628
12.9.2 TCP 630
12.10 應用層 640
12.10.1 socket數據結構 640
12.10.2 套接字和文件 643
12.10.3 socketcall系統調用 644
12.10.4 創建套接字 645
12.10.5 接收數據 646
12.10.6 發送數據 647
12.11 內核內部的網絡通信 647
12.11.1 通信函數 648
12.11.2 netlink機制 649
12.12 小結 654
第 13章 系統調用 655
13.1 系統程序設計基礎 655
13.1.1 追蹤系統調用 656
13.1.2 支持的標準 658
13.1.3 重啟系統調用 659
13.2 可用的系統調用 660
13.3 系統調用的實現 663
13.3.1 系統調用的結構 664
13.3.2 訪問用戶空間 670
13.3.3 追蹤系統調用 670
13.4 小結 676
第 14章 內核活動 678
14.1 中斷 678
14.1.1 中斷類型 678
14.1.2 硬件IRQ 680
14.1.3 處理中斷 680
14.1.4 數據結構 682
14.1.5 中斷電流處理 688
14.1.6 初始化和分配IRQ 692
14.1.7 處理IRQ 693
14.2 軟中斷 701
14.2.1 開啟軟中斷處理 702
14.2.2 軟中斷守護進程 703
14.3 tasklet 704
14.3.1 創建tasklet 704
14.3.2 註冊tasklet 704
14.3.3 執行tasklet 705
14.4 等待隊列和完成量 706
14.4.1 等待隊列 706
14.4.2 完成量 710
14.4.3 工作隊列 711
14.5 小結 713
第 15章 時間管理 714
15.1 概述 714
15.1.1 定時器的類型 714
15.1.2 配置選項 716
15.2 低分辨率定時器的實現 717
15.2.1 定時器激活與進程統計 717
15.2.2 處理jiffies 719
15.2.3 數據結構 720
15.2.4 動態定時器 721
15.3 通用時間子系統 725
15.3.1 概述 726
15.3.2 配置選項 727
15.3.3 時間表示 727
15.3.4 用於時間管理的對象 728
15.4 高分辨率定時器 736
15.4.1 數據結構 736
15.4.2 設置定時器 740
15.4.3 實現 740
15.4.4 周期時鐘仿真 745
15.4.5 切換到高分辨率定時器 746
15.5 動態時鐘 747
15.5.1 數據結構 747
15.5.2 低分辨率系統下的動態時鐘 749
15.5.3 高分辨率系統下的動態時鐘 751
15.5.4 停止和啟動周期時鐘 752
15.6 廣播模式 755
15.7 定時器相關系統調用的實現 756
15.7.1 時間基準 756
15.7.2 alarm和setitimer系統調用 757
15.7.3 獲取當前時間 758
15.8 管理進程時間 759
15.9 小結 760
第 16章 頁緩存和塊緩存 761
16.1 頁緩存的結構 762
16.1.1 管理和查找緩存的頁 762
16.1.2 回寫修改的數據 763
16.2 塊緩存的結構 764
16.3 地址空間 766
16.3.1 數據結構 766
16.3.2 頁樹 768
16.3.3 地址空間操作 771
16.4 頁緩存的實現 774
16.4.1 分配頁 774
16.4.2 查找頁 775
16.4.3 在頁上等待 776
16.4.4 對整頁的操作 777
16.4.5 頁緩存預讀 778
16.5 塊緩存的實現 781
16.5.1 數據結構 782
16.5.2 操作 783
16.5.3 頁緩存和塊緩存的交互 783
16.5.4 獨立的緩衝區 787
16.6 小結 792
第 17章 數據同步 793
17.1 概述 793
17.2 pdflush機制 795
17.3 啟動新線程 796
17.4 線程初始化 796
17.5 執行實際工作 798
17.6 周期性刷出 798
17.7 相關的數據結構 799
17.7.1 頁狀態 799
17.7.2 回寫控制 800
17.7.3 可調參數 802
17.8 中央控制 802
17.9 超級塊同步 804
17.10 inode同步 804
17.10.1 遍歷超級塊 805
17.10.2 考察超級塊inode 805
17.10.3 回寫單個inode 807
17.11 擁塞 809
17.11.1 數據結構 809
17.11.2 閾值 810
17.11.3 擁塞狀態的設置和清除 811
17.11.4 在擁塞隊列上等待 812
17.12 強制回寫 813
17.13 膝上模式 814
17.14 用於同步控制的系統調用 815
17.15 完全同步 815
17.15.1 inode的同步 816
17.15.2 單個文件的同步 818
17.15.3 內存映射的同步 819
17.16 小結 820
第 18章 頁面回收和頁交換 821
18.1 概述 821
18.1.1 可換出頁 822
18.1.2 頁顛簸 822
18.1.3 頁交換算法 823
18.2 Linux內核中的頁面回收和頁交換 824
18.2.1 交換區的組織 824
18.2.2 檢查內存使用情況 825
18.2.3 選擇要換出的頁 825
18.2.4 處理缺頁異常 826
18.2.5 縮減內核緩存 826
18.3 管理交換區 826
18.3.1 數據結構 827
18.3.2 創建交換區 830
18.3.3 激活交換區 831
18.4 交換緩存 834
18.4.1 標識換出頁 835
18.4.2 交換緩存的結構 838
18.4.3 添加新頁 839
18.4.4 搜索一頁 843
18.5 數據回寫 844
18.6 頁面回收 845
18.6.1 概述 845
18.6.2 數據結構 847
18.6.3 確定頁的活動程度 850
18.6.4 收縮內存域 853
18.6.5 隔離LRU頁和集中回收 856
18.6.6 收縮活動頁鍊表 859
18.6.7 回收不活動頁 862
18.7 交換令牌 867
18.8 處理交換缺頁異常 870
18.8.1 換入頁 870
18.8.2 讀取數據 872
18.8.3 交換預讀 873
18.9 發起內存回收 873
18.9.1 用kswapd進行周期性內存回收 873
18.9.2 在嚴重內存不足時換出頁 877
18.10 收縮其他緩存 878
18.10.1 數據結構 878
18.10.2 註冊和刪除收縮器 879
18.10.3 收縮緩存 879
18.11 小結 880
第 19章 審計 882
19.1 概述 882
19.2 審計規則 883
19.3 實現 884
19.3.1 數據結構 884
19.3.2 初始化 889
19.3.3 處理請求 890
19.3.4 記錄事件 891
19.3.5 系統調用審計 893
19.4 小結 898
附錄A 體系結構相關知識 899
A.1 概述 899
A.2 數據類型 900
A.3 對齊 900
A.4 內存頁面 900
A.5 系統調用 901
A.6 字符串處理 901
A.7 線程表示 902
A.8 位操作和字節序 914
A.9 頁表 916
A.10 雜項 916
A.11 小結 918
附錄B 使用源代碼 919
B.1 內核源代碼的組織 919
B.2 用Kconfig進行配置 920
B.3 用Kbuild編譯內核 930
B.4 有用的工具 935
B.5 調試和分析內核 942
B.6 用戶模式Linux 945
B.7 小結 946
附錄C 有關C語言的註記 947
C.1 GNU C編譯器如何工作 947
C.2 內核的標準數據結構和技術 967
C.3 小結 984
附錄D 系統啟動 985
D.1 IA-32系統上與體系結構相關的設置 985
D.2 高層初始化 986
D.3 小結 998
附錄E ELF二進制格式 999
E.1 布局和結構 999
E.2 內核中的數據結構 1006
E.3 小結 1018
附錄F 內核開發過程 1019
F.1 簡介 1019
F.2 內核代碼樹和開發的結構 1019
F.3 補丁的結構 1024
F.4 Linux和學術界 1030
F.5 小結 1035
參考文獻 1036
參考文獻
- ↑ 我國出版社的等級劃分和分類標準,知網出書,2021-03-01
- ↑ 人民郵電出版社簡介,人民郵電出版社