求真百科歡迎當事人提供第一手真實資料,洗刷冤屈,終結網路霸凌。

深入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

參考文獻

  1. 我國出版社的等級劃分和分類標準,知網出書,2021-03-01
  2. 人民郵電出版社簡介,人民郵電出版社