出版時(shí)間:2011-4-30 出版社:機(jī)械工業(yè)出版社華章公司 作者:Robert Love 頁數(shù):335 譯者:陳莉君,康華
Tag標(biāo)簽:無
前言
隨著Linux內(nèi)核和Linux應(yīng)用程序越來越成熟,越來越多的系統(tǒng)軟件工程師涉足Linux開發(fā)和維護(hù)領(lǐng)域。他們中有些人純粹是出于個(gè)人愛好,有些人是為Linux公司工作,有些人是為硬件廠商做開發(fā),還有一些是為內(nèi)部項(xiàng)目工作的。但是所有人都必須直面一個(gè)問題:內(nèi)核的學(xué)習(xí)曲線變得越來越長,也越來越陡峭。系統(tǒng)規(guī)模不斷擴(kuò)大,復(fù)雜程度不斷提高。雖然現(xiàn)在的內(nèi)核開發(fā)者對內(nèi)核的掌握越發(fā)爐火純青,但新手卻無法跟上內(nèi)核發(fā)展的步伐,長此以往將出現(xiàn)青黃不接的斷層。我認(rèn)為這種新老鴻溝已經(jīng)成為內(nèi)核質(zhì)量的一個(gè)隱患,而且問題將繼續(xù)惡化。所以那些真正關(guān)心內(nèi)核的人已經(jīng)開始致力于擴(kuò)大內(nèi)核開發(fā)群體。解決上述問題的一個(gè)方法是盡量保證代碼簡潔:接口定義合理,代碼風(fēng)格一致,“一次做一件事,做到完美”等。這也就是LinusTorvalds倡導(dǎo)的解決辦法。我提倡的解決辦法是對代碼慷慨地加上注釋,即能夠讓讀者立刻了解代碼開發(fā)者意圖的文字(識別意圖和實(shí)現(xiàn)之間差異的工作稱為調(diào)試。如果意圖不明確顯然調(diào)試就難以進(jìn)行)。可是,即使有注解,也沒辦法清楚地展現(xiàn)內(nèi)核的各個(gè)主要子系統(tǒng)的全景,說明它們到底要做什么。那么,這些開發(fā)者又該從何下手呢?由文字材料來說明這些在起步階段就該理解的材料,其實(shí)是最合適的。RobertLove的貢獻(xiàn)就在于此,有經(jīng)驗(yàn)的開發(fā)者可以通過本書全面了解內(nèi)核子系統(tǒng)提供的服務(wù),同時(shí)還可以了解這些服務(wù)是怎么實(shí)現(xiàn)的。對不少人來說,這些知識就已經(jīng)足夠了:那些好奇的人,那些應(yīng)用程序開發(fā)者,那些想對內(nèi)核的設(shè)計(jì)品頭論足一番的人,都有足夠的談資了。但是學(xué)習(xí)本書同樣可以作為那些有抱負(fù)的內(nèi)核開發(fā)者更上一層樓的契機(jī),可以幫他們更改內(nèi)核代碼以達(dá)到預(yù)定的目標(biāo)。我建議有抱負(fù)的開發(fā)者能夠親身實(shí)踐:理解內(nèi)核某部分的捷徑就是對它做些修改,這樣能為開發(fā)者揭示僅僅通過看內(nèi)核代碼無法看到的深層機(jī)理。嚴(yán)肅認(rèn)真的內(nèi)核開發(fā)者應(yīng)該加入開發(fā)郵件列表,不斷和其他開發(fā)者交流。這是內(nèi)核開發(fā)者相互切磋和并肩前進(jìn)的最好方法。而Robert在書中對內(nèi)核生活中至關(guān)重要的文化和技巧都做了精彩介紹。請學(xué)習(xí)和欣賞Robert的書吧。想必你也希望能精益求精,繼續(xù)探索,成為內(nèi)核開發(fā)社區(qū)中的一員,那么首先你要清楚的是:社區(qū)歡迎你。我們評價(jià)和衡量一個(gè)人是根據(jù)他所作的貢獻(xiàn),當(dāng)你投身于Linux時(shí),你要明白:雖然你僅僅貢獻(xiàn)了一小份力,但馬上就會有數(shù)千萬或上億人受益。這是我們的歡樂之源,也是我們的責(zé)任之本。
內(nèi)容概要
《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書第3版)》詳細(xì)描述了Linux內(nèi)核的設(shè)計(jì)與實(shí)現(xiàn)。內(nèi)核代碼的編寫者、開發(fā)者以及程序開發(fā)人員都可以通過閱讀本書受益,他們可以更好理解操作系統(tǒng)原理,并將其應(yīng)用在自己的編碼中以提高效率和生產(chǎn)率。
本書詳細(xì)描述了Linux內(nèi)核的主要子系統(tǒng)和特點(diǎn),包括Linux內(nèi)核的設(shè)計(jì)、實(shí)現(xiàn)和接口。從理論到實(shí)踐涵蓋了Linux內(nèi)核的方方面面,可以滿足讀者的各種興趣和需求。
作者Robert Love是一位Linux內(nèi)核核心開發(fā)人員,他分享了在開發(fā)Linux
2.6內(nèi)核過程中頗具價(jià)值的知識和經(jīng)驗(yàn)。本書的主題包括進(jìn)程管理、進(jìn)程調(diào)度、時(shí)間管理和定時(shí)器、系統(tǒng)調(diào)用接口、內(nèi)存尋址、內(nèi)存管理和頁緩存、VFS、內(nèi)核同步、移植性相關(guān)的問題以及調(diào)試技術(shù)。同時(shí)本書也涵蓋了Linux
2.6內(nèi)核中頗具特色的內(nèi)容,包括CFS調(diào)度程序、搶占式內(nèi)核、塊I/O層以及I/O調(diào)度程序。
《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書第3版)》新增內(nèi)容包括:
增加一章專門描述內(nèi)核數(shù)據(jù)結(jié)構(gòu)
詳細(xì)描述中斷處理程序和下半部機(jī)制
擴(kuò)充虛擬內(nèi)存和內(nèi)存分配的內(nèi)容
調(diào)試Linux內(nèi)核的技巧
內(nèi)核同步和鎖機(jī)制的深度描述
提交內(nèi)核補(bǔ)丁以及參與Linux內(nèi)核社區(qū)的建設(shè)性建議
作者簡介
Robert
Love是一位資深的開源社區(qū)達(dá)人,很早就開始使用Linux。目前他是Google公司高級軟件工程師,是開發(fā)Android移動平臺內(nèi)核的團(tuán)隊(duì)成員;他曾在Novell公司任職Linux桌面系統(tǒng)的首席架構(gòu)師;他之前也曾是MontaVista和Ximain公司的內(nèi)核開發(fā)工程師。他參與的內(nèi)核項(xiàng)目包括搶占式內(nèi)核、進(jìn)程調(diào)度器、內(nèi)核事件層、通知機(jī)制、VM改進(jìn),以及設(shè)備驅(qū)動程序。他是《Linux
journal》雜志的編輯。另外他還著有《Linux System Programming》和《Linux in a
Nutshell》。
陳莉君,西安郵電學(xué)院教授,十多年來一直致力于推動Linux在中國的發(fā)展,多年從事Linux內(nèi)核的教學(xué)和研究,并積極跟蹤Linux內(nèi)核的發(fā)展動向,對Linux內(nèi)核版本的不斷演化有著深刻的理解。著譯作品有《Linux操作系統(tǒng)原理與應(yīng)用》、《Linux操作系統(tǒng)內(nèi)核分析》、《深入分析Linux內(nèi)核源代碼》、《深入理解Linux內(nèi)核》和《Linux內(nèi)核編程》等。
書籍目錄
譯者序
序言
前言
作者簡介
第1章 Linux內(nèi)核簡介1
1.1 Unix的歷史1
1.2 追尋Linus足跡:Linux簡介2
1.3 操作系統(tǒng)和內(nèi)核簡介3
1.4 Linux內(nèi)核和傳統(tǒng)Unix內(nèi)核的比較5
1.5 Linux內(nèi)核版本7
1.6 Linux內(nèi)核開發(fā)者社區(qū)8
1.7 小結(jié)8
第2章 從內(nèi)核出發(fā)10
2.1 獲取內(nèi)核源碼10
2.1.1 使用Git10
2.1.1 安裝內(nèi)核源代碼10
2.1.3 使用補(bǔ)丁11
2.2 內(nèi)核源碼樹11
2.3 編譯內(nèi)核12
2.3.1 配置內(nèi)核12
2.3.2 減少編譯的垃圾信息14
2.3.3 衍生多個(gè)編譯作業(yè) 14
2.3.4 安裝新內(nèi)核14
2.4 內(nèi)核開發(fā)的特點(diǎn)15
2.4.1 無libc庫抑或無標(biāo)準(zhǔn)頭文件15
2.4.2 GNU C16
2.4.3 沒有內(nèi)存保護(hù)機(jī)制18
2.4.4 不要輕易在內(nèi)核中使用浮點(diǎn)數(shù)18
2.4.5 容積小而固定的棧18
2.4.6 同步和并發(fā)18
2.4.7 可移植性的重要性19
2.5 小結(jié)19
第3章 進(jìn)程管理20
3.1 進(jìn)程20
3.2 進(jìn)程描述符及任務(wù)結(jié)構(gòu) 21
3.2.1 分配進(jìn)程描述符22
3.2.2 進(jìn)程描述符的存放23
3.2.3 進(jìn)程狀態(tài)23
3.2.4 設(shè)置當(dāng)前進(jìn)程狀態(tài)25
3.2.5 進(jìn)程上下文25
3.2.6 進(jìn)程家族樹25
3.3 進(jìn)程創(chuàng)建26
3.3.1 寫時(shí)拷貝27
3.3.2 fork()27
3.3.3 vfork()28
3.4 線程在Linux中的實(shí)現(xiàn)28
3.4.1 創(chuàng)建線程29
3.4.2 內(nèi)核線程30
3.5 進(jìn)程終結(jié)31
3.5.1 刪除進(jìn)程描述符32
3.5.2 孤兒進(jìn)程造成的進(jìn)退維谷32
3.6 小結(jié)34
第4章 進(jìn)程調(diào)度35
4.1 多任務(wù)35
4.2 Linux 的進(jìn)程調(diào)度36
4.3 策略36
4.3.1 I/O消耗型和處理器消耗型的進(jìn)程36
4.3.2 進(jìn)程優(yōu)先級37
4.3.3 時(shí)間片38
4.3.4 調(diào)度策略的活動38
4.4 Linux調(diào)度算法39
4.4.1 調(diào)度器類39
4.4.2 Unix 系統(tǒng)中的進(jìn)程調(diào)度40
4.4.3 公平調(diào)度41
4.5 Linux調(diào)度的實(shí)現(xiàn)42
4.5.1 時(shí)間記賬42
4.5.2 進(jìn)程選擇44
4.5.3 調(diào)度器入口48
4.5.4 睡眠和喚醒49
4.6 搶占和上下文切換51
4.6.1 用戶搶占53
4.6.2 內(nèi)核搶占53
4.7 實(shí)時(shí)調(diào)度策略54
4.8 與調(diào)度相關(guān)的系統(tǒng)調(diào)用54
4.8.1 與調(diào)度策略和優(yōu)先級相關(guān)的系統(tǒng)調(diào)用55
4.8.2 與處理器綁定有關(guān)的系統(tǒng)調(diào)用55
4.8.3 放棄處理器時(shí)間56
4.9 小結(jié)56
第5章 系統(tǒng)調(diào)用57
5.1 與內(nèi)核通信57
5.2 API、POSIX和C庫57
5.3 系統(tǒng)調(diào)用58
5.3.1 系統(tǒng)調(diào)用號59
5.3.2 系統(tǒng)調(diào)用的性能59
5.4 系統(tǒng)調(diào)用處理程序60
5.4.1 指定恰當(dāng)?shù)南到y(tǒng)調(diào)用60
5.4.2 參數(shù)傳遞60
5.5 系統(tǒng)調(diào)用的實(shí)現(xiàn)61
5.5.1 實(shí)現(xiàn)系統(tǒng)調(diào)用61
5.5.2 參數(shù)驗(yàn)證62
5.6 系統(tǒng)調(diào)用上下文64
5.6.1 綁定一個(gè)系統(tǒng)調(diào)用的最后步驟65
5.6.2 從用戶空間訪問系統(tǒng)調(diào)用67
5.6.3 為什么不通過系統(tǒng)調(diào)用的方式實(shí)現(xiàn)68
5.7 小結(jié)68
第6章 內(nèi)核數(shù)據(jù)結(jié)構(gòu)69
6.1 鏈表69
6.1.1 單向鏈表和雙向鏈表69
6.1.2 環(huán)形鏈表70
6.1.3 沿鏈表移動71
6.1.4 Linux 內(nèi)核中的實(shí)現(xiàn)71
6.1.5 操作鏈表73
6.1.6 遍歷鏈表75
6.2 隊(duì)列78
6.2.1 kfifo79
6.2.2 創(chuàng)建隊(duì)列79
6.2.3 推入隊(duì)列數(shù)據(jù)79
6.2.4 摘取隊(duì)列數(shù)據(jù)80
6.2.5 獲取隊(duì)列長度80
6.2.6 重置和撤銷隊(duì)列80
6.2.7 隊(duì)列使用舉例 81
6.3 映射 81
6.3.1 初始化一個(gè)idr82
6.3.2 分配一個(gè)新的UID82
6.3.3 查找UID83
6.3.4 刪除UID84
6.3.5 撤銷idr84
6.4 二叉樹84
6.4.1 二叉搜索樹84
6.4.2 自平衡二叉搜索樹 85
6.5 數(shù)據(jù)結(jié)構(gòu)以及選擇 87
6.6 算法復(fù)雜度88
6.6.1 算法88
6.6.2 大o 符號88
6.6.3 大θ符號89
6.6.4 時(shí)間復(fù)雜度89
6.7 小結(jié) 90
第7章 中斷和中斷處理91
7.1 中斷91
7.2 中斷處理程序92
7.3 上半部與下半部的對比93
7.4 注冊中斷處理程序93
7.4.1 中斷處理程序標(biāo)志94
7.4.2 一個(gè)中斷例子95
7.4.3 釋放中斷處理程序95
7.5 編寫中斷處理程序96
7.5.1 共享的中斷處理程序97
7.5.2 中斷處理程序?qū)嵗?7
7.6 中斷上下文99
7.7 中斷處理機(jī)制的實(shí)現(xiàn)100
7.8 /proc/interrupts102
7.9 中斷控制103
7.9.1 禁止和激活中斷103
7.9.2 禁止指定中斷線105
7.9.3 中斷系統(tǒng)的狀態(tài)105
7.10 小結(jié)106
第8章 下半部和推后執(zhí)行的工作107
8.1 下半部107
8.1.1 為什么要用下半部108
8.1.2 下半部的環(huán)境108
8.2 軟中斷110
8.2.1 軟中斷的實(shí)現(xiàn)111
8.2.2 使用軟中斷113
8.3 tasklet114
8.3.1 tasklet的實(shí)現(xiàn)114
8.3.2 使用tasklet116
8.3.3 老的BH機(jī)制119
8.4 工作隊(duì)列120
8.4.1 工作隊(duì)列的實(shí)現(xiàn)121
8.4.2 使用工作隊(duì)列124
8.4.3 老的任務(wù)隊(duì)列機(jī)制126
8.5 下半部機(jī)制的選擇127
8.6 在下半部之間加鎖128
8.7 禁止下半部128
8.8 小結(jié)129
第9章 內(nèi)核同步介紹131
9.1 臨界區(qū)和競爭條件131
9.1.1 為什么我們需要保護(hù)132
9.1.2 單個(gè)變量133
9.2 加鎖134
9.2.1 造成并發(fā)執(zhí)行的原因135
9.2.2 了解要保護(hù)些什么136
9.3 死鎖137
9.4 爭用和擴(kuò)展性138
9.5 小結(jié)140
第10章 內(nèi)核同步方法141
10.1 原子操作141
10.1.1 原子整數(shù)操作142
10.1.2 64位原子操作144
10.1.3 原子位操作145
10.2 自旋鎖147
10.2.1 自旋鎖方法148
10.2.2 其他針對自旋鎖的操作149
10.2.3 自旋鎖和下半部150
10.3 讀-寫自旋鎖150
10.4 信號量152
10.4.1 計(jì)數(shù)信號量和二值信號量153
10.4.2 創(chuàng)建和初始化信號量154
10.4.3 使用信號量154
10.5 讀-寫信號量155
10.6 互斥體156
10.6.1 信號量和互斥體158
10.6.2 自旋鎖和互斥體158
10.7 完成變量158
10.8 BLK:大內(nèi)核鎖159
10.9 順序鎖160
10.10 禁止搶占161
10.11 順序和屏障162
10.12 小結(jié)165
第11章 定時(shí)器和時(shí)間管理166
11.1 內(nèi)核中的時(shí)間概念166
11.2 節(jié)拍率:HZ167
11.2.1 理想的HZ值168
11.2.2 高HZ的優(yōu)勢169
11.2.3 高HZ的劣勢169
11.3 jiffies170
11.3.1 jiffies的內(nèi)部表示171
11.3.2 jiffies 的回繞172
11.3.3 用戶空間和HZ173
11.4 硬時(shí)鐘和定時(shí)器174
11.4.1 實(shí)時(shí)時(shí)鐘174
11.4.2 系統(tǒng)定時(shí)器174
11.5 時(shí)鐘中斷處理程序174
11.6 實(shí)際時(shí)間176
11.7 定時(shí)器178
11.7.1 使用定時(shí)器178
11.7.2 定時(shí)器競爭條件180
11.7.3 實(shí)現(xiàn)定時(shí)器180
11.8 延遲執(zhí)行181
11.8.1 忙等待181
11.8.2 短延遲182
11.8.3 schedule_timeout()183
11.9 小結(jié)185
第12章 內(nèi)存管理186
12.1 頁186
12.2 區(qū)187
12.3 獲得頁189
12.3.1 獲得填充為0的頁190
12.3.2 釋放頁191
12.4 kmalloc()191
12.4.1 gfp_mask標(biāo)志192
12.4.2 kfree()195
12.5 vmalloc()196
12.6 slab層197
12.6.1 slab層的設(shè)計(jì)198
12.6.2 slab分配器的接口200
12.7 在棧上的靜態(tài)分配203
12.7.1 單頁內(nèi)核棧203
12.7.2 在棧上光明正大地工作203
12.8 高端內(nèi)存的映射204
12.8.1 永久映射204
12.8.2 臨時(shí)映射204
12.9 每個(gè)CPU的分配205
12.10 新的每個(gè)CPU接口206
12.10.1 編譯時(shí)的每個(gè)CPU數(shù)據(jù)206
12.10.2 運(yùn)行時(shí)的每個(gè)CPU數(shù)據(jù)207
12.11 使用每個(gè)CPU數(shù)據(jù)的原因208
12.12 分配函數(shù)的選擇209
12.13 小結(jié)209
第13章 虛擬文件系統(tǒng)210
13.1 通用文件系統(tǒng)接口210
13.2 文件系統(tǒng)抽象層211
13.3 Unix文件系統(tǒng)212
13.4 VFS 對象及其數(shù)據(jù)結(jié)構(gòu)213
13.5 超級塊對象214
13.6 超級塊操作215
13.7 索引節(jié)點(diǎn)對象217
13.8 索引節(jié)點(diǎn)操作219
13.9 目錄項(xiàng)對象222
13.9.1 目錄項(xiàng)狀態(tài)222
13.9.2 目錄項(xiàng)緩存223
13.10 目錄項(xiàng)操作224
13.11 文件對象225
13.12 文件操作226
13.13 和文件系統(tǒng)相關(guān)的數(shù)據(jù)結(jié)構(gòu)230
13.14 和進(jìn)程相關(guān)的數(shù)據(jù)結(jié)構(gòu)232
13.15 小結(jié)233
第14章 塊I/O層234
14.1 剖析一個(gè)塊設(shè)備234
14.2 緩沖區(qū)和緩沖區(qū)頭235
14.3 bio結(jié)構(gòu)體237
14.3.1 I/O向量238
14.3.2 新老方法對比239
14.4 請求隊(duì)列240
14.5 I/O調(diào)度程序240
14.5.1 I/O調(diào)度程序的工作241
14.5.2 Linus 電梯241
14.5.3 最終期限I/O調(diào)度程序242
14.5.4 預(yù)測I/O調(diào)度程序244
14.5.5 完全公正的排隊(duì)I/O調(diào)度程序244
14.5.6 空操作的I/O調(diào)度程序245
14.5.7 I/O調(diào)度程序的選擇245
14.6 小結(jié)246
第15章 進(jìn)程地址空間247
15.1 地址空間247
15.2 內(nèi)存描述符248
15.2.1 分配內(nèi)存描述符249
15.2.2 撤銷內(nèi)存描述符250
15.2.3 mm_struct 與內(nèi)核線程250
15.3 虛擬內(nèi)存區(qū)域251
15.3.1 VMA標(biāo)志251
15.3.2 VMA 操作253
15.3.3 內(nèi)存區(qū)域的樹型結(jié)構(gòu)和內(nèi)存區(qū)域的鏈表結(jié)構(gòu)254
15.3.4 實(shí)際使用中的內(nèi)存區(qū)域254
15.4 操作內(nèi)存區(qū)域255
15.4.1 find_vma()256
15.4.2 find_vma_prev()257
15.4.3 find_vma_intersection()257
15.5 mmap()和do_mmap():創(chuàng)建地址區(qū)間258
15.6 mummap()和do_mummap():刪除地址區(qū)間259
15.7 頁表260
15.8 小結(jié)261
第16章 頁高速緩存和頁回寫262
16.1 緩存手段262
16.1.1 寫緩存262
16.1.2 緩存回收263
16.2 Linux 頁高速緩存264
16.2.1 address_space對象264
16.2.2 address_space 操作266
16.2.3 基樹267
16.2.4 以前的頁散列表268
16.3 緩沖區(qū)高速緩存268
16.4 flusher線程268
16.4.1 膝上型計(jì)算機(jī)模式270
16.4.2 歷史上的bdflush、kupdated 和pdflush270
16.4.3 避免擁塞的方法:使用多線程271
16.5 小結(jié)271
第17章 設(shè)備與模塊273
17.1 設(shè)備類型273
17.2 模塊274
17.2.1 Hello,World274
17.2.2 構(gòu)建模塊275
17.2.3 安裝模塊277
17.2.4 產(chǎn)生模塊依賴性277
17.2.5 載入模塊278
17.2.6 管理配置選項(xiàng)279
17.2.7 模塊參數(shù)280
17.2.8 導(dǎo)出符號表282
17.3 設(shè)備模型283
17.3.1 kobject283
17.3.2 ktype284
17.3.3 kset285
17.3.4 kobject、ktype和kset的相互關(guān)系285
17.3.5 管理和操作kobject286
17.3.6 引用計(jì)數(shù)287
17.4 sysfs288
17.4.1 sysfs中添加和刪除kobject 290
17.4.2 向sysfs中添加文件291
17.4.3 內(nèi)核事件層293
17.5 小結(jié)294
第18章 調(diào)試295
18.1 準(zhǔn)備開始295
18.2 內(nèi)核中的bug296
18.3 通過打印來調(diào)試296
18.3.1 健壯性296
18.3.2 日志等級297
18.3.3 記錄緩沖區(qū)298
18.3.4 syslogd和klogd298
18.3.5 從printf()到printk()的轉(zhuǎn)換298
18.4 oops298
18.4.1 ksymoops300
18.4.2 kallsyms300
18.5 內(nèi)核調(diào)試配置選項(xiàng)301
18.6 引發(fā)bug并打印信息301
18.7 神奇的系統(tǒng)請求鍵302
18.8 內(nèi)核調(diào)試器的傳奇303
18.8.1 gdb303
18.8.2 kgdb304
18.9 探測系統(tǒng)304
18.9.1 用UID作為選擇條件304
18.9.2 使用條件變量305
18.9.3 使用統(tǒng)計(jì)量305
18.9.4 重復(fù)頻率限制305
18.10 用二分查找法找出引發(fā)罪惡的變更306
18.11 使用Git進(jìn)行二分搜索307
18.12 當(dāng)所有的努力都失敗時(shí):社區(qū)308
18.13 小結(jié)308
第19章 可移植性309
19.1 可移植操作系統(tǒng)309
19.2 Linux移植史310
19.3 字長和數(shù)據(jù)類型311
19.3.1 不透明類型313
19.3.2 指定數(shù)據(jù)類型314
19.3.3 長度明確的類型314
19.3.4 char型的符號問題315
19.4 數(shù)據(jù)對齊315
19.4.1 避免對齊引發(fā)的問題316
19.4.2 非標(biāo)準(zhǔn)類型的對齊316
19.4.3 結(jié)構(gòu)體填補(bǔ)316
19.5 字節(jié)順序318
19.6 時(shí)間319
19.7 頁長度320
19.8 處理器排序320
19.9 SMP、內(nèi)核搶占、高端內(nèi)存321
19.10 小結(jié)321
第20章 補(bǔ)丁、開發(fā)和社區(qū)322
20.1 社區(qū)322
20.2 Linux編碼風(fēng)格322
20.2.1 縮進(jìn)323
20.2.2 switch 語句323
20.2.3 空格324
20.2.4 花括號325
20.2.5 每行代碼的長度326
20.2.6 命名規(guī)范326
20.2.7 函數(shù)326
20.2.8 注釋326
20.2.9 typedef327
20.2.10 多用現(xiàn)成的東西328
20.2.11 在源碼中減少使用ifdef328
20.2.12 結(jié)構(gòu)初始化328
20.2.13 代碼的事后修正329
20.3 管理系統(tǒng)329
20.4 提交錯(cuò)誤報(bào)告329
20.5 補(bǔ)丁330
20.5.1 創(chuàng)建補(bǔ)丁330
20.5.2 用Git創(chuàng)建補(bǔ)丁331
20.5.3 提交補(bǔ)丁331
20.6 小結(jié)332
參考資料333
章節(jié)摘錄
不知不覺涉足Linux內(nèi)核已經(jīng)十多個(gè)年頭了,與其他有志(興趣)于此的朋友一樣,我們也經(jīng)歷了學(xué)習(xí)—實(shí)用—追蹤—再學(xué)習(xí)的過程。也就是說,我們也是從漫無邊際到茫然無措,再到初窺門徑,轉(zhuǎn)而覺得心有戚戚焉這一路走下來的。其中甘苦,猶然在心。Linux最為人稱道的莫過于它的自由精神,所有源代碼唾手可得。侯捷先生云:“源碼在前,了無秘密?!笔堑?,但是我們在面對它的時(shí)候,為什么卻總是因?yàn)檫@種規(guī)模和層面所造就的陡峭學(xué)習(xí)曲線陷入困頓呢?很多朋友就此倒下,縱然Linux世界繁花似錦,縱然內(nèi)核天空無邊廣闊,但是,眼前的迷霧重重,心中的陰霾又怎能被陽光驅(qū)散呢?縱有雄心壯志,拔劍四顧心茫然,腳下路在何方?Linux內(nèi)核入門是不容易,它之所以難學(xué),在于龐大的規(guī)模和復(fù)雜的層面。規(guī)模一大,就不易現(xiàn)出本來面目,渾然一體,自然不容易找到著手之處;層面一多,就會讓人眼花繚亂,盤根錯(cuò)節(jié),怎能讓人提綱挈領(lǐng)?“如果有這樣一本書,既能提綱挈領(lǐng),為我理順?biāo)季w,指引方向,同時(shí)又能照顧小節(jié),闡述細(xì)微,幫助我們更好更快地理解STL源碼,那該有多好?!泵蠋r先生如此說,雖然針對的是C++,但道出的是研習(xí)源碼的人們共同的心聲。然而,Linux源碼研究的方法卻不大相同。這還是由于規(guī)模和層面決定的。比如說,在語言學(xué)習(xí)中,我們可以采取小步快跑的方法,通過一個(gè)個(gè)小程序和小嘗試,就可以取得漸進(jìn)的成果,就能從新技術(shù)中有所收獲。而掌握Linux呢?如果沒有對整體的把握,即使你對某個(gè)局部的算法、技術(shù)或是代碼再熟悉,也無法將其融入實(shí)用。其實(shí),像內(nèi)核這樣的大規(guī)模的軟件,正是編程技術(shù)施展身手的舞臺(當(dāng)然,目前的內(nèi)核雖然包含了一些面向?qū)ο笏枷耄€不能讓C++一展身手)。那么,我們能不能做點(diǎn)什么,讓Linux的內(nèi)核學(xué)習(xí)過程更符合程序員的習(xí)慣呢?RobertLove回答了這個(gè)問題。RobertLove是一個(gè)狂熱的內(nèi)核愛好者,所以他的想法自然貼近程序員。是的,我們注定要在對所有核心的子系統(tǒng)有了全面認(rèn)識之后,才能開始自己的實(shí)踐,但卻完全可以舍棄細(xì)枝末節(jié),將行李壓縮到最小,自然可以輕裝快走,迅速進(jìn)入動手階段。因此,相對于DanielP.Bovet和MarcoCesati的內(nèi)核巨著《UnderstandingtheLinuxKernel》,它少了五分細(xì)節(jié);相對于實(shí)踐經(jīng)典《LinuxDeviceDrivers》,多了五分說理??梢哉f,本書填補(bǔ)了Linux內(nèi)核理論和實(shí)踐之間的鴻溝,真可謂“一橋飛架南北,天塹變通途”。就我們的經(jīng)驗(yàn),內(nèi)核初學(xué)者(不是編程初學(xué)者)可以從本書著手,對內(nèi)核各個(gè)核心子系統(tǒng)有個(gè)整體把握,包括它們提供什么樣的服務(wù),為什么要提供這樣的服務(wù),又是怎樣實(shí)現(xiàn)的。而且,本書還包含了Linux內(nèi)核開發(fā)者在開發(fā)時(shí)需要用到的很多信息,包括調(diào)試技術(shù)、編程風(fēng)格、注意事項(xiàng)等。在消化本書的基礎(chǔ)上,如果你側(cè)重于了解內(nèi)核,可以進(jìn)一步研究《UnderstandingtheLinuxKernel》和源代碼本身;如果你側(cè)重于實(shí)際編程,可以研讀《LinuxDeviceDrivers》,直接開始動手工作;如果你想有一個(gè)輕松的內(nèi)核學(xué)習(xí)和實(shí)踐環(huán)節(jié),請?jiān)L問我們的網(wǎng)站www.kerneltravel.net。Linux內(nèi)核是一艘永不停息的輪船,它將駛向何方我們并不知曉,但在這些變化的背后,總有一些原理是恒定不變的,總有一些變化是我們想知曉的,比如調(diào)度程序的大幅度改進(jìn),內(nèi)核性能的不斷提升,本書第3版雖然針對的是較新的2.6.34Linux內(nèi)核版本,但在舊版本上積累的知識和經(jīng)驗(yàn)依然有效,而新增內(nèi)容將使讀者在應(yīng)對變化了的內(nèi)核代碼時(shí)更加從容。感謝牛濤和武特,他們在第2版和第3版差異的校對中花費(fèi)了大量精力。感謝素不相識的網(wǎng)友ChengRenquan,他主動承擔(dān)了其中一章的修訂。還要感謝蘇錦繡、黃偉、王澤宇、趙格娟、劉周平、周永飛、曹江峰、陳白虎和孟阿龍,他們參與了后期的校對和查錯(cuò)補(bǔ)漏。最后,特別感謝我的合作者康華,從十年前一塊分析Linux內(nèi)核代碼到今天,他對技術(shù)孜孜不倦的追求不但在業(yè)界贏得聲譽(yù),也使我們在翻譯過程中所遇到的技術(shù)難點(diǎn)和晦澀句子被一一迎刃而解。感謝合作者張波,他流暢有趣的文筆讓本書少了份枯燥,多了份趣味。陳莉君2010年10月前言在我剛開始有把自己的內(nèi)核開發(fā)經(jīng)驗(yàn)集結(jié)成冊,撰寫一本書的念頭時(shí),我其實(shí)也覺得有點(diǎn)頭緒繁多,不知道該從何下手。我實(shí)在不想落入傳統(tǒng)內(nèi)核書籍的窠臼,照貓畫虎地再寫這么一本。不錯(cuò),前人著述備矣,但我終歸是要寫出點(diǎn)兒與眾不同的東西來,我的書該如何定位,說實(shí)話,這確實(shí)讓人頗費(fèi)思量。后來,靈感終于浮現(xiàn)出來,我意識到自己可以從一個(gè)全新的視角看待這個(gè)主題。開發(fā)內(nèi)核是我的工作,同時(shí)也是我的嗜好,內(nèi)核就是我的摯愛。這些年來,我不斷搜集與內(nèi)核有關(guān)的奇聞軼事,不斷積攢關(guān)鍵的開發(fā)訣竅,依靠這些日積月累的材料,我可以寫一本關(guān)于開發(fā)內(nèi)核該做什么—更重要的是—不該做什么的書籍。從本質(zhì)上說,這本書仍舊是描述Linux內(nèi)核是如何設(shè)計(jì)和實(shí)現(xiàn)的,但是寫法卻另辟蹊徑,所提供的信息更傾向于實(shí)用。通過《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書第3版)》,你就可以做一些內(nèi)核開發(fā)的工作了—并且是使用正確的方法去做。我是一個(gè)注重實(shí)效的人,因此,這是一本實(shí)踐的書,它應(yīng)當(dāng)有趣、易讀且有用。我希望讀者可以從這本書中領(lǐng)略到更多Linux內(nèi)核的精妙之處(寫出來的和沒寫出來的),也希望讀者敢于從閱讀本書和讀內(nèi)核代碼開始跨越到開始嘗試開發(fā)可用、可靠且清晰的內(nèi)核代碼。當(dāng)然如果你僅僅是興致所至,讀書自娛,那也希望你能從中找到樂趣。從第1版到現(xiàn)在,又過了一段時(shí)間,我們再次回到本書,修補(bǔ)遺憾。本版比第1版和第2版內(nèi)容更豐富:修訂、補(bǔ)充并增加了新的內(nèi)容和章節(jié),使其更加完善。本版融合了第2版以來內(nèi)核的各種變化。更值得一提的是,Linux內(nèi)核聯(lián)盟做出決定,近期內(nèi)不進(jìn)行2.7版內(nèi)核的開發(fā),于是,內(nèi)核開發(fā)者打算繼續(xù)開發(fā)并穩(wěn)定2.6版。這個(gè)決定意味深長,而本書從中的最大受益就是在2.6版上可以穩(wěn)定相當(dāng)長時(shí)間。隨著內(nèi)核的成熟,內(nèi)核“快照”才有機(jī)會能維持得更久遠(yuǎn)一些。本書可作為內(nèi)核開發(fā)的規(guī)范文檔,既認(rèn)識內(nèi)核的過去,也著眼于內(nèi)核的未來。使用這本書開發(fā)Linux內(nèi)核不需要天賦異秉,不需要有什么魔法,連Unix開發(fā)者普遍長著的絡(luò)腮胡子都不一定要有。內(nèi)核雖然有一些有趣并且獨(dú)特的規(guī)則和要求,但是它和其他大型軟件項(xiàng)目相比,并沒有太大差別。像所有的大型軟件開發(fā)一樣,要學(xué)的東西確實(shí)不少,但是不同之處在于數(shù)量上的積累,而非本質(zhì)上的區(qū)別。認(rèn)真閱讀源碼非常有必要,Linux系統(tǒng)代碼的開放性其實(shí)是彌足珍貴的,不要無動于衷地將它擱置一邊,浪費(fèi)了大好資源。實(shí)際上就是讀了代碼還遠(yuǎn)遠(yuǎn)不夠呢,你應(yīng)該鉆研并嘗試著動手改動一些代碼。尋找一個(gè)bug然后去,改進(jìn)你的硬件設(shè)備的驅(qū)動程序。增加新功能,即使看起來微不足道,尋找痛癢之處并解決。只有動手寫代碼才能真正融會貫通。內(nèi)核版本《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書第3版)》基于Linux2.6內(nèi)核系列。它并不涵蓋早期的版本,當(dāng)然也有一些例外。比如,我們會討論2.4系列內(nèi)核中的一些子系統(tǒng)是如何實(shí)現(xiàn)的,這是因?yàn)楹唵蔚膶?shí)現(xiàn)有助于傳授知識。特別說明的是,本書介紹的是最新的Linux2.6.34內(nèi)核版本。盡管內(nèi)核總在不斷更新,任何努力也難以捕獲這樣一只永不停息的猛獸,但是本書力圖適合于新舊內(nèi)核的開發(fā)者和用戶。雖然本書討論的是2.6.34內(nèi)核,但我也確保了它同樣適用于2.6.32內(nèi)核。后一個(gè)版本往往被各個(gè)Linux發(fā)行版本奉為“企業(yè)版”內(nèi)核,所以我們可以在各種產(chǎn)品線上見到其身影。該版本確實(shí)已經(jīng)開發(fā)了數(shù)年(類似的“長線”版本還有2.6.9、2.6.18和2.6.27等)。讀者范圍《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書第3版)》是寫給那些有志于理解Linux內(nèi)核的軟件開發(fā)者的。本書并不逐行逐字地注解內(nèi)核源代碼,也不是指導(dǎo)開發(fā)驅(qū)動程序或是內(nèi)核API的參考手冊(如果存在標(biāo)準(zhǔn)的內(nèi)核API的話)。本書的初衷是提供足夠多的關(guān)于Linux內(nèi)核設(shè)計(jì)和實(shí)現(xiàn)的信息,希望讀過本書的程序員能夠擁有較為完備的知識,可以真正開始開發(fā)內(nèi)核代碼。無論開發(fā)內(nèi)核是為了興趣還是為了賺錢,我都希望能夠帶領(lǐng)讀者快速走進(jìn)Linux內(nèi)核世界。本書不但介紹了理論而且也討論了具體應(yīng)用,可以滿足不同讀者的需要。全書緊緊圍繞著理論聯(lián)系實(shí)踐,并非一味強(qiáng)調(diào)理論或是實(shí)踐。無論你研究Linux內(nèi)核的動機(jī)是什么,我都希望這本書都能將內(nèi)核的設(shè)計(jì)和實(shí)現(xiàn)分析清楚,起到拋磚引玉的作用。因此,本書覆蓋了從核心內(nèi)核系統(tǒng)的應(yīng)用到內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)等各方面的內(nèi)容。我認(rèn)為這點(diǎn)很重要,值得花工夫討論。例如,第8章討論的是所謂的下半部機(jī)制。本章分別討論了內(nèi)核下半部機(jī)制的設(shè)計(jì)和實(shí)現(xiàn)(核心內(nèi)核開發(fā)者或者學(xué)者會感興趣),隨即便介紹了如何使用內(nèi)核提供的接口實(shí)現(xiàn)你自己的下半部(這對設(shè)備驅(qū)動開發(fā)者可能很有用處)。其實(shí),我認(rèn)為上述兩部分內(nèi)容是相得益彰的,雖然核心內(nèi)核開發(fā)者主要關(guān)注的問題是內(nèi)核內(nèi)部如何工作,但是也應(yīng)該清楚如何使用接口;同樣,如果設(shè)備驅(qū)動開發(fā)者了解了接口背后的實(shí)現(xiàn)機(jī)制,自然也會受益匪淺。這好比學(xué)習(xí)某些庫的API函數(shù)與研究該庫的具體實(shí)現(xiàn)。初看,好像應(yīng)用程序開發(fā)者僅僅需要理解API—我們被灌輸?shù)乃枷胧?,?yīng)該像看待黑盒子一樣看待接口。另外,庫的開發(fā)者也只關(guān)心庫的設(shè)計(jì)與實(shí)現(xiàn),但是我認(rèn)為雙方都應(yīng)該花時(shí)間相互學(xué)習(xí)。能深刻了解操作系統(tǒng)本質(zhì)的應(yīng)用程序開發(fā)者無疑可以更好地利用它。同樣,庫開發(fā)者也決不應(yīng)該脫離基于此庫的應(yīng)用程序,埋頭開發(fā)。因此,我既討論了內(nèi)核子系統(tǒng)的設(shè)計(jì),也討論了它的用法,希望本書能對核心開發(fā)者和應(yīng)用開發(fā)者都有用。我假設(shè)讀者已經(jīng)掌握了C語言,而且對Linux比較熟悉。如果讀者還具有與操作系統(tǒng)設(shè)計(jì)相關(guān)的經(jīng)驗(yàn)和其他計(jì)算機(jī)科學(xué)的概念就更好了。當(dāng)然,我也會盡可能多地解釋這些概念,但如果你仍然不能理解這些知識的話,請看本書最后參考資料中給出的一些關(guān)于操作系統(tǒng)設(shè)計(jì)方面的經(jīng)典書籍。本書很適合在大學(xué)中作為介紹操作系統(tǒng)的輔助教材,與介紹操作系統(tǒng)理論的書相搭配。對于大學(xué)高年級課程或者研究生課程來說,可直接使用本書作為教材。第3版致謝與其他作者一樣,我決非是一個(gè)人躲在山洞里孤苦地寫出這本書來的(那也是一件美差,因?yàn)橛行芟喟椋?。我能最終完成本書原稿是與無數(shù)建議和關(guān)懷分不開的。僅僅一頁紙無法容納我的感激,但我還是要衷心地感謝所有給予我鼓勵(lì)、給予我知識和給予我靈感的朋友和同事。首先我要對為《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書第3版)》付出辛勤勞作的所有編輯表示感謝,尤其要感謝我的組稿編輯MarkTaber,他為這一版的出版從頭到尾傾注了許多心血。還要特別感謝業(yè)務(wù)開發(fā)編輯MichaelThurston和項(xiàng)目組織編輯TonyaSimpso。本版的技術(shù)編輯RobertP.J.Day也是我需要倍加感謝的人,他獨(dú)到的洞察力和準(zhǔn)確的校對使書稿質(zhì)量大大提高。盡管他的工作稱得上完美,但如果書中仍留有錯(cuò)誤,責(zé)任由我承擔(dān)。需要十分感謝的還有AdamBelay、ZackBrown、MartinPool以及ChrisRivera,他們對第1版和第2版所做的一切努力我依然記憶猶新。許多內(nèi)核開發(fā)者為我提供了大力支持,回答了許多問題,還有那些撰寫代碼的人——本書正是由于有了這些代碼,才有了存在的意義。他們是:AndreaArcangeli、AlanCox、GregKroah-Hartman、DaveMiller、PatrickMochel、AndrewMorton、NickPiggin和LinusTorvalds。我要大力感謝我的同事們。他們的創(chuàng)造力和智慧無與倫比,能與他們一起工作其樂無窮。因?yàn)槠?,請諒解我不能列出所有人的名字。但不得不提的是:AlanBlount、JayCrim、ChrisDanis、ChrisDiBona、EricFlatt、MikeLockwood、SanMehat、BrianRogan、BrianSwetland、JonTrowbridge和SteveVinter,感謝他們給予我的支持、知識和友誼!還有許多值得尊敬和熱愛的人,他們是:PaulAmici、MikeyBabbitt、KeithBarbag、JacobBerkman、NatFriedman、DustinHall、JoyceHawkins、MigueldeIcaza、JimmyKrehl、DorisLove、LindaLove、BretteLuck、RandyO扗owd、SalRibaudo和他了不起的媽媽ChrisRivera、CarolynRodon、JoeyShaw、SarahStewart、JeremyVanDoren和他的家人、LuisVilla、SteveWeisberg和他的家人以及HelenWhisnant等。
媒體關(guān)注與評論
能夠把linux內(nèi)核的內(nèi)容在300多頁內(nèi)敘述一遍,本身就是一件高難度的事情。但《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》確實(shí)做到了。《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》很少涉及具體實(shí)現(xiàn),而是把握思想,講解算法,讀者可以學(xué)習(xí)到linux內(nèi)核的知識,而不用糾纏于具體細(xì)節(jié)?!拱曜x者Googol,《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》很適合系統(tǒng)學(xué)習(xí)了OS理論之后直接看代碼詳解又覺得暫且還不夠功力的讀者,它可以帶你由理論學(xué)習(xí)階段逐漸過渡到實(shí)踐階段。這本書對Linux內(nèi)核內(nèi)容的范圍和深度把握得恰到好處。 ——豆瓣讀者 納蘭經(jīng)若
編輯推薦
《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書第3版)》編輯推薦:暢銷圖書新版《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》第3版翻譯版、影印版同步上市,《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書第3版)》詳細(xì)描述Linux內(nèi)核的主要子系統(tǒng)和特點(diǎn),《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書第3版)》涵蓋Linux內(nèi)核從理論到實(shí)踐的方方面面。
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載
Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn) PDF格式下載