Linux內(nèi)核設(shè)計與實現(xiàn)(原書第3版·典藏版) [美]羅伯特·洛夫
定 價:89 元
- 作者:[美]羅伯特·洛夫
- 出版時間:2024/5/1
- ISBN:9787111748793
- 出 版 社:機械工業(yè)出版社
- 中圖法分類:TP316.85
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
本書基于Linux 2.6.34內(nèi)核詳細介紹了Linux內(nèi)核系統(tǒng),覆蓋了從核心內(nèi)核系統(tǒng)的應(yīng)用到內(nèi)核設(shè)計與實現(xiàn)等各方面內(nèi)容。主要內(nèi)容包括:進程管理、進程調(diào)度、時間管理和定時器、系統(tǒng)調(diào)用接口、內(nèi)存尋址、內(nèi)存管理和頁緩存、VFS、內(nèi)核同步以及調(diào)試技術(shù)等。同時本書也涵蓋了Linux 2.6內(nèi)核中頗具特色的內(nèi)容,包括CFS調(diào)度程序、搶占式內(nèi)核、塊I/O層以及I/O調(diào)度程序等。本書采用理論與實踐相結(jié)合的路線,能夠帶領(lǐng)讀者快速走進Linux內(nèi)核世界,真正開發(fā)內(nèi)核代碼。本書適合作為高等院校操作系統(tǒng)課程的教材或參考書,也可供相關(guān)技術(shù)人員參考。
本書作者羅伯特·洛夫(Robert Love)是資深的開源軟件開發(fā)者,也是Linux內(nèi)核核心開發(fā)人員,目前是谷歌云的高級工程總監(jiān)。他在本書分享了在開發(fā)Linux 2.6內(nèi)核過程中頗具價值的知識和經(jīng)驗,使得本書成為講解Linux內(nèi)核設(shè)計的經(jīng)典佳作,填補了Linux內(nèi)核理論和實踐之間的鴻溝。本書譯者陳莉君教授多年來深入研究Linux內(nèi)核相關(guān)理論以及技術(shù),致力于推動Linux在中國的發(fā)展,著譯了多部Linux內(nèi)核方面的著作,曾兩次獲得中國開源軟件推進聯(lián)盟頒發(fā)的“開源杰出貢獻”獎。書中詳細描述了Linux內(nèi)核的設(shè)計與實現(xiàn)以及主要子系統(tǒng)和特點,包括Linux內(nèi)核的設(shè)計、實現(xiàn)和接口。從理論到實踐涵蓋了Linux內(nèi)核的方方面面,可以滿足讀者的各種興趣和需求。內(nèi)核代碼的編寫者、開發(fā)者以及程序開發(fā)人員都可以通過閱讀本書受益,更好理解操作系統(tǒng)原理,并將其應(yīng)用在自己的編碼中以提高效率和生產(chǎn)率。
前 言
在我剛開始有把自己的內(nèi)核開發(fā)經(jīng)驗結(jié)集成冊,撰寫一本書的念頭時,我其實也覺得有點頭緒繁多,不知道該從何下手。我實在不想落入傳統(tǒng)內(nèi)核書籍的窠臼,照貓畫虎地再寫這么一本。不錯,前人著述備矣,但我終歸是要寫出點兒與眾不同的東西來。我的書該如何定位,說實話,這確實讓人頗費思量。
后來,靈感終于浮現(xiàn)出來,我意識到自己可以從一個全新的視角看待這個主題。開發(fā)內(nèi)核是我的工作,同時也是我的嗜好,內(nèi)核就是我的摯愛。這些年來,我不斷搜集與內(nèi)核有關(guān)的奇聞逸事,不斷積攢關(guān)鍵的開發(fā)訣竅。依靠這些日積月累的材料,我可以寫一本關(guān)于開發(fā)內(nèi)核該做什么,更重要的是不該做什么的書籍。從本質(zhì)上說,這本書仍舊是描述Linux內(nèi)核是如何設(shè)計和實現(xiàn)的,但是寫法卻另辟蹊徑,所提供的信息更傾向于實用。通過本書,你就可以做一些內(nèi)核開發(fā)的工作了—并且是使用正確的方法去做。我是一個注重實效的人,因此,這是一本實踐的書,它應(yīng)當有趣、易讀且有用。
我希望讀者可以從這本書中領(lǐng)略到更多Linux內(nèi)核的精妙之處(寫出來的和沒寫出來的),也希望讀者敢于從閱讀本書和讀內(nèi)核代碼開始跨越到開始嘗試開發(fā)可用、可靠且清晰的內(nèi)核代碼。當然如果你僅僅是興致所至,讀書自娛,那也希望你能從中找到樂趣。
從第1版到現(xiàn)在,又過了一段時間,我們再次回到本書,修補遺憾。本版比第1版和第2版內(nèi)容更豐富:修訂、補充并增加了新的內(nèi)容和章節(jié),使其更加完善。本版融合了第2版以來內(nèi)核的各種變化。更值得一提的是,Linux內(nèi)核聯(lián)盟做出決定,近期內(nèi)不進行2.7版內(nèi)核的開發(fā),于是,內(nèi)核開發(fā)者打算繼續(xù)開發(fā)并穩(wěn)定2.6版。這個決定意味深長,而本書從中的最大受益就是在2.6版上可以穩(wěn)定相當長時間。隨著內(nèi)核的成熟,內(nèi)核“快照”才有機會能維持得更久遠一些。本書可作為內(nèi)核開發(fā)的規(guī)范文檔,既認識內(nèi)核的過去,也著眼于內(nèi)核的未來。
使用這本書
開發(fā)Linux內(nèi)核不需要天賦異稟,不需要有什么魔法,連UNIX開發(fā)者普遍長著的絡(luò)腮胡子都不一定要有。內(nèi)核雖然有一些有趣并且獨特的規(guī)則和要求,但是它和其他大型軟件項目相比,并沒有太大差別。像所有的大型軟件開發(fā)一樣,要學(xué)的東西確實不少,但是不同之處在于數(shù)量上的積累,而非本質(zhì)上的區(qū)別。
認真閱讀源碼非常有必要,Linux系統(tǒng)代碼的開放性其實是彌足珍貴的,不要無動于衷地將它擱置一邊,浪費了大好資源。實際上讀了代碼還遠遠不夠,你應(yīng)該鉆研并嘗試著動手改動一些代碼。尋找一個bug然后去修改它,改進你的硬件設(shè)備的驅(qū)動程序,增加新功能—即使看起來微不足道,尋找痛癢之處并解決。只有動手寫代碼才能真正融會貫通。
內(nèi)核版本
本書基于Linux 2.6內(nèi)核系列。它并不涵蓋早期的版本,當然也有一些例外。比如,我們會討論2.4系列內(nèi)核中的一些子系統(tǒng)是如何實現(xiàn)的,這是因為簡單的實現(xiàn)有助于傳授知識。特別說明的是,本書介紹的是Linux 2.6.34內(nèi)核版本。盡管內(nèi)核總在不斷更新,任何努力也難以捕獲這樣一只永不停息的“猛獸”,但是本書力圖適合于新舊內(nèi)核的開發(fā)者和用戶。
雖然本書討論的是2.6.34內(nèi)核,但我也確保了它同樣適用于2.6.32內(nèi)核。后一個版本往往被各個Linux發(fā)行版本奉為“企業(yè)版”內(nèi)核,所以我們可以在各種產(chǎn)品線上見到其身影。該版本確實已經(jīng)開發(fā)了數(shù)年(類似的“長線”版本還有 2.6.9、2.6.18和2.6.27等)。
讀者范圍
本書是寫給那些有志于理解Linux內(nèi)核的軟件開發(fā)者的。本書并不逐行逐字地注解內(nèi)核源代碼,也不是指導(dǎo)開發(fā)驅(qū)動程序或內(nèi)核API的參考手冊(如果存在標準的內(nèi)核API的話)。本書的初衷是提供足夠多的關(guān)于Linux內(nèi)核設(shè)計和實現(xiàn)的信息,希望讀過本書的程序員能夠擁有較為完備的知識,可以真正開始開發(fā)內(nèi)核代碼。無論開發(fā)內(nèi)核是為了興趣還是為了賺錢,我都希望能夠帶領(lǐng)讀者快速走進Linux內(nèi)核世界。本書不但介紹了理論而且也討論了具體應(yīng)用,可以滿足不同讀者的需要。全書緊緊圍繞著理論聯(lián)系實踐,并非一味強調(diào)理論或者實踐。無論你研究Linux內(nèi)核的動機是什么,我都希望這本書能將內(nèi)核的設(shè)計和實現(xiàn)分析清楚,起到拋磚引玉的作用。
因此,本書覆蓋了從核心內(nèi)核系統(tǒng)的應(yīng)用到內(nèi)核設(shè)計與實現(xiàn)等各方面的內(nèi)容。我認為這點很重要,值得花工夫討論。例如,第8章討論的是所謂的下半部機制。本章分別討論了內(nèi)核下半部機制的設(shè)計和實現(xiàn)(核心內(nèi)核開發(fā)者或者學(xué)者會感興趣),隨即便介紹了如何使用內(nèi)核提供的接口實現(xiàn)你自己的下半部(這對設(shè)備驅(qū)動開發(fā)者可能很有用處)。其實,我認為上述兩部分內(nèi)容是相得益彰的,雖然核心內(nèi)核開發(fā)者主要關(guān)注的問題是內(nèi)核內(nèi)部如何工作,但是也應(yīng)該清楚如何使用接口;同樣,如果設(shè)備驅(qū)動開發(fā)者了解了接口背后的實現(xiàn)機制,自然也會受益匪淺。
這好比學(xué)些庫的API函數(shù)與研究該庫的具體實現(xiàn)。初看,好像應(yīng)用程序開發(fā)者僅僅需要理解API—我們被灌輸?shù)乃枷胧菓?yīng)該像看待黑盒子一樣看待接口,庫的開發(fā)者也只關(guān)心庫的設(shè)計與實現(xiàn),但是我認為雙方都應(yīng)該花時間相互學(xué)習(xí)。能深刻了解操作系統(tǒng)本質(zhì)的應(yīng)用程序開發(fā)者無疑可以更好地利用它。同樣,庫開發(fā)者也不應(yīng)該脫離基于
羅伯特·洛夫(Robert Love)資深的開源軟件開發(fā)者,很早就開始使用Linux。目前是谷歌云的高級工程總監(jiān),在那里構(gòu)建了全球范圍的網(wǎng)絡(luò)產(chǎn)品。在此之前,他曾是Toast的工程副總裁,開發(fā)Android移動平臺內(nèi)核的團隊成員,Novell公司Linux桌面系統(tǒng)首席架構(gòu)師。
他參與的內(nèi)核項目包括搶占式內(nèi)核、進程調(diào)度器、內(nèi)核事件層、通知機制、VM改進,以及設(shè)備驅(qū)動程序。他曾是Linux Journal雜志的編輯。除本書之外,他還著有Linux System Programming和Linux in a Nutshell。
目 錄
譯者序
序 言
前 言
第3版致謝
作者簡介
第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.2 安裝內(nèi)核源代碼10
2.1.3 使用補丁11
2.2 內(nèi)核源碼樹11
2.3 編譯內(nèi)核12
2.3.1 配置內(nèi)核12
2.3.2 減少編譯的垃圾信息14
2.3.3 衍生多個編譯作業(yè) 14
2.3.4 安裝新內(nèi)核14
2.4 內(nèi)核開發(fā)的特點15
2.4.1 無libc庫抑或無標準頭文件15
2.4.2 GNU C16
2.4.3 沒有內(nèi)存保護機制18
2.4.4 不要輕易在內(nèi)核中使用浮點數(shù)18
2.4.5 容積小而固定的棧18
2.4.6 同步和并發(fā)18
2.4.7 可移植性的重要性19
2.5 小結(jié)19
第3章 進程管理20
3.1 進程20
3.2 進程描述符及任務(wù)結(jié)構(gòu) 21
3.2.1 分配進程描述符22
3.2.2 進程描述符的存放23
3.2.3 進程狀態(tài)23
3.2.4 設(shè)置當前進程狀態(tài)25
3.2.5 進程上下文25
3.2.6 進程家族樹25
3.3 進程創(chuàng)建26
3.3.1 寫時拷貝27
3.3.2 fork()27
3.3.3 vfork()28
3.4 線程在Linux中的實現(xiàn)28
3.4.1 創(chuàng)建線程29
3.4.2 內(nèi)核線程30
3.5 進程終結(jié)31
3.5.1 刪除進程描述符32
3.5.2 孤兒進程造成的進退維谷32
3.6 小結(jié)34
第4章 進程調(diào)度35
4.1 多任務(wù)35
4.2 Linux 的進程調(diào)度36
4.3 策略36
4.3.1 I/O消耗型和處理器消耗型的
進程36
4.3.2 進程優(yōu)先級37
4.3.3 時間片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)中的進程調(diào)度40
4.4.3 公平調(diào)度41
4.5 Linux調(diào)度的實現(xiàn)42
4.5.1 時間記賬42
4.5.2 進程選擇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 實時調(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 放棄處理器時間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 指定恰當?shù)南到y(tǒng)調(diào)用60
5.4.2 參數(shù)傳遞60
5.5 系統(tǒng)調(diào)用的實現(xiàn)61
5.5.1 實現(xiàn)系統(tǒng)調(diào)用61
5.5.2 參數(shù)驗證62
5.6 系統(tǒng)調(diào)用上下文64
5.6.1 綁定一個系統(tǒng)調(diào)用的最后步驟65
5.6.2 從用戶空間訪問系統(tǒng)調(diào)用67
5.6.3 為什么不通過系統(tǒng)調(diào)用的
方式實現(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)核中的實現(xiàn)71
6.1.5 操作鏈表73
6.1.6 遍歷鏈表75
6.2 隊列78
6.2.1 kfifo79
6.2.2 創(chuàng)建隊列79
6.2.3 推入隊列數(shù)據(jù)79
6.2.4 摘取隊列數(shù)據(jù)80
6.2.5 獲取隊列長度80
6.2.6 重置和撤銷隊列80
6.2.7 隊列使用舉例 81
6.3 映射 81
6.3.1 初始化一個idr82
6.3.2 分配一個新的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 時間復(fù)雜度89
6.7 小結(jié) 90
第7章 中斷和中斷處理91
7.1 中斷91
7.2 中斷處理程序92
7.3 上半部與下半部的對比93
7.4 注冊中斷處理程序93
7.4.1 中斷處理程序標志94
7.4.2 一個中斷例子95
7.4.3 釋放中斷處理程序95
7.5 編寫中斷處理程序96
7.5.1 共享的中斷處理程序97
7.5.2 中斷處理程序?qū)嵗?7
7.6 中斷上下文99
7.7 中斷處理機制的實現(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 軟中斷的實現(xiàn)111
8.2.2 使用軟中斷113
8.3 tas