定 價(jià):149 元
叢書名:圖靈程序設(shè)計(jì)叢書·Linux/UNIX系列
- 作者:(德),莫爾勒 著 郭旭 譯
- 出版時(shí)間:2010/6/1
- ISBN:9787115227430
- 出 版 社:人民郵電出版社
- 中圖法分類:TP316.81
- 頁(yè)碼:1038
- 紙張:膠版紙
- 版次:1
- 開本:16開
《深入Linux內(nèi)核架構(gòu)》討論了Linux內(nèi)核的概念、結(jié)構(gòu)和實(shí)現(xiàn)。主要內(nèi)容包括多任務(wù)、調(diào)度和進(jìn)程管理,物理內(nèi)存的管理以及內(nèi)核與相關(guān)硬件的交互,用戶空間的進(jìn)程如何訪問(wèn)虛擬內(nèi)存,如何編寫設(shè)備驅(qū)動(dòng)程序,模塊機(jī)制以及虛擬文件系統(tǒng),Ext文件系統(tǒng)屬性和訪問(wèn)控制表的實(shí)現(xiàn)方式,內(nèi)核中網(wǎng)絡(luò)的實(shí)現(xiàn),系統(tǒng)調(diào)用的實(shí)現(xiàn)方式,內(nèi)核對(duì)時(shí)間相關(guān)功能的處理,頁(yè)面回收和頁(yè)交換的相關(guān)機(jī)制以及審計(jì)的實(shí)現(xiàn)等。此外,《深入Linux內(nèi)核架構(gòu)》借助內(nèi)核源代碼中最關(guān)鍵的部分進(jìn)行講解,幫助讀者掌握重要的知識(shí)點(diǎn),從而在運(yùn)用中充分展現(xiàn)Linux系統(tǒng)的魅力!渡钊隠inux內(nèi)核架構(gòu)》適合Linux內(nèi)核愛好者閱讀。
眾所周知,Linux操作系統(tǒng)的源代碼復(fù)雜、文檔少,對(duì)程序員的要求高,要想看懂這些代碼并不是一件容易事!渡钊隠inux內(nèi)核架構(gòu)》結(jié)合內(nèi)核版本2.6.24源代碼中最關(guān)鍵的部分。深入討論Lirnux內(nèi)核的概念、結(jié)構(gòu)和實(shí)現(xiàn)。具體包括進(jìn)程管理和調(diào)度、虛擬內(nèi)存、進(jìn)程間通信、設(shè)備驅(qū)動(dòng)程序、虛擬文件系統(tǒng)、網(wǎng)絡(luò)、時(shí)間管理、數(shù)據(jù)同步等!渡钊隠inux內(nèi)核架構(gòu)》引導(dǎo)你閱讀內(nèi)核源代碼,熟悉Lirnux妍有的內(nèi)在工作機(jī)理,充分展現(xiàn)Linux系統(tǒng)的魅力!渡钊隠inux內(nèi)核架構(gòu)》適合Linux系統(tǒng)編程人員、系統(tǒng)管理者以及Linux愛好者學(xué)習(xí)使用! (nèi)容全面深入 全球開源社區(qū)集體智慧結(jié)晶 領(lǐng)略Linux內(nèi)核的絕美風(fēng)光
莫爾勒(Woflgang Mauerer),資深Linux專家,有數(shù)十年Linux開發(fā)經(jīng)驗(yàn)。從1997年最初發(fā)表關(guān)于內(nèi)核的系列文章開始,他就醉心于解釋Linux核心的內(nèi)部機(jī)制、編寫相關(guān)的文檔,此外,他還著有LaTex排版方面的圖書,其撰寫的大量文章已經(jīng)被釋譯成7種語(yǔ)言。
第1章 簡(jiǎn)介和概述1
1.1 內(nèi)核的任務(wù)2
1.2 實(shí)現(xiàn)策略2
1.3 內(nèi)核的組成部分3
1.3.1 進(jìn)程、進(jìn)程切換、調(diào)度3
1.3.2 UNIX進(jìn)程4
1.3.3 地址空間與特權(quán)級(jí)別6
1.3.4 頁(yè)表9
1.3.5 物理內(nèi)存的分配11
1.3.6 計(jì)時(shí)13
1.3.7 系統(tǒng)調(diào)用13
1.3.8 設(shè)備驅(qū)動(dòng)程序、塊設(shè)備和字符設(shè)備14
1.3.9 網(wǎng)絡(luò)14
1.3.10 文件系統(tǒng)14
1.3.11 模塊和熱插拔15
1.3.12 緩存16
1.3.13 鏈表處理16
1.3.14 對(duì)象管理和引用計(jì)數(shù)17
1.3.15 數(shù)據(jù)類型20
1.3.16 本書的局限性22
1.4 為什么內(nèi)核是特別的23
1.5 行文注記23
1.6 小結(jié)27
第2章 進(jìn)程管理和調(diào)度28
2.1 進(jìn)程優(yōu)先級(jí)28
2.2 進(jìn)程生命周期30
2.3 進(jìn)程表示32
2.3.1 進(jìn)程類型37
2.3.2 命名空間37
2.3.3 進(jìn)程ID號(hào)43
2.3.4 進(jìn)程關(guān)系49
2.4 進(jìn)程管理相關(guān)的系統(tǒng)調(diào)用50
2.4.1 進(jìn)程復(fù)制50
2.4.2 內(nèi)核線程62
2.4.3 啟動(dòng)新程序63
2.4.4 退出進(jìn)程66
2.5 調(diào)度器的實(shí)現(xiàn)67
2.5.1 概觀67
2.5.2 數(shù)據(jù)結(jié)構(gòu)69
2.5.3 處理優(yōu)先級(jí)74
2.5.4 核心調(diào)度器79
2.6 完全公平調(diào)度類84
2.6.1 數(shù)據(jù)結(jié)構(gòu)85
2.6.2 CFS操作85
2.6.3 隊(duì)列操作89
2.6.4 選擇下一個(gè)進(jìn)程91
2.6.5 處理周期性調(diào)度器92
2.6.6 喚醒搶占93
2.6.7 處理新進(jìn)程93
2.7 實(shí)時(shí)調(diào)度類94
2.7.1 性質(zhì)94
2.7.2 數(shù)據(jù)結(jié)構(gòu)95
2.7.3 調(diào)度器操作96
2.8 調(diào)度器增強(qiáng)97
2.8.1 SMP調(diào)度97
2.8.2 調(diào)度域和控制組101
2.8.3 內(nèi)核搶占和低延遲相關(guān)工作102
2.9 小結(jié)106
第3章 內(nèi)存管理107
3.1 概述107
3.2 (N)UMA模型中的內(nèi)存組織109
3.2.1 概述109
3.2.2 數(shù)據(jù)結(jié)構(gòu)111
3.3 頁(yè)表123
3.3.1 數(shù)據(jù)結(jié)構(gòu)124
3.3.2 頁(yè)表項(xiàng)的創(chuàng)建和操作129
3.4 初始化內(nèi)存管理129
3.4.1 建立數(shù)據(jù)結(jié)構(gòu)130
3.4.2 特定于體系結(jié)構(gòu)的設(shè)置135
3.4.3 啟動(dòng)過(guò)程期間的內(nèi)存管理153
3.5 物理內(nèi)存的管理159
3.5.1 伙伴系統(tǒng)的結(jié)構(gòu)159
3.5.2 避免碎片161
3.5.3 初始化內(nèi)存域和結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)167
3.5.4 分配器API172
3.5.5 分配頁(yè)177
3.5.6 釋放頁(yè)192
3.5.7 內(nèi)核中不連續(xù)頁(yè)的分配195
3.5.8 內(nèi)核映射201
3.6 slab分配器205
3.6.1 備選分配器206
3.6.2 內(nèi)核中的內(nèi)存管理207
3.6.3 slab分配的原理209
3.6.4 實(shí)現(xiàn)212
3.6.5 通用緩存226
3.7 處理器高速緩存和TLB控制228
3.8 小結(jié)230
第4章 進(jìn)程虛擬內(nèi)存231
4.1 簡(jiǎn)介231
4.2 進(jìn)程虛擬地址空間231
4.2.1 進(jìn)程地址空間的布局232
4.2.2 建立布局234
4.3 內(nèi)存映射的原理237
4.4 數(shù)據(jù)結(jié)構(gòu)238
4.4.1 樹和鏈表238
4.4.2 虛擬內(nèi)存區(qū)域的表示239
4.4.3 優(yōu)先查找樹241
4.5 對(duì)區(qū)域的操作244
4.5.1 將虛擬地址關(guān)聯(lián)到區(qū)域245
4.5.2 區(qū)域合并246
4.5.3 插入?yún)^(qū)域247
4.5.4 創(chuàng)建區(qū)域248
4.6 地址空間250
4.7 內(nèi)存映射251
4.7.1 創(chuàng)建映射251
4.7.2 刪除映射253
4.7.3 非線性映射254
4.8 反向映射257
4.8.1 數(shù)據(jù)結(jié)構(gòu)258
4.8.2 建立逆向映射259
4.8.3 使用逆向映射259
4.9 堆的管理261
4.10 缺頁(yè)異常的處理263
4.11 用戶空間缺頁(yè)異常的校正268
4.11.1 按需分配/調(diào)頁(yè)269
4.11.2 匿名頁(yè)271
4.11.3 寫時(shí)復(fù)制271
4.11.4 獲取非線性映射272
4.12 內(nèi)核缺頁(yè)異常272
4.13 在內(nèi)核和用戶空間之間復(fù)制數(shù)據(jù)274
4.14 小結(jié)276
第5章 鎖與進(jìn)程間通信277
5.1 控制機(jī)制277
5.1.1 競(jìng)態(tài)條件277
5.1.2 臨界區(qū)278
5.2 內(nèi)核鎖機(jī)制279
5.2.1 對(duì)整數(shù)的原子操作280
5.2.2 自旋鎖282
5.2.3 信號(hào)量283
5.2.4 RCU機(jī)制284
5.2.5 內(nèi)存和優(yōu)化屏障286
5.2.6 讀者/寫者鎖287
5.2.7 大內(nèi)核鎖288
5.2.8 互斥量288
5.2.9 近似的per-CPU計(jì)數(shù)器290
5.2.10 鎖競(jìng)爭(zhēng)與細(xì)粒度鎖291
5.3 SystemV進(jìn)程間通信292
5.3.1 SystemV機(jī)制292
5.3.2 信號(hào)量292
5.3.3 消息隊(duì)列300
5.3.4 共享內(nèi)存303
5.4 其他IPC機(jī)制303
5.4.1 信號(hào)303
5.4.2 管道和套接字310
5.5 小結(jié)311
第6章 設(shè)備驅(qū)動(dòng)程序312
6.1 I/O體系結(jié)構(gòu)312
6.2 訪問(wèn)設(shè)備316
6.2.1 設(shè)備文件316
6.2.2 字符設(shè)備、塊設(shè)備和其他設(shè)備317
6.2.3 使用ioctl進(jìn)行設(shè)備尋址319
6.2.4 主從設(shè)備號(hào)的表示320
6.2.5 注冊(cè)321
6.3 與文件系統(tǒng)關(guān)聯(lián)324
6.3.1 inode中的設(shè)備文件成員324
6.3.2 標(biāo)準(zhǔn)文件操作325
6.3.3 用于字符設(shè)備的標(biāo)準(zhǔn)操作325
6.3.4 用于塊設(shè)備的標(biāo)準(zhǔn)操作325
6.4 字符設(shè)備操作326
6.4.1 表示字符設(shè)備326
6.4.2 打開設(shè)備文件326
6.4.3 讀寫操作328
6.5 塊設(shè)備操作329
6.5.1 塊設(shè)備的表示330
6.5.2 數(shù)據(jù)結(jié)構(gòu)331
6.5.3 向系統(tǒng)添加磁盤和分區(qū)338
6.5.4 打開塊設(shè)備文件339
6.5.5 請(qǐng)求結(jié)構(gòu)341
6.5.6 BIO343
6.5.7 提交請(qǐng)求345
6.5.8 I/O調(diào)度350
6.5.9 ioctl的實(shí)現(xiàn)352
6.6 資源分配353
6.6.1 資源管理353
6.6.2 I/O內(nèi)存355
6.6.3 I/O端口357
6.7 總線系統(tǒng)358
6.7.1 通用驅(qū)動(dòng)程序模型358
6.7.2 PCI總線363
6.7.3 USB370
6.8 小結(jié)376
第7章 模塊377
7.1 概述377
7.2 使用模塊378
7.2.1 添加和移除378
7.2.2 依賴關(guān)系380
7.2.3 查詢模塊信息381
7.2.4 自動(dòng)加載382
7.3 插入和刪除模塊384
7.3.1 模塊的表示385
7.3.2 依賴關(guān)系和引用389
7.3.3 模塊的二進(jìn)制結(jié)構(gòu)391
7.3.4 插入模塊396
7.3.5 移除模塊403
7.4 自動(dòng)化與熱插拔404
7.4.1 kmod實(shí)現(xiàn)的自動(dòng)加載404
7.4.2 熱插拔405
7.5 版本控制408
7.5.1 校驗(yàn)和方法408
7.5.2 版本控制函數(shù)411
7.6 小結(jié)412
第8章 虛擬文件系統(tǒng)413
8.1 文件系統(tǒng)類型413
8.2 通用文件模型414
8.2.1 inode415
8.2.2 鏈接416
8.2.3 編程接口416
8.2.4 將文件作為通用接口417
8.3 VFS的結(jié)構(gòu)417
8.3.1 結(jié)構(gòu)概觀418
8.3.2 inode419
8.3.3 特定于進(jìn)程的信息423
8.3.4 文件操作427
8.3.5 目錄項(xiàng)緩存431
8.4 處理VFS對(duì)象436
8.4.1 文件系統(tǒng)操作436
8.4.2 文件操作450
8.5 標(biāo)準(zhǔn)函數(shù)456
8.5.1 通用讀取例程457
8.5.2 失效機(jī)制459
8.5.3 權(quán)限檢查461
8.6 小結(jié)463
第9章 Ext文件系統(tǒng)族464
9.1 簡(jiǎn)介464
9.2 Ext2文件系統(tǒng)465
9.2.1 物理結(jié)構(gòu)465
9.2.2 數(shù)據(jù)結(jié)構(gòu)470
9.2.3 創(chuàng)建文件系統(tǒng)484
9.2.4 文件系統(tǒng)操作485
9.3 Ext3文件系統(tǒng)507
9.3.1 概念508
9.3.2 數(shù)據(jù)結(jié)構(gòu)509
9.4 小結(jié)511
第10章 無(wú)持久存儲(chǔ)的文件系統(tǒng)512
10.1 proc文件系統(tǒng)512
10.1.1 /proc的內(nèi)容513
10.1.2 數(shù)據(jù)結(jié)構(gòu)519
10.1.3 初始化522
10.1.4 裝載proc文件系統(tǒng)523
10.1.5 管理/proc數(shù)據(jù)項(xiàng)525
10.1.6 讀取和寫入信息528
10.1.7 進(jìn)程相關(guān)的信息530
10.1.8 系統(tǒng)控制機(jī)制535
10.2 簡(jiǎn)單的文件系統(tǒng)542
10.2.1 順序文件542
10.2.2 用libfs編寫文件系統(tǒng)546
10.2.3 調(diào)試文件系統(tǒng)547
10.2.4 偽文件系統(tǒng)549
10.3 sysfs549
10.3.1 概述550
10.3.2 數(shù)據(jù)結(jié)構(gòu)550
10.3.3 裝載文件系統(tǒng)554
10.3.4 文件和目錄操作556
10.3.5 向sysfs添加內(nèi)容562
10.4 小結(jié)564
第11章 擴(kuò)展屬性和訪問(wèn)控制表565
11.1 擴(kuò)展屬性565
11.1.1 到虛擬文件系統(tǒng)的接口566
11.1.2 Ext3中的實(shí)現(xiàn)570
11.1.3 Ext2中的實(shí)現(xiàn)576
11.2 訪問(wèn)控制表577
11.2.1 通用實(shí)現(xiàn)577
11.2.2 Ext3中的實(shí)現(xiàn)580
11.2.3 Ext2中的實(shí)現(xiàn)585
11.3 小結(jié)585
……
第12章 網(wǎng)絡(luò)586
第13章 系統(tǒng)調(diào)用655
第14章 內(nèi)核活動(dòng)678
第15章 時(shí)間管理714
第16章 頁(yè)緩存和塊緩存761
第17章 數(shù)據(jù)同步793
第18章 頁(yè)面回收和頁(yè)交換821
第19章 審計(jì)882
附錄A 體系結(jié)構(gòu)相關(guān)知識(shí)899
附錄B 使用源代碼919
附錄C 有關(guān)C語(yǔ)言的注記947
附錄D 系統(tǒng)啟動(dòng)985
附錄E ELF二進(jìn)制格式
附錄F 內(nèi)核開發(fā)過(guò)程
參考文獻(xiàn)
內(nèi)核很神奇,但歸根結(jié)底它只是一個(gè)大的C程序,帶有一些匯編代碼(不時(shí)出現(xiàn)很少量的“黑巫術(shù)”)。是什么使得內(nèi)核如此吸引人?原因有幾個(gè)。首要一點(diǎn)在于,內(nèi)核是由世界上最好的程序員編寫的,源代碼可以證實(shí)這一點(diǎn)。其結(jié)構(gòu)良好,細(xì)節(jié)一絲不茍,巧妙的解決方案在代碼中處處可見。一言以蔽之:內(nèi)核應(yīng)該是什么樣子,它現(xiàn)在就是什么樣子。但這并不意味著內(nèi)核是應(yīng)用教科書風(fēng)格的程序設(shè)計(jì)方法學(xué)得出的產(chǎn)品。盡管內(nèi)核采用了設(shè)計(jì)得非常干凈的抽象,以保持代碼的模塊化和易管理性,但這一點(diǎn)與內(nèi)核的其他方面混合起來(lái),使得代碼非常有趣和獨(dú)特。在必要的情況下,內(nèi)核會(huì)以上下文相關(guān)的方式重用比特位置,多次重載結(jié)構(gòu)成員,從指針已經(jīng)對(duì)齊的部分壓榨出又一個(gè)存儲(chǔ)位,自由地使用goto語(yǔ)句,還有很多其他東西,這些都會(huì)使任何強(qiáng)調(diào)結(jié)構(gòu)的程序員因痛苦而尖叫。教科書答案中難以想象的那些技巧,對(duì)于實(shí)現(xiàn)能夠在真正的現(xiàn)實(shí)世界中正常工作的內(nèi)核不僅是有益的,甚至是必需的。正是因?yàn)檎业搅艘粭l在內(nèi)核完全對(duì)立的兩面之間保持平衡的路徑,內(nèi)核才如此令人興味盎然、富有挑戰(zhàn)性并且妙趣橫生!頌揚(yáng)了內(nèi)核源代碼之后,還有許多不同于用戶層程序的嚴(yán)肅問(wèn)題需要說(shuō)明?谡{(diào)試內(nèi)核通常要比調(diào)試用戶層程序困難。對(duì)后者來(lái)說(shuō)有大量的調(diào)試器可用,而對(duì)于后者來(lái)說(shuō)調(diào)試器的實(shí)現(xiàn)難度要高得多。附錄B討論了在內(nèi)核開發(fā)中使用調(diào)試器的各種技巧,但與用戶層對(duì)應(yīng)的方法相比都需要更多的工作?趦(nèi)核提供了許多輔助函數(shù),類似于用戶空間的c語(yǔ)言庫(kù),但內(nèi)核領(lǐng)域中的東西總是樸素得多?谟脩魧討(yīng)用程序的錯(cuò)誤可能會(huì)導(dǎo)致段錯(cuò)誤(segmentation fault)或內(nèi)存轉(zhuǎn)儲(chǔ)(core dump),但內(nèi)核錯(cuò)誤會(huì)導(dǎo)致整個(gè)系統(tǒng)故障。甚至更糟的是:內(nèi)核會(huì)繼續(xù)運(yùn)行,在錯(cuò)誤發(fā)生若干小時(shí)之后系統(tǒng)離奇地崩潰。如上所述,因?yàn)樵趦?nèi)核空間調(diào)試比用戶層應(yīng)用程序更困難,所以在內(nèi)核代碼投入使用之前要進(jìn)行更多的考慮。口必須考慮到內(nèi)核運(yùn)行的許多體系結(jié)構(gòu)上根本不支持非對(duì)齊的內(nèi)存訪問(wèn)。由于編譯器插入的填充(padding)字段,也會(huì)影響到數(shù)據(jù)結(jié)構(gòu)在不同體系結(jié)構(gòu)之間的可移植性。附錄C會(huì)進(jìn)一步討論這個(gè)問(wèn)題?谒械膬(nèi)核代碼都必須是并發(fā)安全的。由于對(duì)多處理器計(jì)算機(jī)的支持,Linux內(nèi)核代碼必須是可重入和線程安全的。也就是說(shuō),程序必須允許同時(shí)執(zhí)行,而數(shù)據(jù)必須針對(duì)并行訪問(wèn)進(jìn)行保護(hù)。口內(nèi)核代碼必須在小端序和大端序計(jì)算機(jī)上都能夠工作?诖蠖鄶(shù)的體系結(jié)構(gòu)根本不允許在內(nèi)核中執(zhí)行浮點(diǎn)計(jì)算,因此計(jì)算需要想辦法用整型來(lái)替代。后面讀者會(huì)看到如何處理這些問(wèn)題。