-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

Linux內核探秘:深入解析文件系統和設備驅動的架構與設計

( 簡體 字)
作者:高劍林 著類別:1. -> 作業系統 -> Linux
譯者:
出版社:機械工業出版社Linux內核探秘:深入解析文件系統和設備驅動的架構與設計 3dWoo書號: 37378
詢問書籍請說出此書號!

缺書
不接受訂購

出版日:12/1/2013
頁數:219
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
不接受訂購
ISBN:9787111445852
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

寫這本書

目前市面上關于Linux內核方面的書籍可以分為兩類,一類是學院派書籍,其中比較有名的包括《深入理解Linux內核》(ULK)等;一類是國內特有的培訓教材。大體而言,學院派的書籍體系一般很完整,在廣度和深度上都有完善的闡述。可惜也正因為它的完整、復雜和龐大,使得閱讀學院派的書籍往往是個艱巨的任務。ULK這本書已經有八百頁的體量,還有很多細節知識沒有講述,而早期的《內核情景分析》一書更是達到上千頁的體量。以至于業界公認內核的學習曲線最陡峭,學習難度最大。

而本書是從工業界角度出發,為工業界使用而寫。比較關注計算機科學方面進展的工程師,應可以意識到計算機科學和計算機工業是兩個不同的領域。前者注重創新和理論完備,后者注重效率和實用。從效率和實用的角度,需要在降低學習難度的基礎上提供相對體系化的結構,這就必須對龐大復雜的內核進行分解和抽取,這也正是本書試圖將內核分解為基礎層和應用層的原因。

這些年來,筆者先后面試過上百位內核工程師,組織過多次講座或者交流會議,和國內多家公司的一流工程師有過深入交流。總體而言,國內內核應用和開發的水平處于非常低的水平,這一方面表現在理解內核的技術人員在國內總體上不多,即使是專業的內核的工程師,對內核的一些基本問題理解不清甚至理解錯誤的也不在少數;另一方面是大多數人認為內核在工作中用處不大,很難發揮價值。

針對第一個問題,筆者做過調查問卷,通過調查發現,公認學習內核最大的問題就是內核代碼的難懂和跳躍。從一個函數跳到另一個函數,然后又跳到下一個函數,對執行的邏輯難以理解。跳躍超過三次,基本就難以繼續,只能放棄。第二個問題和第一個問題強相關。因為了解不夠系統,很難形成整體的內核執行邏輯。而實際工作中碰到的問題總是千變萬化,個人了解的一塊未必能碰到。比如一個文件系統只讀問題,是內核VFS層的問題?是文件系統自身?還是塊設備或者硬盤的問題?如果不能形成清晰的視圖,就很難有針對性的調試和改進。

按照方法論的觀點,通常人類的學習過程是從易到難、從部分到整體、從已知到未知。而對內核的學習有其特殊之處,內核幾乎是九十度的學習曲線,極難找到入門的路徑,更別說快速流暢地閱讀內核代碼了。從那時起,筆者開始對內核進行整理,希望能找到一條學習的路徑,在不斷探索過程中,逐漸形成一份文檔,然后通過一些培訓活動驗證了其有效,最終形成了本書。

本書可以歸納為兩個思路。一個是對內核代碼的分類。筆者把內核分為基礎部分和應用部分。內核中的內存管理、任務調度和中斷異常處理歸為基礎部分。而文件系統、設備管理和驅動歸為應用部分。打開一份完整的內核代碼統計一下,應用部分占了絕大多數,龐大復雜,但冗余很多,很多代碼具有相似性;而基礎部分則是短小精悍。應用部分經常要調用基礎部分提供的內存管理、任務調度等服務。為了快速理解基礎部分,首先要整理基礎部分的服務,理解在內核中如何使用基礎部分的服務。

第二個思路是把內核分為內核架構和內核實現。內核架構是內核中通用的、具普遍性的層次,比如塊設備、字符設備、總線、文件系統的VFS層等。理解了內核架構,就對內核有了整體上的掌握,就能了解內核設計者的思路,進而快速流暢地閱讀內核代碼。但即使理解了內核架構,也還有很多具體問題要攻克。比如驅動中一個寄存器的使用、設備鏈路狀態如何檢測、文件系統如何使用barrier I/O、同步和異步I/O的區別等。這是需要開發人員仔細研讀和琢磨的。本書試圖歸納整理出內核的常用架構層,這些架構層具有舉一反三的作用,它們構成了Linux內核的骨架。

發展到今天,內核已經非常龐大和復雜。本書希望通過一些架構層次代碼的分析,結合簡單的例子,幫助讀者理解內核的整體框架。當碰到內核問題或者需要加入某些內核功能或者修改某些實現時,可以迅速流暢地閱讀相關代碼,確定自己的方案,而不至于茫然無措。而對于細節的實現,則需要程序員根據自己的需求來設計。

關于內核版本,本書用的是2.6.18版。內核有一套自己的不兼容策略,不同內核版本之間經常不能編譯,至于函數消失和數據結構修改更是家常便飯。所以我們只能選擇一個版本作為基礎。

閱讀內核代碼前的準備:下載一份完整的內核,Linux內核的官方網站是http://www.kernel.org,這里可以下載到各個版本的內核;再準備一個好的代碼閱讀軟件,因為內核代碼經常要前后關聯閱讀,所以需要具有代碼工程管理的軟件,強烈推薦source insight,這是國內應用很廣的一個軟件。

另外,本書已經假設讀者能編譯和安裝模塊,并且具有計算機基本結構的知識。此外,有一臺已安裝了Linux系統的計算機或者虛擬機,并且經常實戰練習。

由于筆者水平有限,而且從架構層次分析內核代碼,可用來參考的資料很少,希望廣大讀者能多提意見,共同推進中國的技術水平。

任何書籍都不能替代讀者自己對內核實際代碼的研究和學習。但如果沒有書籍,浩如云煙的內核代碼讓有志學習者茫然,而低效率地一點點啃代碼也會浪費大量的時間。書籍的作用是帶領讀者入門,讀者需要盡快轉入自我學習階段,對需要的部分代碼自行分析和研究。

讀者對象

本書適合以下讀者閱讀參考:

大專院校在校學生;

對系統內核感興趣,有志于從事內核研發的人員;

從事驅動開發的工程師;

從事操作系統內核方面工作的工程師;

負責Linux系統調試和優化的技術人員。

如何閱讀本書

本書將整個內核分為基礎層和應用層。這種劃分大大減少了閱讀內核的難度,但是仍然需要對基礎層有全面正確的理解。本書第1章介紹了內核的基礎層,讀者應該多做一些實踐練習,才能加深理解。

第2章是本書提綱挈領的一章,重點介紹了文件系統的基礎知識。文件系統在應用層的位置非常重要,因此只有掌握了文件系統的重要概念、理解了基本的操作過程才能為整體理解內核打下良好的基礎。

第3∼9章是關于設備的章節。建議讀者結合具體的設備,從設備到總線再到驅動,逐步深入。本書的章節安排遵循從易到難、代碼結合實例的方式,相信讀者可以比較順暢地閱讀并理解。

第10∼13章,再次對文件系統的讀寫和內核通用塊層進行闡述。閱讀的過程中,讀者若能結合實際做一些小的程序,則可以幫助迅速提升能力。比如自己實現內核的I/O路徑或者實現一個模擬的塊設備系統,實踐中應用才是能力提升的最佳途徑。

勘誤和支持

由于筆者的水平有限,加之編寫時間倉促,書中難免會出現一些錯誤或者不準確的地方,懇請讀者批評指正。書中的全部源文件可以從華章網站下載。如果你有更多的寶貴意見,也歡迎發送郵件至郵箱easyblue99@hotmail.com,期待能夠得到你們的真摯反饋。

致謝

感謝IBM公司的小強、中興的老謝、百度的子旬、索尼的大A以及淘寶、Intel、微軟、搜狐、新浪等公司的各位朋友。與你們的一次次討論澄清了很多概念和問題,使我受益良多。

感謝機械工業出版社華章公司的編輯白宇,是你認真審核每一章的內容,提高了書稿的質量。編輯是個清苦的職業,遠遠談不上令人羨慕,但不論多少生活的煩惱,白女士總是耐心修改,職業精神令人敬佩。

感謝我的親人們,特別要感謝我的母親,她是中國核工業的早期建設者,在艱難中養育了三個孩子,謹以此書獻給我的母親楊玉芳女士。感謝我的妻子和女兒,你們是我永遠的動力之源。
內容簡介:

從工業需求角度出發,注重效率和實用性,是幫助內核研發及調試、驅動開發等領域工程師正確認識并高效利用Linux內核的難得佳作!作者是騰訊公司資深的Linux內核專家和存儲系統專家,在該領域工作和研究的10余年間,面試了數百位Linux內核工程師,深知學習Linux內核過程中經常遇到的困惑,以及在工作中容易犯的錯誤。基于這些原因作者撰寫了本書。本書出發點和寫作方式可謂獨辟蹊徑,將Linux內核分為兩個維度,一是基礎部分和應用部分,二是內核架構和內核實現,將兩個維有機統一,深入分析了Linux內核的文件系統、設備驅動的架構設計與實現原理。

全書在邏輯上分為三部分:第一部分(第1∼2章)首先將內核層劃分為基礎層和應用層,講解了基礎層包含的服務和數據結構,以及應用層包含的各種功能,然后對文件系統的架構進行了提綱挈領的介紹,為讀者學習后面的知識打下基礎;第二部分(第3∼9章)從設備到總線到驅動,逐步深入,剖析了設備的總體架構、為設備服務的特殊文件系統sysfs、字符設備和input設備、platform總線、serio總線、PCI總線、塊設備的實現原理和工作機制;第三部分(第10∼13章)對文件系統的讀寫機制進行了深入分析,最后通過一個真實文件系統ext2,復習本書所有知識點。
目錄:

第1章 內核的基礎層和應用層 1

1.1 內核基礎層提供的服務 1

1.1.1 內核中使用內存 2

1.1.2 內核中的任務調度 2

1.1.3 軟中斷和tasklet 3

1.1.4 工作隊列 4

1.1.5 自旋鎖 5

1.1.6 內核信號量 5

1.1.7 原子變量 5

1.2 內核基礎層的數據結構 6

1.2.1 雙向鏈表 6

1.2.2 hash鏈表 6

1.2.3 單向鏈表 7

1.2.4 紅黑樹 7

1.2.5 radix樹 7

1.3 內核應用層 8

1.4 從Linux內核源碼結構縱覽內核 9

1.5 內核學習和應用的四個階段 10

1.6 本章小結 11

第2章 文件系統 12

2.1 文件系統的基本概念 12

2.1.1 什么是VFS 13

2.1.2 超級塊super_block 13

2.1.3 目錄項dentry 14

2.1.4 索引節點inode 15

2.1.5 文件 17

2.2 文件系統的架構 17

2.2.1 超級塊作用分析 17

2.2.2 dentry作用分析 18

2.2.3 inode作用分析 20

2.2.4 文件作用分析 21

2.3 從代碼層次深入分析文件系統 21

2.3.1 一個最簡單的文件系統aufs 22

2.3.2 文件系統如何管理目錄和文件 26

2.3.3 文件系統的掛載過程 38

2.3.4 文件打開的代碼分析 42

2.4 本章小結 59

第3章 設備的概念和總體架構 60

3.1 設備的配置表 60

3.2 訪問設備寄存器和設備內存 61

3.3 設備中斷和DMA 61

3.4 總線對設備的掃描 62

3.5 設備驅動管理 62

3.6 本章小結 62

第4章 為設備服務的特殊文件系統sysfs 63

4.1 文件和目錄的創建 63

4.1.1 sysfs文件系統的初始化 64

4.1.2 sysfs文件系統目錄的創建 64

4.1.3 普通文件的創建 68

4.2 sysfs文件的打開操作 69

4.2.1 real_lookup函數詳解 70

4.2.2 為文件創建inode結構 70

4.2.3 為dentry結構綁定屬性 71

4.2.4 調用文件系統中的open函數 72

4.3 sysfs文件的讀寫 74

4.3.1 讀文件的過程分析 74

4.3.2 寫文件的過程分析 75

4.4 kobject結構 76

4.4.1 kobject和kset的關系 76

4.4.2 kobject實例:總線的注冊 77

4.5 本章小結 79

第5章 字符設備和input設備 80

5.1 文件如何變成設備 80

5.1.1 init_special_inode函數 80

5.1.2 def_chr_fops結構 81

5.2 input設備的注冊 82

5.2.1 主從設備號 83

5.2.2 把input設備注冊到系統 84

5.2.3 設備區間的登記 85

5.2.4 注冊字符設備 86

5.2.5 打開input設備 87

5.3 input設備架構 88

5.3.1 注冊input設備的驅動 88

5.3.2 匹配input管理的設備和驅動 89

5.3.3 注冊input設備 90

5.4 本章小結 92

第6章 platform總線 93

6.1 從驅動發現設備的過程 93

6.1.1 驅動的初始化 93

6.1.2 注冊驅動 94

6.1.3 為總線增加一個驅動 95

6.1.4 驅動加載 95

6.1.5 遍歷總線上已經掛載的設備 96

6.2 從設備找到驅動的過程 98

6.2.1 注冊設備和總線類型 98

6.2.2 注冊設備的資源 99

6.2.3 增加一個設備對象 100

6.3 本章小結 102

第7章 serio總線 103

7.1 什么是總線適配器 103

7.2 向serio總線注冊設備 103

7.2.1 注冊端口登記事件 104

7.2.2 遍歷總線的驅動 106

7.2.3 注冊input設備 109

7.3 虛擬鍵盤驅動 110

7.3.1 鍵盤驅動的初始化 110

7.3.2 與設備建立連接 111

7.3.3 啟動鍵盤設備 111

7.3.4 輸入設備和主機系統之間的事件 112

7.4 鍵盤中斷 112

7.4.1 q40kbd設備的中斷處理 113

7.4.2 serio總線的中斷處理 113

7.4.3 驅動提供的中斷處理 113

7.5 本章小結 116

第8章 PCI總線 117

8.1 深入理解PCI總線 117

8.1.1 PCI設備工作原理 117

8.1.2 PCI總線域 118

8.1.3 PCI資源管理 118

8.1.4 PCI配置空間讀取和設置 119

8.2 PCI設備掃描過程 120

8.2.1 掃描0號總線 120

8.2.2 掃描總線上的PCI設備 121

8.2.3 掃描多功能設備 124

8.2.4 掃描單個設備 125

8.2.5 掃描設備信息 125

8.3 本章小結 128

第9章 塊設備 129

9.1 塊設備的架構 129

9.1.1 塊設備、磁盤對象和隊列 129

9.1.2 塊設備和通用磁盤對象的綁定 130

9.1.3 塊設備的隊列和隊列處理函數 131

9.2 塊設備創建的過程分析 132

9.2.1 nbd驅動的初始化 132

9.2.2 為通用磁盤對象創建隊列成員 133

9.2.3 將通用磁盤對象加入系統 134

9.3 塊設備文件系統 135

9.3.1 塊設備文件系統的初始化 135

9.3.2 塊設備文件系統的設計思路 136

9.4 塊設備的打開流程 136

9.4.1 獲取塊設備對象 137

9.4.2 執行塊設備的打開流程 140

9.5 本章小結 142

第10章 文件系統讀寫 143

10.1 page cache機制 143

10.1.1 buffer I/O和direct I/O 143

10.1.2 buffer head和塊緩存 143

10.1.3 page cache的管理 144

10.1.4 page cache的狀態 145

10.2 文件預讀 146

10.3 文件鎖 146

10.4 文件讀過程代碼分析 147

10.5 讀過程返回 161

10.6 文件寫過程代碼分析 162

10.7 本章小結 169

第11章 通用塊層和scsi層 170

11.1 塊設備隊列 170

11.1.1 scsi塊設備隊列處理函數 170

11.1.2 電梯算法和對象 171

11.2 硬盤HBA抽象層 172

11.3 I/O的順序控制 173

11.4 I/O調度算法 173

11.4.1 noop調度算法 173

11.4.2 deadline調度算法 174

11.5 I/O的處理過程 178

11.5.1 I/O插入隊列的過程分析 178

11.5.2 I/O出隊列的過程分析 186

11.5.3 I/O返回路徑 194

11.6 本章小結 203

第12章 內核回寫機制 204

12.1 內核的觸發條件 204

12.2 內核回寫控制參數 204

12.3 定時器觸發回寫 205

12.3.1 啟動定時器 205

12.3.2 執行回寫操作 207

12.3.3 檢查需要回寫的頁面 208

12.3.4 回寫超級塊內的inode 209

12.4 平衡寫 213

12.4.1 檢查直接回寫的條件 214

12.4.2 回寫系統臟頁面的條件 215

12.4.3 檢查計算機模式 216

12.5 本章小結 216

第13章 一個真實文件系統ext2 217

13.1 ext2的硬盤布局 217

13.2 ext2文件系統目錄樹 218

13.3 ext2文件內容管理 219

13.4 ext2文件系統讀寫 219

13.5 本章小結 219
序: