Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書(shū)第3版)

2021-04-19 20:57 更新

Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書(shū)第3版)

[美] Robert Love 著,陳莉君,康華 譯

  • 出版社: 機(jī)械工業(yè)出版社
  • ISBN:9787111338291
  • 版次:1
  • 商品編碼:10664953
  • 品牌:機(jī)工出版
  • 包裝:平裝
  • 叢書(shū)名: 華章專(zhuān)業(yè)開(kāi)發(fā)者書(shū)庫(kù)
  • 開(kāi)本:16開(kāi)
  • 出版時(shí)間:2011-05-01
  • 用紙:膠版紙
  • 頁(yè)數(shù):352


點(diǎn)此購(gòu)買(mǎi)


編輯推薦

【詳細(xì)描述Linux內(nèi)核的主要子系統(tǒng)和特點(diǎn);涵蓋Linux內(nèi)核從理論到實(shí)踐的方方面面】

本書(shū)基于Linux 2.6.34內(nèi)核詳細(xì)介紹了Linux內(nèi)核系統(tǒng),覆蓋了從核心內(nèi)核系統(tǒng)的應(yīng)用到內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)等各方面的內(nèi)容。本書(shū)主要內(nèi)容包括:進(jìn)程管理、進(jìn)程調(diào)度、時(shí)間管理和定時(shí)器、系統(tǒng)調(diào)用接口、內(nèi)存尋址、內(nèi)存管理和頁(yè)緩存、VFS、內(nèi)核同步以及調(diào)試技術(shù)等。同時(shí)本書(shū)也涵蓋了Linux 2.6內(nèi)核中頗具特色的內(nèi)容,包括CFS調(diào)度程序、搶占式內(nèi)核、塊I/O層以及I/O調(diào)度程序等。本書(shū)采用理論與實(shí)踐相結(jié)合的路線,能夠帶領(lǐng)讀者快速走進(jìn)Linux內(nèi)核世界,真正開(kāi)發(fā)內(nèi)核代碼。


內(nèi)容簡(jiǎn)介

  《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書(shū)第3版)》詳細(xì)描述了Linux內(nèi)核的設(shè)計(jì)與實(shí)現(xiàn)。內(nèi)核代碼的編寫(xiě)者、開(kāi)發(fā)者以及程序開(kāi)發(fā)人員都可以通過(guò)閱讀《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書(shū)第3版)》受益,他們可以更好理解操作系統(tǒng)原理,并將其應(yīng)用在自己的編碼中以提高效率和生產(chǎn)率。

  《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書(shū)第3版)》詳細(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)核核心開(kāi)發(fā)人員,他分享了在開(kāi)發(fā)Linux2.6內(nèi)核過(guò)程中頗具價(jià)值的知識(shí)和經(jīng)驗(yàn)《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書(shū)第3版)》的主題包括進(jìn)程管理、進(jìn)程調(diào)度、時(shí)間管理和定時(shí)器、系統(tǒng)調(diào)用接口、內(nèi)存尋址、內(nèi)存管理和頁(yè)緩存、VFS、內(nèi)核同步、移植性相關(guān)的問(wèn)題以及調(diào)試技術(shù)。同時(shí)《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(原書(shū)第3版)》也涵蓋了Linux2.6內(nèi)核中頗具特色的內(nèi)容,包括CFS調(diào)度程序、搶占式內(nèi)核、塊I/O層以及I/O調(diào)度程序。


作者簡(jiǎn)介

  RobertLove,是一位資深的開(kāi)源社區(qū)達(dá)人,很早就開(kāi)始使用Linux。目前他是Google公司高級(jí)軟件工程師,是開(kāi)發(fā)Android移動(dòng)平臺(tái)內(nèi)核的團(tuán)隊(duì)成員;他曾在Novell公司任職Linux桌面系統(tǒng)的首席架構(gòu)師;他之前也曾是MontaVista和Ximain公司的內(nèi)核開(kāi)發(fā)工程師。他參與的內(nèi)核項(xiàng)目包括搶占式內(nèi)核、進(jìn)程調(diào)度器、內(nèi)核事件層、通知機(jī)制、VM改進(jìn),以及設(shè)備驅(qū)動(dòng)程序。他是《Linuxjournal》雜志的編輯。另外他還著有《Linux System Programming》和《Linux in aNutshell》。

  陳莉君,西安郵電學(xué)院教授,十多年來(lái)一直致力于推動(dòng)Linux在中國(guó)的發(fā)展,多年從事Linux內(nèi)核的教學(xué)和研究,并積極跟蹤Linux內(nèi)核的發(fā)展動(dòng)向,對(duì)Linux內(nèi)核版本的不斷演化有著深刻的理解。著譯作品有《Linux操作系統(tǒng)原理與應(yīng)用》、《Linux操作系統(tǒng)內(nèi)核分析》、《深入分析Linux內(nèi)核源代碼》、《深入理解Linux內(nèi)核》和《Linux內(nèi)核編程》等。


目錄

譯者序
序言
前言
作者簡(jiǎn)介
第1章 Linux內(nèi)核簡(jiǎn)介1
1.1 Unix的歷史1
1.2 追尋Linus足跡:Linux簡(jiǎn)介2
1.3 操作系統(tǒng)和內(nèi)核簡(jiǎn)介3
1.4 Linux內(nèi)核和傳統(tǒng)Unix內(nèi)核的比較5
1.5 Linux內(nèi)核版本7
1.6 Linux內(nèi)核開(kā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)核源碼樹(shù)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)核開(kāi)發(fā)的特點(diǎn)15
2.4.1 無(wú)libc庫(kù)抑或無(wú)標(biāo)準(zhǔn)頭文件15
2.4.2 GNU C16
2.4.3 沒(méi)有內(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)程家族樹(shù)25
3.3 進(jìn)程創(chuàng)建26
3.3.1 寫(xiě)時(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)程?度36
4.3 策略36
4.3.1 I/O消耗型和處理器消耗型的進(jìn)程36
4.3.2 進(jìn)程優(yōu)先級(jí)37
4.3.3 時(shí)間片38
4.3.4 調(diào)度策略的活動(dòng)38
4.4 Linux調(diào)度算法39
4.4.1 調(diào)度器類(lèi)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 用戶(hù)搶占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)先級(jí)相關(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庫(kù)57
5.3 系統(tǒng)調(diào)用58
5.3.1 系統(tǒng)調(diào)用號(hà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 從用戶(hù)空間訪問(wèn)系統(tǒng)調(diào)用67
5.6.3 為什么不通過(guò)系統(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 沿鏈表移動(dòng)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 重置和撤銷(xiāo)隊(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 撤銷(xiāo)idr84
6.4 二叉樹(shù)84
6.4.1 二叉搜索樹(shù)84
6.4.2 自平衡二叉搜索樹(shù) 85
6.5 數(shù)據(jù)結(jié)構(gòu)以及選擇 87
6.6 算法復(fù)雜度88
6.6.1 算法88
6.6.2 大o 符號(hào)88
6.6.3 大θ符號(hào)89
6.6.4 時(shí)間復(fù)雜度89
6.7 小結(jié) 90

第7章 中斷和中斷處理91
7.1 中?91
7.2 中斷處理程序92
7.3 上半部與下半部的對(duì)比93
7.4 注冊(cè)中斷處理程序93
7.4.1 中斷處理程序標(biāo)志94
7.4.2 一個(gè)中斷例子95
7.4.3 釋放中斷處理程序95
7.5 編寫(xiě)中斷處理程序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ū)和競(jìng)爭(zhēng)條件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 爭(zhēng)用和擴(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 其他針對(duì)自旋鎖的操作149
10.2.3 自旋鎖和下半部150
10.3 讀-寫(xiě)自旋鎖150
10.4 信號(hào)量152
10.4.1 計(jì)數(shù)信號(hào)量和二值信號(hào)量153
10.4.2 創(chuàng)建和初始化信號(hào)量154
10.4.3 使用信號(hào)量154
10.5 讀-寫(xiě)信號(hào)量155
10.6 互斥體156
10.6.1 信號(hào)量和互斥體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)勢(shì)169
11.2.3 高HZ的劣勢(shì)169
11.3 jiffies170
11.3.1 jiffies的內(nèi)部表示171
11.3.2 jiffies 的回繞172
11.3.3 用戶(hù)空間和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í)器競(jìng)爭(zhēng)條件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 頁(yè)186
12.2 區(qū)187
12.3 獲得頁(yè)189
12.3.1 獲得填充為0的頁(yè)190
12.3.2 釋放頁(yè)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 單頁(yè)內(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 對(duì)象及其數(shù)據(jù)結(jié)構(gòu)213
13.5 超級(jí)塊對(duì)象214
13.6 超級(jí)塊操作215
13.7 索引節(jié)點(diǎn)對(duì)象217
13.8 索引節(jié)點(diǎn)操作219
13.9 目錄項(xiàng)對(duì)象222
13.9.1 目錄項(xiàng)狀態(tài)222
13.9.2 目錄項(xiàng)緩存223
13.10 目錄項(xiàng)操作224
13.11 文件對(duì)象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 新老方法對(duì)比239
14.4 請(qǐng)求隊(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ù)測(cè)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 撤銷(xiāo)內(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ū)域的樹(shù)型結(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 頁(yè)表260
15.8 小結(jié)261

第16章 頁(yè)高速緩存和頁(yè)回寫(xiě)262
16.1 緩存手段262
16.1.1 寫(xiě)緩存262
16.1.2 緩存回收263
16.2 Linux 頁(yè)高速緩存264
16.2.1 address_space對(duì)象264
16.2.2 address_space 操作266
16.2.3 基樹(shù)267
16.2.4 以前的頁(yè)散列表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è)?類(lèi)型273
17.2 模塊274
17.2.1 Hello,World274
17.2.2 構(gòu)建模塊275
17.2.3 安裝模塊277
17.2.4 產(chǎn)生模塊依賴(lài)性277
17.2.5 載入模塊278
17.2.6 管理配置選項(xiàng)279
17.2.7 模塊參數(shù)280
17.2.8 導(dǎo)出符號(hà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)備開(kāi)始295
18.2 內(nèi)核中的bug296
18.3 通過(guò)打印來(lái)調(diào)試296
18.3.1 健壯性296
18.3.2 日志等級(jí)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)請(qǐng)求鍵302
18.8 內(nèi)核調(diào)試器的傳奇303
18.8.1 gdb303
18.8.2 kgdb304
18.9 探測(cè)系統(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 字長(zhǎng)和數(shù)據(jù)類(lèi)型311
19.3.1 不透明類(lèi)型313
19.3.2 指定數(shù)據(jù)類(lèi)型314
19.3.3 長(zhǎng)度明確的類(lèi)型314
19.3.4 char型的符號(hào)問(wèn)題315
19.4 數(shù)據(jù)對(duì)齊315
19.4.1 避免對(duì)齊引發(fā)的問(wèn)題316
19.4.2 非標(biāo)準(zhǔn)類(lèi)型的對(duì)齊316
19.4.3 結(jié)構(gòu)體填補(bǔ)316
19.5 字節(jié)順序318
19.6 時(shí)間319
19.7 頁(yè)長(zhǎng)度320
19.8 處理器排序320
19.9 SMP、內(nèi)核搶占、高端內(nèi)存321
19.10 小結(jié)321

第20章 補(bǔ)丁、開(kāi)發(fā)和社區(qū)322
20.1 社區(qū)322
20.2 Linux編碼風(fēng)格322
20.2.1 縮進(jìn)323
20.2.2 switch 語(yǔ)句323
20.2.3 空格324
20.2.4 花括號(hào)325
20.2.5 每行代碼的長(zhǎng)度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


精彩書(shū)摘

  16.4.1 膝上型計(jì)算機(jī)模式

  膝上型計(jì)算機(jī)模式是一種特殊的頁(yè)回寫(xiě)策略,該策略主要意圖是將硬盤(pán)轉(zhuǎn)動(dòng)的機(jī)械行為最小化,允許硬盤(pán)盡可能長(zhǎng)時(shí)間地停滯,以此延長(zhǎng)電池供電時(shí)間。該模式可通過(guò)/proc/sys/vm/laptop_mode文件進(jìn)行配置。通常,上述配置文件內(nèi)容為0,也就是說(shuō)膝上型計(jì)算機(jī)模式關(guān)閉,如果需要啟用膝上型計(jì)算機(jī)模式,則向配置文件中寫(xiě)入1。

  膝上型計(jì)算機(jī)模式的頁(yè)回寫(xiě)行為與傳統(tǒng)方式相比只有一處變化。除了當(dāng)緩存中的頁(yè)面太舊時(shí)要執(zhí)行回寫(xiě)臟頁(yè)以外,flusher還會(huì)找準(zhǔn)磁盤(pán)運(yùn)轉(zhuǎn)的時(shí)機(jī),把所有其他的物理磁盤(pán)I/O、刷新臟緩沖等通通寫(xiě)回到磁盤(pán),以便保證不會(huì)專(zhuān)門(mén)為了寫(xiě)磁盤(pán)而去主動(dòng)激活磁盤(pán)運(yùn)行。

  上述回寫(xiě)行為變化要求dirty_expire_interval和dirty_writeback_interval兩閾值必須設(shè)置得更大,比如10分鐘。因?yàn)榇疟P(pán)運(yùn)轉(zhuǎn)并不很頻繁,所以用這樣長(zhǎng)的回寫(xiě)延遲就能保證膝上型計(jì)算機(jī)模式可以等到磁盤(pán)運(yùn)轉(zhuǎn)機(jī)會(huì)寫(xiě)入數(shù)據(jù)。因?yàn)殛P(guān)閉磁盤(pán)驅(qū)動(dòng)器是節(jié)電的重要手段,膝上模式可以延長(zhǎng)膝上計(jì)算機(jī)依靠電池的續(xù)航能力。其壞處則是系統(tǒng)崩潰或者其他錯(cuò)誤會(huì)使得數(shù)據(jù)丟失。

  多數(shù)Linux發(fā)布版會(huì)在計(jì)算機(jī)接上電池或拔掉電池時(shí),自動(dòng)開(kāi)啟或禁止膝上型計(jì)算機(jī)模式以及其他需要的回寫(xiě)可調(diào)節(jié)開(kāi)關(guān)。因此機(jī)器可在使用電池電源時(shí)自動(dòng)進(jìn)入膝上型計(jì)算機(jī)模式,而在插上交流電源時(shí)恢復(fù)到常規(guī)的頁(yè)回寫(xiě)模式。

  16.4.2歷史上的bdflush、kupdated和pdflush

  在2.6版本前,flusher線程的工作是分別由bdflush和kupdated兩個(gè)線程共同完成。

  當(dāng)可用內(nèi)存過(guò)低時(shí),bdflush內(nèi)核線程在后臺(tái)執(zhí)行臟頁(yè)回寫(xiě)操作。類(lèi)似flusher,它也有一組閾值參數(shù),當(dāng)系統(tǒng)中空閑內(nèi)存消耗到特定閾值以下時(shí),bdflush線wakeup_bdflush()函數(shù)喚醒。

  bdflush和當(dāng)前的flusher線程之間存在兩個(gè)主要區(qū)別。第一個(gè)區(qū)別是系統(tǒng)中只有一個(gè)bdfiush后臺(tái)線程,而fiusher線程的數(shù)目卻是根據(jù)磁盤(pán)數(shù)量變化的(這在16.5節(jié)中會(huì)談到);第二個(gè)區(qū)別是bdflush線程基于緩沖,它將臟緩沖寫(xiě)回磁盤(pán)。相反,flusher線程基于頁(yè)面,它將整個(gè)臟頁(yè)寫(xiě)回磁盤(pán)。當(dāng)然,頁(yè)面可能包含緩沖,但是實(shí)際I/O操作對(duì)象是整頁(yè),而不是塊。因?yàn)轫?yè)在內(nèi)存中是更普遍和普通的概念,所以管理頁(yè)相比管理塊要簡(jiǎn)單。

  因?yàn)橹挥性趦?nèi)存過(guò)低和緩沖數(shù)雖過(guò)大時(shí),bdflush例程才刷新緩沖,所以kupdated例程被引入,以便周期地寫(xiě)回臟頁(yè)。它和pdflush線程的wb_writeback()函數(shù)提供同樣的服務(wù)。

  在2.6內(nèi)核中,buflush和kupdated已讓路給了pdflush線程——page dirty flush(比以前兩個(gè)更容易令人混淆的名字)的縮寫(xiě)。Pdflush線程的執(zhí)行和今天的flusher線程類(lèi)似。其主要區(qū)別在于,pdflush線程數(shù)目是動(dòng)態(tài)的,默認(rèn)是2個(gè)到8個(gè),具體多少取決于系統(tǒng)I/O的負(fù)載。Pdflush線程與任何任務(wù)都無(wú)關(guān),它們是面向系統(tǒng)所有磁盤(pán)的全局任務(wù)。這樣做的好處是實(shí)現(xiàn)簡(jiǎn)單,可帶來(lái)的問(wèn)題是,pdflush線程很容易在擁塞的磁盤(pán)上絆住,而現(xiàn)代硬件發(fā)生擁塞更是家常便飯。采用每個(gè)磁盤(pán)一個(gè)刷新線程可以使得I/O操作同步執(zhí)行,簡(jiǎn)化了擁塞邏輯,也提升了性能。

  ……


前言/序言

前  言

在我剛開(kāi)始有把自己的內(nèi)核開(kāi)發(fā)經(jīng)驗(yàn)集結(jié)成冊(cè),撰寫(xiě)一本書(shū)的念頭時(shí),我其實(shí)也覺(jué)得有點(diǎn)頭緒繁多,不知道該從何下手。我實(shí)在不想落入傳統(tǒng)內(nèi)核書(shū)籍的窠臼,照貓畫(huà)虎地再寫(xiě)這么一本。不錯(cuò),前人著述備矣,但我終歸是要寫(xiě)出點(diǎn)兒與眾不同的東西來(lái),我的書(shū)該如何定位,說(shuō)實(shí)話,這確實(shí)讓人頗費(fèi)思量。

后來(lái),靈感終于浮現(xiàn)出來(lái),我意識(shí)到自己可以從一個(gè)全新的視角看待這個(gè)主題。開(kāi)發(fā)內(nèi)核是我的工作,同時(shí)也是我的嗜好,內(nèi)核就是我的摯愛(ài)。這些年來(lái),我不斷搜集與內(nèi)核有關(guān)的奇聞?shì)W事,不斷積攢關(guān)鍵的開(kāi)發(fā)訣竅,依靠這些日積月累的材料,我可以寫(xiě)一本關(guān)于開(kāi)發(fā)內(nèi)核該做什么—更重要的是—不該做什么的書(shū)籍。從本質(zhì)上說(shuō),這本書(shū)仍舊是描述Linux內(nèi)核是如何設(shè)計(jì)和實(shí)現(xiàn)的,但是寫(xiě)法卻另辟蹊徑,所提供的信息更傾向于實(shí)用。通過(guò)本書(shū),你就可以做一些內(nèi)核開(kāi)發(fā)的工作了—并且是使用正確的方法去做。我是一個(gè)注重實(shí)效的人,因此,這是一本實(shí)踐的書(shū),它應(yīng)當(dāng)有趣、易讀且有用。

我希望讀者可以從這本書(shū)中領(lǐng)略到更多Linux內(nèi)核的精妙之處(寫(xiě)出來(lái)的和沒(méi)寫(xiě)出來(lái)的),也希望讀者敢于從閱讀本書(shū)和讀內(nèi)核代碼開(kāi)始跨越到開(kāi)始嘗試開(kāi)發(fā)可用、可靠且清晰的內(nèi)核代碼。當(dāng)然如果你僅僅是興致所至,讀書(shū)自?shī)?,那也希望你能從中找到?lè)趣。

從第1版到現(xiàn)在,又過(guò)了一段時(shí)間,我們?cè)俅位氐奖緯?shū),修補(bǔ)遺憾。本版比第1版和第2版內(nèi)容更豐富:修訂、補(bǔ)充并增加了新的內(nèi)容和章節(jié),使其更加完善。本版融合了第2版以來(lái)內(nèi)核的各種變化。更值得一提的是,Linux內(nèi)核聯(lián)盟做出決定,近期內(nèi)不進(jìn)行2.7版內(nèi)核的開(kāi)發(fā),于是,內(nèi)核開(kāi)發(fā)者打算繼續(xù)開(kāi)發(fā)并穩(wěn)定2.6版。這個(gè)決定意味深長(zhǎng),而本書(shū)從中的最大受益就是在2.6版上可以穩(wěn)定相當(dāng)長(zhǎng)時(shí)間。隨著內(nèi)核的成熟,內(nèi)核“快照”才有機(jī)會(huì)能維持得更久遠(yuǎn)一些。本書(shū)可作為內(nèi)核開(kāi)發(fā)的規(guī)范文檔,既認(rèn)識(shí)內(nèi)核的過(guò)去,也著眼于內(nèi)核的未來(lái)。

使用這本書(shū)

開(kāi)發(fā)Linux內(nèi)核不需要天賦異秉,不需要有什么魔法,連Unix開(kāi)發(fā)者普遍長(zhǎng)著的絡(luò)腮胡子都不一定要有。內(nèi)核雖然有一些有趣并且獨(dú)特的規(guī)則和要求,但是它和其他大型軟件項(xiàng)目相比,并沒(méi)有太大差別。像所有的大型軟件開(kāi)發(fā)一樣,要學(xué)的東西確實(shí)不少,但是不同之處在于數(shù)量上的積累,而非本質(zhì)上的區(qū)別。

認(rèn)真閱讀源碼非常有必要,Linux系統(tǒng)代碼的開(kāi)放性其實(shí)是彌足珍貴的,不要無(wú)動(dòng)于衷地將它擱置一邊,浪費(fèi)了大好資源。實(shí)際上就是讀了代碼還遠(yuǎn)遠(yuǎn)不夠呢,你應(yīng)該鉆研并嘗試著動(dòng)手改動(dòng)一些代碼。尋找一個(gè)bug然后去修改它,改進(jìn)你的硬件設(shè)備的驅(qū)動(dòng)程序。增加新功能,即使看起來(lái)微不足道,尋找痛癢之處并解決。只有動(dòng)手寫(xiě)代碼才能真正融會(huì)貫通。

內(nèi)核版本

本書(shū)基于Linux 2.6內(nèi)核系列。它并不涵蓋早期的版本,當(dāng)然也有一些例外。比如,我們會(huì)討論2.4系列內(nèi)核中的一些子系統(tǒng)是如何實(shí)現(xiàn)的,這是因?yàn)楹?jiǎn)單的實(shí)現(xiàn)有助于傳授知識(shí)。特別說(shuō)明的是,本書(shū)介紹的是最新的Linux 2.6.34內(nèi)核版本。盡管內(nèi)核總在不斷更新,任何努力也難以捕獲這樣一只永不停息的猛獸,但是本書(shū)力圖適合于新舊內(nèi)核的開(kāi)發(fā)者和用戶(hù)。

雖然本書(shū)討論的是2.6.34內(nèi)核,但我也確保了它同樣適用于2.6.32內(nèi)核。后一個(gè)版本往往被各個(gè)Linux發(fā)行版本奉為“企業(yè)版”內(nèi)核,所以我們可以在各種產(chǎn)品線上見(jiàn)到其身影。該版本確實(shí)已經(jīng)開(kāi)發(fā)了數(shù)年(類(lèi)似的“長(zhǎng)線”版本還有 2.6.9、2.6.18和2.6.27等)。

讀者范圍

本書(shū)是寫(xiě)給那些有志于理解Linux內(nèi)核的軟件開(kāi)發(fā)者的。本書(shū)并不逐行逐字地注解內(nèi)核源代碼,也不是指導(dǎo)開(kāi)發(fā)驅(qū)動(dòng)程序或是內(nèi)核API的參考手冊(cè)(如果存在標(biāo)準(zhǔn)的內(nèi)核API的話)。本書(shū)的初衷是提供足夠多的關(guān)于Linux內(nèi)核設(shè)計(jì)和實(shí)現(xiàn)的信息,希望讀過(guò)本書(shū)的程序員能夠擁有較為完備的知識(shí),可以真正開(kāi)始開(kāi)發(fā)內(nèi)核代碼。無(wú)論開(kāi)發(fā)內(nèi)核是為了興趣還是為了賺錢(qián),我都希望能夠帶領(lǐng)讀者快速走進(jìn)Linux內(nèi)核世界。本書(shū)不但介紹了理論而且也討論了具體應(yīng)用,可以滿足不同讀者的需要。全書(shū)緊緊圍繞著理論聯(lián)系實(shí)踐,并非一味強(qiáng)調(diào)理論或是實(shí)踐。無(wú)論你研究Linux內(nèi)核的動(dòng)機(jī)是什么,我都希望這本書(shū)都能將內(nèi)核的設(shè)計(jì)和實(shí)現(xiàn)分析清楚,起到拋磚引玉的作用。

因此,本書(shū)覆蓋了從核心內(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)核開(kāi)發(fā)者或者學(xué)者會(huì)感興趣),隨即便介紹了如何使用內(nèi)核提供的接口實(shí)現(xiàn)你自己的下半部(這對(duì)設(shè)備驅(qū)動(dòng)開(kāi)發(fā)者可能很有用處)。其實(shí),我認(rèn)為上述兩部分內(nèi)容是相得益彰的,雖然核心內(nèi)核開(kāi)發(fā)者主要關(guān)注的問(wèn)題是內(nèi)核內(nèi)部如何工作,但是也應(yīng)該清楚如何使用接口;同樣,如果設(shè)備驅(qū)動(dòng)開(kāi)發(fā)者了解了接口背后的實(shí)現(xiàn)機(jī)制,自然也會(huì)受益匪淺。

這好比學(xué)習(xí)某些庫(kù)的API函數(shù)與研究該庫(kù)的具體實(shí)現(xiàn)。初看,好像應(yīng)用程序開(kāi)發(fā)者僅僅需要理解API—我們被灌輸?shù)乃枷胧?,?yīng)該像看待黑盒子一樣看待接口。另外,庫(kù)的開(kāi)發(fā)者也只關(guān)心庫(kù)的設(shè)計(jì)與實(shí)現(xiàn),但是我認(rèn)為雙方都應(yīng)該花時(shí)間相互學(xué)習(xí)。能深刻了解操作系統(tǒng)本質(zhì)的應(yīng)用程序開(kāi)發(fā)者無(wú)疑可以更好地利用它。同樣,庫(kù)開(kāi)發(fā)者也決不應(yīng)該脫離基于此庫(kù)的應(yīng)用程序,埋頭開(kāi)發(fā)。因此,我既討論了內(nèi)核子系統(tǒng)的設(shè)計(jì),也討論了它的用法,希望本書(shū)能對(duì)核心開(kāi)發(fā)者和應(yīng)用開(kāi)發(fā)者都有用。

我假設(shè)讀者已經(jīng)掌握了C語(yǔ)言,而且對(duì)Linux比較熟悉。如果讀者還具有與操作系統(tǒng)設(shè)計(jì)相關(guān)的經(jīng)驗(yàn)和其他計(jì)算機(jī)科學(xué)的概念就更好了。當(dāng)然,我也會(huì)盡可能多地解釋這些概念,但如果你仍然不能理解這些知識(shí)的話,請(qǐng)看本書(shū)最后參考資料中給出的一些關(guān)于操作系統(tǒng)設(shè)計(jì)方面的經(jīng)典書(shū)籍。

本書(shū)很適合在大學(xué)中作為介紹操作系統(tǒng)的輔助教材,與介紹操作系統(tǒng)理論的書(shū)相搭配。對(duì)于大學(xué)高年級(jí)課程或者研究生課程來(lái)說(shuō),可直接使用本書(shū)作為教材。


點(diǎn)此購(gòu)買(mǎi)


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)