《Linux核心設計與實現(原書第3版)》是2011年機械工業出版社出版的圖書,作者是Robert Love 。
基本介紹
- 書名:Linux核心設計與實現(原書第3版)
- 作者:(美)Robert Love
- 譯者:陳莉君、康華
- ISBN:9787111338291
- 出版社:機械工業出版社
- 出版時間:2011年5月
- 開本:16開
內容簡介,目錄,
內容簡介
《linux核心設計與實現(原書第3版)》詳細描述了linux核心的設計與實現。核心代碼的編寫者、開發者以及程式開發人員都可以通過閱讀本書受益,他們可以更好理解作業系統原理,並將其套用在自己的編碼中以提高效率和生產率。
本書詳細描述了linux核心的主要子系統和特點,包括linux核心的設計、實現和接口。從理論到實踐涵蓋了linux核心的方方面面,可以滿足讀者的各種興趣和需求。
作者robert love是一位linux核心核心開發人員,他分享了在開發linux 2.6核心過程中頗具價值的知識和經驗。本書的主題包括進程管理、進程調度、時間管理和定時器、系統調用接口、記憶體定址、記憶體管理和頁快取、vfs、核心同步、移植性相關的問題以及調試技術。同時本書也涵蓋了linux 2.6核心中頗具特色的內容,包括cfs調度程式、搶占式核心、塊i/o層以及i/o調度程式。
《linux核心設計與實現(原書第3版)》新增內容包括:
增加一章專門描述核心數據結構
詳細描述中斷處理程式和下半部機制
擴充虛擬記憶體和記憶體分配的內容
調試linux核心的技巧
核心同步和鎖機制的深度描述
提交核心補丁以及參與linux核心社區的建設性建議
目錄
《linux核心設計與實現(原書第3版)》
譯者序
序言
前言
作者簡介
第1章 linux核心簡介1
1.1 unix的歷史1
1.2 追尋linus足跡:linux簡介2
1.3 作業系統和核心簡介3
1.4 linux核心和傳統unix核心的比較5
1.5 linux核心版本7
1.6 linux核心開發者社區8
1.7 小結8
第2章 從核心出發10
2.1 獲取核心源碼10
2.1.1 使用git10
2.1.1 安裝核心原始碼10
2.1.3 使用補丁11
2.2 核心源碼樹11
2.3 編譯核心12
.2.3.1 配置核心12
2.3.2 減少編譯的垃圾信息14
2.3.3 衍生多個編譯作業 14
2.3.4 安裝新核心14
2.4 核心開發的特點15
2.4.1 無libc庫抑或無標準頭檔案15
2.4.2 gnu c16
2.4.3 沒有記憶體保護機制18
2.4.4 不要輕易在核心中使用浮點數18
2.4.5 容積小而固定的棧18
2.4.6 同步和並發18
2.4.7 可移植性的重要性19
2.5 小結19
第3章 進程管理20
3.1 進程20
3.2 進程描述符及任務結構 21
3.2.1 分配進程描述符22
3.2.2 進程描述符的存放23
3.2.3 進程狀態23
3.2.4 設定當前進程狀態25
3.2.5 進程上下文25
3.2.6 進程家族樹25
3.3 進程創建26
3.3.1 寫時拷貝27
3.3.2 fork()27
3.3.3 vfork()28
3.4 執行緒在linux中的實現28
3.4.1 創建執行緒29
3.4.2 核心執行緒30
3.5 進程終結31
3.5.1 刪除進程描述符32
3.5.2 孤兒進程造成的進退維谷32
3.6 小結34
第4章 進程調度35
4.1 多任務35
4.2 linux 的進程調度36
4.3 策略36
4.3.1 i/o消耗型和處理器消耗型的進程36
4.3.2 進程優先權37
4.3.3 時間片38
4.3.4 調度策略的活動38
4.4 linux調度算法39
4.4.1 調度器類39
4.4.2 unix 系統中的進程調度40
4.4.3 公平調度41
4.5 linux調度的實現42
4.5.1 時間記賬42
4.5.2 進程選擇44
4.5.3 調度器入口48
4.5.4 睡眠和喚醒49
4.6 搶占和上下文切換51
4.6.1 用戶搶占53
4.6.2 核心搶占53
4.7 實時調度策略54
4.8 與調度相關的系統調用54
4.8.1 與調度策略和優先權相關的系統調用55
4.8.2 與處理器綁定有關的系統調用55
4.8.3 放棄處理器時間56
4.9 小結56
第5章 系統調用57
5.1 與核心通信57
5.2 api、posix和c庫57
5.3 系統調用58
5.3.1 系統調用號59
5.3.2 系統調用的性能59
5.4 系統調用處理程式60
5.4.1 指定恰當的系統調用60
5.4.2 參數傳遞60
5.5 系統調用的實現61
5.5.1 實現系統調用61
5.5.2 參數驗證62
5.6 系統調用上下文64
5.6.1 綁定一個系統調用的最後步驟65
5.6.2 從用戶空間訪問系統調用67
5.6.3 為什麼不通過系統調用的方式實現68
5.7 小結68
第6章 核心數據結構69
6.1 鍊表69
6.1.1 單向鍊表和雙向鍊表69
6.1.2 環形鍊表70
6.1.3 沿鍊表移動71
6.1.4 linux 核心中的實現71
6.1.5 操作鍊表73
6.1.6 遍歷鍊表75
6.2 佇列78
6.2.1 kfifo79
6.2.2 創建佇列79
6.2.3 推入佇列數據79
6.2.4 摘取佇列數據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 數據結構以及選擇 87
6.6 算法複雜度88
6.6.1 算法88
6.6.2 大o 符號88
6.6.3 大θ符號89
6.6.4 時間複雜度89
6.7 小結 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 中斷處理程式實例97
7.6 中斷上下文99
7.7 中斷處理機制的實現100
7.8 /proc/interrupts102
7.9 中斷控制103
7.9.1 禁止和激活中斷103
7.9.2 禁止指定中斷線105
7.9.3 中斷系統的狀態105
7.10 小結106
第8章 下半部和推後執行的工作107
8.1 下半部107
8.1.1 為什麼要用下半部108
8.1.2 下半部的環境108
8.2 軟中斷110
8.2.1 軟中斷的實現111
8.2.2 使用軟中斷113
8.3 tasklet114
8.3.1 tasklet的實現114
8.3.2 使用tasklet116
8.3.3 老的bh機制119
8.4 工作佇列120
8.4.1 工作佇列的實現121
8.4.2 使用工作佇列124
8.4.3 老的任務佇列機制126
8.5 下半部機制的選擇127
8.6 在下半部之間加鎖128
8.7 禁止下半部128
8.8 小結129
第9章 核心同步介紹131
9.1 臨界區和競爭條件131
9.1.1 為什麼我們需要保護132
9.1.2 單個變數133
9.2 加鎖134
9.2.1 造成並發執行的原因135
9.2.2 了解要保護些什麼136
9.3 死鎖137
9.4 爭用和擴展性138
9.5 小結140
第10章 核心同步方法141
10.1 原子操作141
10.1.1 原子整數操作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 計數信號量和二值信號量153
10.4.2 創建和初始化信號量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:大核心鎖159
10.9 順序鎖160
10.10 禁止搶占161
10.11 順序和屏障162
10.12 小結165
第11章 定時器和時間管理166
11.1 核心中的時間概念166
11.2 節拍率:hz167
11.2.1 理想的hz值168
11.2.2 高hz的優勢169
11.2.3 高hz的劣勢169
11.3 jiffies170
11.3.1 jiffies的內部表示171
11.3.2 jiffies 的迴繞172
11.3.3 用戶空間和hz173
11.4 硬時鐘和定時器174
11.4.1 實時時鐘174
11.4.2 系統定時器174
11.5 時鐘中斷處理程式174
11.6 實際時間176
11.7 定時器178
11.7.1 使用定時器178
11.7.2 定時器競爭條件180
11.7.3 實現定時器180
11.8 延遲執行181
11.8.1 忙等待181
11.8.2 短延遲182
11.8.3 schedule_timeout()183
11.9 小結185
第12章 記憶體管理186
12.1 頁186
12.2 區187
12.3 獲得頁189
12.3.1 獲得填充為0的頁190
12.3.2 釋放頁191
12.4 kmalloc()191
12.4.1 gfp_mask標誌192
12.4.2 kfree()195
12.5 vmalloc()196
12.6 slab層197
12.6.1 slab層的設計198
12.6.2 slab分配器的接口200
12.7 在棧上的靜態分配203
12.7.1 單頁核心棧203
12.7.2 在棧上光明正大地工作203
12.8 高端記憶體的映射204
12.8.1 永久映射204
12.8.2 臨時映射204
12.9 每個cpu的分配205
12.10 新的每個cpu接口206
12.10.1 編譯時的每個cpu數據206
12.10.2 運行時的每個cpu數據207
12.11 使用每個cpu數據的原因208
12.12 分配函式的選擇209
12.13 小結209
第13章 虛擬檔案系統210
13.1 通用檔案系統接口210
13.2 檔案系統抽象層211
13.3 unix檔案系統212
13.4 vfs 對象及其數據結構213
13.5 超級塊對象214
13.6 超級塊操作215
13.7 索引節點對象217
13.8 索引節點操作219
13.9 目錄項對象222
13.9.1 目錄項狀態222
13.9.2 目錄項快取223
13.10 目錄項操作224
13.11 檔案對象225
13.12 檔案操作226
13.13 和檔案系統相關的數據結構230
13.14 和進程相關的數據結構232
13.15 小結233
第14章 塊i/o層234
14.1 剖析一個塊設備234
14.2 緩衝區和緩衝區頭235
14.3 bio結構體237
14.3.1 i/o向量238
14.3.2 新老方法對比239
14.4 請求佇列240
14.5 i/o調度程式240
14.5.1 i/o調度程式的工作241
14.5.2 linus 電梯241
14.5.3 最終期限i/o調度程式242
14.5.4 預測i/o調度程式244
14.5.5 完全公正的排隊i/o調度程式244
14.5.6 空操作的i/o調度程式245
14.5.7 i/o調度程式的選擇245
14.6 小結246
第15章 進程地址空間247
15.1 地址空間247
15.2 記憶體描述符248
15.2.1 分配記憶體描述符249
15.2.2 撤銷記憶體描述符250
15.2.3 mm_struct 與核心執行緒250
15.3 虛擬記憶體區域251
15.3.1 vma標誌251
15.3.2 vma 操作253
15.3.3 記憶體區域的樹型結構和記憶體區域的鍊表結構254
15.3.4 實際使用中的記憶體區域254
15.4 操作記憶體區域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():創建地址區間258
15.6 mummap()和do_mummap():刪除地址區間259
15.7 頁表260
15.8 小結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 緩衝區高速快取268
16.4 flusher執行緒268
16.4.1 膝上型計算機模式270
16.4.2 歷史上的bdflush、kupdated 和pdflush270
16.4.3 避免擁塞的方法:使用多執行緒271
16.5 小結271
第17章 設備與模組273
17.1 設備類型273
17.2 模組274
17.2.1 hello,world274
17.2.2 構建模組275
17.2.3 安裝模組277
17.2.4 產生模組依賴性277
17.2.5 載入模組278
17.2.6 管理配置選項279
17.2.7 模組參數280
17.2.8 導出符號表282
17.3 設備模型283
17.3.1 kobject283
17.3.2 ktype284
17.3.3 kset285
17.3.4 kobject、ktype和kset的相互關係285
17.3.5 管理和操作kobject286
17.3.6 引用計數287
17.4 sysfs288
17.4.1 sysfs中添加和刪除kobject 290
17.4.2 向sysfs中添加檔案291
17.4.3 核心事件層293
17.5 小結294
第18章 調試295
18.1 準備開始295
18.2 核心中的bug296
18.3 通過列印來調試296
18.3.1 健壯性296
18.3.2 日誌等級297
18.3.3 記錄緩衝區298
18.3.4 syslogd和klogd298
18.3.5 從printf()到printk()的轉換298
18.4 oops298
18.4.1 ksymoops300
18.4.2 kallsyms300
18.5 核心調試配置選項301
18.6 引發bug並列印信息301
18.7 神奇的系統請求鍵302
18.8 核心調試器的傳奇303
18.8.1 gdb303
18.8.2 kgdb304
18.9 探測系統304
18.9.1 用uid作為選擇條件304
18.9.2 使用條件變數305
18.9.3 使用統計量305
18.9.4 重複頻率限制305
18.10 用二分查找法找出引發罪惡的變更306
18.11 使用git進行二分搜尋307
18.12 當所有的努力都失敗時:社區308
18.13 小結308
第19章 可移植性309
19.1 可移植作業系統309
19.2 linux移植史310
19.3 字長和數據類型311
19.3.1 不透明類型313
19.3.2 指定數據類型314
19.3.3 長度明確的類型314
19.3.4 char型的符號問題315
19.4 數據對齊315
19.4.1 避免對齊引發的問題316
19.4.2 非標準類型的對齊316
19.4.3 結構體填補316
19.5 位元組順序318
19.6 時間319
19.7 頁長度320
19.8 處理器排序320
19.9 smp、核心搶占、高端記憶體321
19.10 小結321
第20章 補丁、開發和社區322
20.1 社區322
20.2 linux編碼風格322
20.2.1 縮進323
20.2.2 switch 語句323
20.2.3 空格324
20.2.4 花括弧325
20.2.5 每行代碼的長度326
20.2.6 命名規範326
20.2.7 函式326
20.2.8 注釋326
20.2.9 typedef327
20.2.10 多用現成的東西328
20.2.11 在源碼中減少使用ifdef328
20.2.12 結構初始化328
20.2.13 代碼的事後修正329
20.3 管理系統329
20.4 提交錯誤報告329
20.5 補丁330
20.5.1 創建補丁330
20.5.2 用git創建補丁331
20.5.3 提交補丁331
20.6 小結332
參考資料333