關於Linux核心的書已經不計其數,但這本書卻是獨樹一幟的,它的內容代表著Linux核心研究成果的世界頂尖級水平,它在世界範圍內首次提出並闡述了作業系統設計的核心指導思想——主奴機制,這是所有作業系統研究者的一筆寶貴財富。本書可能也代表著同類圖書的頂尖水平,是一本真正能引導我們較為容易地、極為透徹地理解Linux核心的經典之作,也可能是當前唯一能從本質上指引我們去設計和開發擁有自主智慧財產權的作業系統的著作。它的出版也許會成為Linux核心研究領域的一個里程碑事件。
基本介紹
- 書名:Linux核心設計的藝術
- 又名:圖解Linux作業系統架構設計與實現原理
- 作者:新設計團隊
- ISBN:9787111347446
- 頁數:444
- 定價:79.00元
- 出版社:機械工業出版社華章公司
- 出版時間:2011-6-20
- 裝幀:平裝
內容簡介······,作者簡介······,目錄······,
內容簡介······
關於Linux核心的書已經不計其數,但這本書卻是獨樹一幟的,它的內容代表著Linux核心研究成果的世界頂尖級水平,它在世界範圍內首次提出並闡述了作業系統設計的核心指導思想——主奴機制,這是所有作業系統研究者的一筆寶貴財富。本書可能也代表著同類圖書的頂尖水平,是一本真正能引導我們較為容易地、極為透徹地理解Linux核心的經典之作,也可能是當前唯一能從本質上指引我們去設計和開發擁有自主智慧財產權的作業系統的著作。它的出版也許會成為Linux核心研究領域的一個里程碑事件。
本書的最大特點是它的寫作方式和內容組織方式,與同類書完全不同。它在深刻地分析了傳統講解方法的利弊之後,破舊立新,從認知學的角度開創了一種全新的方式。以作業系統的真實運行過程為主線,結合真實的核心原始碼、349幅精確的核心運行時序圖和具有點睛之妙的文字說明,對作業系統從開機加電到系統完全準備就緒的整個過程進行了系統而完整地分析,深刻地揭示了其間每一個動作的設計意圖和實現原理,完美地再現了作業系統設計者的設計思路。閱讀本書就如同跟隨著作業系統設計者一起去思考,我們會在閱讀的過程中發現Linux核心設計的精妙,會發現原來處處都“暗藏玄機”,哪怕是一行很短的代碼。
本書在所有細節上都力求完美。為了保證知識的準確性,作業系統運行過程中的每個動作都經過了嚴格的考證;為了讓我們真正理解Linux核心的原理,它突破傳統,以Linux的真實運行過程為主線進行講解;為了做到真正易於理解,創新性地使用了圖解的方式,精心繪製了349幅解析度600dpi的時序圖,圖中表現的運行時結構和狀態與作業系統實際運行時的真實狀態完全吻合;為了提高閱讀體驗,本書採用了雙色印刷,以便於我們更清楚地觀察每一幅圖中的細節。
作者簡介······
暫無
目錄······
本書導讀
前言
前言
第1章 從開機加電到執行main函式之前的過程1
1.1 啟動BIOS,準備實模式下的中斷向量表和中斷服務程式1
1.1.1 BIOS的啟動原理2
1.1.2 BIOS在記憶體中載入中斷向量表和中斷服務程式3
1.2 載入作業系統核心程式並為保護模式做準備4
1.2.1 載入第一部分代碼—引導程式(bootsect)5
1.2.2 載入第二部分代碼—setup7
1.2.3 載入第三部分代碼—system模組12
1.3 開始向32位模式轉變,為main函式的調用做準備16
1.3.1 關中斷並將system移動到記憶體地址起始位置0x0000016
1.3.2 設定中斷描述符表和全局描述符表18
1.3.3 打開A20,實現32位定址20
1.3.4 為在保護模式下執行head.s做準備21
1.3.5 head.s開始執行24
1.4 本章小結41
第2章 從main到怠速42
2.1 開中斷之前的準備工作43
2.1.1 複製根設備號和硬碟參數表 44
2.1.2 物理記憶體規劃格局45
2.1.3 虛擬盤設定與初始化46
2.1.4 記憶體管理結構mem_map初始化47
2.1.5 異常處理類中斷服務程式掛接48
2.1.6 初始化塊設備請求項結構50
2.1.7 與建立人機互動界面相關的外設的中斷服務程式掛接52
2.1.8 開機啟動時間設定55
2.1.9 系統開始激活進程056
2.1.10 進程相關事務初始化設定57
2.1.11 時鐘中斷設定59
2.1.12 系統調用服務程式掛接59
2.1.13 初始化緩衝區管理結構61
2.1.14 初始化硬碟63
2.1.15 初始化軟碟65
2.1.16 開中斷66
2.2 進程創建的最基本動作67
2.2.1 作業系統為進程0創建進程1做準備67
2.2.2 在進程槽中為進程1 申請一個空閒位置並獲取進程號71
2.2.3 複製進程信息之前,先將一些數據壓棧73
2.2.4 初步設定進程1管理結構74
2.2.5 進程0創建進程1的過程中發生時鐘中斷76
2.2.6 從時鐘中斷返回78
2.2.7 調整進程1管理結構79
2.2.8 設定進程1的線性地址空間及物理頁面81
2.2.9 繼續調整進程1管理結構84
2.2.10 作業系統如何區分進程0和進程187
2.2.11 進程0準備切換到進程189
2.2.12 系統切換到進程1執行90
2.3 載入根檔案系統92
2.3.1 進程1如何開始執行96
2.3.2 進程1開始執行98
2.3.3 進程1開始以數據塊的形式操作硬碟99
2.3.4 將找到的緩衝塊與請求項掛接101
2.3.5 將請求項與硬碟處理函式掛接104
2.3.6 進行硬碟讀盤前的準備工作105
2.3.7 給硬碟下達讀盤指令106
2.3.8 進程1由於等待讀盤操作掛起107
2.3.9 系統切換到進程0執行109
2.3.10 進程0的執行過程110
2.3.11 進程0執行過程中發生硬碟中斷111
2.3.12 硬碟中斷服務程式回響後,進程0繼續執行113
2.3.13 再次回響硬碟中斷並喚醒進程1114
2.3.14 讀盤操作完成後,進程1繼續執行116
2.3.15 進程1繼續設定硬碟管理結構117
2.3.16 進程1獲取軟碟超級塊,為載入根檔案系統做準備118
2.3.17 進程1備份超級塊數據119
2.3.18 進程1將根檔案系統從軟碟拷貝到虛擬盤120
2.3.19 進程1開始載入根檔案系統122
2.3.20 進程1準備載入根檔案系統超級塊123
2.3.21 進程1載入根檔案系統超級塊124
2.3.22 進程1繼續載入根檔案系統126
2.3.23 進程1準備讀取根目錄i節點127
2.3.24 進程1載入根目錄i節點128
2.3.25 進程1結束載入根檔案系統的過程129
2.4 打開終端設備檔案及複製檔案句柄131
2.4.1 進程1與核心檔案表掛接,為打開檔案做準備133
2.4.2 確定打開操作的起點135
2.4.3 獲得枝梢i節點—dev目錄檔案的i節點136
2.4.4 確定dev目錄檔案i節點為枝梢i節點137
2.4.5 繼續返回枝梢i節點138
2.4.6 查找tty0檔案的i節點138
2.4.7 將tty0設備檔案的i節點返回給sys_open系統調用 139
2.4.8 分析tty0檔案i節點140
2.4.9 設定檔案管理結構並返回給用戶進程141
2.4.10 進程1複製tty0檔案句柄142
2.4.11 進程1繼續複製tty0檔案句柄144
2.5 創建進程2145
2.5.1 進程1準備創建進程2145
2.5.2 複製進程2管理結構並進行調整146
2.5.3 設定進程2的頁目錄項並複製進程2的頁表146
2.5.4 調整進程2管理結構中與檔案有關的內容146
2.5.5 進程1執行過程中發生時鐘中斷148
2.5.6 進程1從時鐘中斷返回,準備切換到進程2150
2.6 進程1等待進程2退出150
2.6.1 進程1查找它自己的子進程151
2.6.2 對進程2的狀態進行處理151
2.6.3 切換到進程2執行153
2.7 shell程式的載入154
2.7.1 進程2開始執行156
2.7.2 為打開/etc/rc檔案做準備156
2.7.3 進程2打開“/etc/rc”配置檔案157
2.7.4 通過壓棧為載入shell檔案做準備158
2.7.5 為參數和環境變數設定做準備159
2.7.6 得到shell檔案的i節點160
2.7.7 為載入參數和環境變數做準備161
2.7.8 根據i節點,對shell檔案進行檢測162
2.7.9 檢測shell檔案頭163
2.7.10 備份檔案頭並進行分析163
2.7.11 對shell檔案進行進一步分析165
2.7.12 拷貝參數和環境變數166
2.7.13 調整進程2的管理結構167
2.7.14 繼續調整進程2管理結構168
2.7.15 釋放進程2繼承的頁面169
2.7.16 檢測協處理器170
2.7.17 調整shell程式所在的線性空間地址171
2.7.18 為shell程式準備參數和環境變數172
2.7.19 繼續調整進程2管理結構173
2.7.20 調整EIP,使其指向shell程式入口地址173
2.7.21 shell程式執行引發缺頁中斷175
2.7.22 缺頁中斷中shell程式載入前的檢測175
2.7.23 為即將載入的內容申請頁面177
2.7.24 將shell程式載入新獲得的頁面177
2.7.25 根據shell程式的情況,調整頁面的內容178
2.7.26 將線性地址空間與程式所在的物理頁面對應179
2.8 系統實現怠速180
2.8.1 shell進程準備創建update進程180
2.8.2 進程2開始執行/etc/rc檔案181
2.8.3 準備載入update進程181
2.8.4 update進程的作用182
2.8.5 shell程式檢測“/etc/rc”檔案183
2.8.6 shell進程退出184
2.8.7 shell進程退出善後處理185
2.8.8 進程1清理shell進程管理結構187
2.8.9 系統開始重建shell190
2.8.10 shell進程為何不會再次退出192
2.9 小結194
第3章 安裝檔案系統195
3.1 獲取硬碟設備號196
3.1.1 用戶發出安裝硬碟檔案系統指令196
3.1.2 從分析路徑開始,準備查找hd1設備的掛接點197
3.1.3 以根目錄i節點為依託,得到dev目錄檔案的i節點197
3.1.4 從dev目錄檔案中找到代表hd1設備檔案的目錄項198
3.1.5 得到hd1設備檔案的i節點號199
3.1.6 釋放dev目錄檔案的相關內容200
3.1.7 得到hd1設備檔案的i節點200
3.1.8 獲得hd1設備的設備號200
3.1.9 釋放hd1設備檔案的i節點201
3.2 獲取虛擬盤上的掛接點202
3.3 得到hd1設備檔案的超級塊202
3.3.1 準備讀取hd1設備檔案超級塊203
3.3.2 為hd1設備檔案的超級塊找到存儲位置203
3.3.3 初始化空閒超級塊並加鎖203
3.3.4 從硬碟獲得hd1設備檔案的超級塊204
3.3.5 載入邏輯塊點陣圖和i節點點陣圖205
3.4 將hd1設備檔案與mnt目錄檔案的i節點掛接206
3.5 小結207
第4章 檔案操作208
4.1 打開檔案211
4.1.1 用戶程式調用open庫函式產生軟中斷212
4.1.2 建立用戶進程與檔案管理表的關係213
4.1.3 從硬碟上獲取helloc.txt檔案的i節點214
4.1.4 將helloc.txt檔案與檔案管理表相掛接226
4.2 讀檔案227
4.2.1 為按照用戶要求讀入檔案做準備228
4.2.2 確定要讀入的數據塊的位置230
4.2.3 將指定的數據塊從硬碟讀入到高速緩衝塊233
4.2.4 將數據拷貝到用戶指定的記憶體234
4.3 新建檔案237
4.3.1 查找路徑“/mnt/user/hello.txt”238
4.3.2 為hello.txt檔案新建一個i節點240
4.3.3 為hello.txt檔案新建目錄項242
4.3.4 完成hello.txt新建操作並返回給用戶進程245
4.4 寫檔案246
4.4.1 檔案寫入前的準備工作248
4.4.2 確定hello.txt檔案的寫入位置249
4.4.3 為數據的寫入申請緩衝塊252
4.4.4 將指定的寫入數據從用戶數據區拷貝到緩衝塊253
4.4.5 數據同步到硬碟的方法1255
4.4.6 將檔案寫入硬碟的情況2257
4.5 修改檔案260
4.5.1 對檔案的當前操作指針進行重定位261
4.5.2 對檔案進行修改261
4.6 關閉檔案263
4.6.1 當前進程與檔案管理表“脫鉤”264
4.6.2 將檔案管理表中hello.txt對應的引用次數減1265
4.6.3 hello.txt檔案與檔案管理表“脫鉤”266
4.7 刪除檔案268
4.7.1 系統準備刪除hello.txt檔案268
4.7.2 刪除hello.txt檔案在硬碟上對應的數據和i節點270
4.7.3 對hello.txt檔案所在的user目錄做處理275
4.8 本章小結275
第5章 用戶進程與記憶體管理277
5.1 用戶進程的創建277
5.1.1 為創建進程str1準備條件277
5.1.2 為str1進程管理結構找到存儲空間279
5.1.3 複製str1進程管理結構281
5.1.4 確定str1進程線上性空間中的位置282
5.1.5 複製str1進程頁表並設定其對應的頁目錄項283
5.1.6 調整str1進程中與檔案相關的結構285
5.1.7 建立str1進程與全局描述符表GDT的關聯286
5.1.8 將str1進程設為就緒態287
5.2 為用戶進程str1的載入做準備288
5.2.1 為str1進程載入自身對應的程式做準備288
5.2.2 讀取str1執行檔的i節點並統計參數和環境變數289
5.2.3 讀取str1執行檔的檔案頭290
5.2.4 對str1可執行程式檔案頭進行分析291
5.2.5 拷貝str1可執行程式的參數和環境變數292
5.2.6 調整str1進程管理結構中可執行程式對應的i節點292
5.2.7 繼續調整str1進程管理結構—檔案和信號相關的欄位293
5.2.8 釋放str1進程的頁表294
5.2.9 重新設定str1的程式代碼段和數據段295
5.2.10 創建環境變數和參數指針表296
5.2.11 繼續根據str1可執行程式情況調整str1進程管理結構297
5.2.12 設定str1可執行程式的棧指針和eip值297
5.3 對缺頁中斷的處理298
5.3.1 產生缺頁中斷並由作業系統回響298
5.3.2 為str1程式申請一個記憶體頁面299
5.3.3 將str1程式載入到新分配的頁面中300
5.3.4 檢測是否需要對頁面剩餘空間清0300
5.3.5 將str1程式占用的物理記憶體地址與str1進程的線性地址空間對應301
5.3.6 不斷通過缺頁中斷載入str1程式的全部內容301
5.3.7 str1程式需要壓棧302
5.3.8 str1程式第一次調用foo程式壓棧302
5.3.9 str1程式第二次壓棧,產生缺頁中斷302
5.3.10 處理str1程式第二次壓棧產生的缺頁中斷302
5.3.11 str1程式繼續執行,反覆壓棧並產生缺頁中斷303
5.3.12 str1程式運行結束後清棧303
5.4 str1用戶進程的退出305
5.4.1 str1進程準備退出305
5.4.2 釋放str1程式所占頁面305
5.4.3 解除str1程式與檔案有關的內容並給父進程發信號306
5.4.4 str1程式退出後執行進程調度307
5.5 多個用戶進程“同時”運行308
5.5.1 依次創建str1、str2和str3進程308
5.5.2 str1進程壓棧的執行效果309
5.5.3 str1運行過程中產生時鐘中斷並切換到str2執行309
5.5.4 str2執行過程遇到時鐘中斷切換到str3執行310
5.5.5 三個程式執行一段時間後在主記憶體的分布格局311
5.6 進程的調度與切換311
5.6.1 str1剛被shell創建並處於就緒態311
5.6.2 shell進程將自己掛起,然後準備切換到str1執行311
5.6.3 準備切換到str1進程執行312
5.6.4 str1執行時發生時鐘中斷314
5.6.5 時鐘中斷遞減str1運行的時間片315
5.6.6 str1執行一段時間後掛起,shell進程新建str2進程315
5.6.7 str2運行期間發生時鐘中斷316
5.6.8 系統切換到str1程式執行317
5.7 核心的分頁318
5.7.1 為設定核心的頁目錄表和頁表做準備—所占空間清0318
5.7.2 設定核心對應的頁目錄項和頁表項的內容319
5.7.3 設定核心對應的全局描述符表GDT320
5.8 頁防寫321
5.8.1 進程A和進程B共享頁面321
5.8.2 進程A準備進行壓棧操作322
5.8.3 進程A的壓棧動作引發頁防寫322
5.8.4 將進程A的頁表指向新申請的頁面323
5.8.5 拷貝原頁面內容到進程A新申請的頁面324
5.8.6 進程B準備操作共享頁面325
5.8.7 假設進程B先執行壓棧操作的情況325
5.9 小結326
第6章 多個進程“同時”操作一個檔案327
6.1 三個進程操作同一個檔案327
6.1.1 進程A執行,hello.txt檔案被打開328
6.1.2 進程A讀取hello.txt檔案並由於等待硬碟中斷而被系統掛起328
6.1.3 進程B準備打開hello.txt檔案330
6.1.4 系統準備為進程B獲取hello.txt檔案的i節點332
6.1.5 系統找到hello.txt檔案已經載入的i節點333
6.1.6 系統準備為進程B從硬碟上讀取hello.txt檔案334
6.1.7 系統找到了正在操作的緩衝塊,將進程B掛起335
6.1.8 系統再次切換到進程0執行337
6.1.9 進程C啟動並打開hello.txt檔案337
6.1.10 進程C也由於等待緩衝塊解鎖而被系統掛起338
6.1.11 緩衝塊解鎖後先喚醒進程C339
6.1.12 系統將進程B設為就緒狀態340
6.1.13 系統將指定數據寫入緩衝塊341
6.1.14 寫入完成後,進程C繼續執行341
6.1.15 進程C準備切換到進程B342
6.1.16 進程C切換到進程B執行,進程B喚醒進程A342
6.1.17 進程B不斷執行,直到時間片減為0後切換到進程A執行343
6.1.18 進程A、B、C退出,寫入數據由update進程同步344
6.2 緩衝區與外設的數據同步344
6.2.1 系統不斷為進程A向緩衝區寫入數據346
6.2.2 繼續執行引發緩衝塊數據需要同步346
6.2.3 將緩衝區中的數據同步到硬碟上347
6.2.4 進程A由於等待空閒請求項而被系統掛起349
6.2.5 進程B開始執行350
6.2.6 進程B也被掛起351
6.2.7 進程C開始執行並隨後被掛起352
6.2.8 進程A和進程C均被喚醒352
6.2.9 進程B切換到進程A執行354
6.3 小結356
第7章 IPC問題358
7.1 管道機制358
7.1.1 為管道檔案在檔案管理表中申請空閒項360
7.1.2 為管道檔案與進程建立聯繫創造條件360
7.1.3 創建管道檔案i節點361
7.1.4 將管道檔案i節點與檔案管理表建立聯繫362
7.1.5 將管道檔案句柄返回給用戶進程363
7.1.6 讀管道進程開始操作管道檔案363
7.1.7 寫管道進程向管道中寫入數據364
7.1.8 寫管道進程繼續向管道寫入數據366
7.1.9 寫管道進程已將管道空間寫滿366
7.1.10 寫管道進程掛起366
7.1.11 讀管道進程從管道中讀出數據367
7.1.12 讀管道進程繼續執行,不斷從管道中讀出數據369
7.1.13 讀管道進程執行中發生時鐘中斷369
7.1.14 讀管道進程執行過程中再次發生時鐘中斷370
7.1.15 讀管道進程切換到寫管道進程執行371
7.1.16 寫管道進程掛起切換到讀管道進程執行371
7.1.17 讀管道進程繼續執行,直到把管道中的數據讀完372
7.1.18 讀取完成後,讀進程掛起,寫進程繼續執行373
7.2 信號機制374
7.2.1 processig進程開始執行376
7.2.2 processig進程進入可中斷等待狀態377
7.2.3 sendsig進程開始執行並向processig進程發信號379
7.2.4 系統檢測當前進程接收到信號並準備處理381
7.2.5 系統檢測信號處理函式指針掛接是否正常382
7.2.6 調整processig進程的核心棧結構,使之先執行信號處理函式383
7.2.7 信號對進程執行狀態的影響386
7.3 小結393
第8章 作業系統的設計指導思想395
8.1 運行一個最簡單的程式,看作業系統為程式運行做了哪些工作395
8.2 作業系統的設計指導思想—主奴機制398
8.2.1 主奴機制中的進程及進程創建機制399
8.2.2 作業系統在記憶體管理中的主奴機制400
8.2.3 作業系統在檔案系統中體現的主奴機制401
8.3 實現主奴機制的三種關鍵技術402
8.3.1 保護和分頁402
8.3.2 特權級405
8.3.3 中斷405
8.4 建立主奴機制的決定性因素—先機407
8.5 軟體和硬體的關係:主機與進程、外設與檔案408
8.5.1 非用戶進程—進程0、進程1、shell進程408
8.5.2 檔案與數據存儲409
8.6 父子進程共享頁面414
8.7 作業系統的全局中斷與進程的局部中斷—信號414
8.8 小結415
1.1 啟動BIOS,準備實模式下的中斷向量表和中斷服務程式1
1.1.1 BIOS的啟動原理2
1.1.2 BIOS在記憶體中載入中斷向量表和中斷服務程式3
1.2 載入作業系統核心程式並為保護模式做準備4
1.2.1 載入第一部分代碼—引導程式(bootsect)5
1.2.2 載入第二部分代碼—setup7
1.2.3 載入第三部分代碼—system模組12
1.3 開始向32位模式轉變,為main函式的調用做準備16
1.3.1 關中斷並將system移動到記憶體地址起始位置0x0000016
1.3.2 設定中斷描述符表和全局描述符表18
1.3.3 打開A20,實現32位定址20
1.3.4 為在保護模式下執行head.s做準備21
1.3.5 head.s開始執行24
1.4 本章小結41
第2章 從main到怠速42
2.1 開中斷之前的準備工作43
2.1.1 複製根設備號和硬碟參數表 44
2.1.2 物理記憶體規劃格局45
2.1.3 虛擬盤設定與初始化46
2.1.4 記憶體管理結構mem_map初始化47
2.1.5 異常處理類中斷服務程式掛接48
2.1.6 初始化塊設備請求項結構50
2.1.7 與建立人機互動界面相關的外設的中斷服務程式掛接52
2.1.8 開機啟動時間設定55
2.1.9 系統開始激活進程056
2.1.10 進程相關事務初始化設定57
2.1.11 時鐘中斷設定59
2.1.12 系統調用服務程式掛接59
2.1.13 初始化緩衝區管理結構61
2.1.14 初始化硬碟63
2.1.15 初始化軟碟65
2.1.16 開中斷66
2.2 進程創建的最基本動作67
2.2.1 作業系統為進程0創建進程1做準備67
2.2.2 在進程槽中為進程1 申請一個空閒位置並獲取進程號71
2.2.3 複製進程信息之前,先將一些數據壓棧73
2.2.4 初步設定進程1管理結構74
2.2.5 進程0創建進程1的過程中發生時鐘中斷76
2.2.6 從時鐘中斷返回78
2.2.7 調整進程1管理結構79
2.2.8 設定進程1的線性地址空間及物理頁面81
2.2.9 繼續調整進程1管理結構84
2.2.10 作業系統如何區分進程0和進程187
2.2.11 進程0準備切換到進程189
2.2.12 系統切換到進程1執行90
2.3 載入根檔案系統92
2.3.1 進程1如何開始執行96
2.3.2 進程1開始執行98
2.3.3 進程1開始以數據塊的形式操作硬碟99
2.3.4 將找到的緩衝塊與請求項掛接101
2.3.5 將請求項與硬碟處理函式掛接104
2.3.6 進行硬碟讀盤前的準備工作105
2.3.7 給硬碟下達讀盤指令106
2.3.8 進程1由於等待讀盤操作掛起107
2.3.9 系統切換到進程0執行109
2.3.10 進程0的執行過程110
2.3.11 進程0執行過程中發生硬碟中斷111
2.3.12 硬碟中斷服務程式回響後,進程0繼續執行113
2.3.13 再次回響硬碟中斷並喚醒進程1114
2.3.14 讀盤操作完成後,進程1繼續執行116
2.3.15 進程1繼續設定硬碟管理結構117
2.3.16 進程1獲取軟碟超級塊,為載入根檔案系統做準備118
2.3.17 進程1備份超級塊數據119
2.3.18 進程1將根檔案系統從軟碟拷貝到虛擬盤120
2.3.19 進程1開始載入根檔案系統122
2.3.20 進程1準備載入根檔案系統超級塊123
2.3.21 進程1載入根檔案系統超級塊124
2.3.22 進程1繼續載入根檔案系統126
2.3.23 進程1準備讀取根目錄i節點127
2.3.24 進程1載入根目錄i節點128
2.3.25 進程1結束載入根檔案系統的過程129
2.4 打開終端設備檔案及複製檔案句柄131
2.4.1 進程1與核心檔案表掛接,為打開檔案做準備133
2.4.2 確定打開操作的起點135
2.4.3 獲得枝梢i節點—dev目錄檔案的i節點136
2.4.4 確定dev目錄檔案i節點為枝梢i節點137
2.4.5 繼續返回枝梢i節點138
2.4.6 查找tty0檔案的i節點138
2.4.7 將tty0設備檔案的i節點返回給sys_open系統調用 139
2.4.8 分析tty0檔案i節點140
2.4.9 設定檔案管理結構並返回給用戶進程141
2.4.10 進程1複製tty0檔案句柄142
2.4.11 進程1繼續複製tty0檔案句柄144
2.5 創建進程2145
2.5.1 進程1準備創建進程2145
2.5.2 複製進程2管理結構並進行調整146
2.5.3 設定進程2的頁目錄項並複製進程2的頁表146
2.5.4 調整進程2管理結構中與檔案有關的內容146
2.5.5 進程1執行過程中發生時鐘中斷148
2.5.6 進程1從時鐘中斷返回,準備切換到進程2150
2.6 進程1等待進程2退出150
2.6.1 進程1查找它自己的子進程151
2.6.2 對進程2的狀態進行處理151
2.6.3 切換到進程2執行153
2.7 shell程式的載入154
2.7.1 進程2開始執行156
2.7.2 為打開/etc/rc檔案做準備156
2.7.3 進程2打開“/etc/rc”配置檔案157
2.7.4 通過壓棧為載入shell檔案做準備158
2.7.5 為參數和環境變數設定做準備159
2.7.6 得到shell檔案的i節點160
2.7.7 為載入參數和環境變數做準備161
2.7.8 根據i節點,對shell檔案進行檢測162
2.7.9 檢測shell檔案頭163
2.7.10 備份檔案頭並進行分析163
2.7.11 對shell檔案進行進一步分析165
2.7.12 拷貝參數和環境變數166
2.7.13 調整進程2的管理結構167
2.7.14 繼續調整進程2管理結構168
2.7.15 釋放進程2繼承的頁面169
2.7.16 檢測協處理器170
2.7.17 調整shell程式所在的線性空間地址171
2.7.18 為shell程式準備參數和環境變數172
2.7.19 繼續調整進程2管理結構173
2.7.20 調整EIP,使其指向shell程式入口地址173
2.7.21 shell程式執行引發缺頁中斷175
2.7.22 缺頁中斷中shell程式載入前的檢測175
2.7.23 為即將載入的內容申請頁面177
2.7.24 將shell程式載入新獲得的頁面177
2.7.25 根據shell程式的情況,調整頁面的內容178
2.7.26 將線性地址空間與程式所在的物理頁面對應179
2.8 系統實現怠速180
2.8.1 shell進程準備創建update進程180
2.8.2 進程2開始執行/etc/rc檔案181
2.8.3 準備載入update進程181
2.8.4 update進程的作用182
2.8.5 shell程式檢測“/etc/rc”檔案183
2.8.6 shell進程退出184
2.8.7 shell進程退出善後處理185
2.8.8 進程1清理shell進程管理結構187
2.8.9 系統開始重建shell190
2.8.10 shell進程為何不會再次退出192
2.9 小結194
第3章 安裝檔案系統195
3.1 獲取硬碟設備號196
3.1.1 用戶發出安裝硬碟檔案系統指令196
3.1.2 從分析路徑開始,準備查找hd1設備的掛接點197
3.1.3 以根目錄i節點為依託,得到dev目錄檔案的i節點197
3.1.4 從dev目錄檔案中找到代表hd1設備檔案的目錄項198
3.1.5 得到hd1設備檔案的i節點號199
3.1.6 釋放dev目錄檔案的相關內容200
3.1.7 得到hd1設備檔案的i節點200
3.1.8 獲得hd1設備的設備號200
3.1.9 釋放hd1設備檔案的i節點201
3.2 獲取虛擬盤上的掛接點202
3.3 得到hd1設備檔案的超級塊202
3.3.1 準備讀取hd1設備檔案超級塊203
3.3.2 為hd1設備檔案的超級塊找到存儲位置203
3.3.3 初始化空閒超級塊並加鎖203
3.3.4 從硬碟獲得hd1設備檔案的超級塊204
3.3.5 載入邏輯塊點陣圖和i節點點陣圖205
3.4 將hd1設備檔案與mnt目錄檔案的i節點掛接206
3.5 小結207
第4章 檔案操作208
4.1 打開檔案211
4.1.1 用戶程式調用open庫函式產生軟中斷212
4.1.2 建立用戶進程與檔案管理表的關係213
4.1.3 從硬碟上獲取helloc.txt檔案的i節點214
4.1.4 將helloc.txt檔案與檔案管理表相掛接226
4.2 讀檔案227
4.2.1 為按照用戶要求讀入檔案做準備228
4.2.2 確定要讀入的數據塊的位置230
4.2.3 將指定的數據塊從硬碟讀入到高速緩衝塊233
4.2.4 將數據拷貝到用戶指定的記憶體234
4.3 新建檔案237
4.3.1 查找路徑“/mnt/user/hello.txt”238
4.3.2 為hello.txt檔案新建一個i節點240
4.3.3 為hello.txt檔案新建目錄項242
4.3.4 完成hello.txt新建操作並返回給用戶進程245
4.4 寫檔案246
4.4.1 檔案寫入前的準備工作248
4.4.2 確定hello.txt檔案的寫入位置249
4.4.3 為數據的寫入申請緩衝塊252
4.4.4 將指定的寫入數據從用戶數據區拷貝到緩衝塊253
4.4.5 數據同步到硬碟的方法1255
4.4.6 將檔案寫入硬碟的情況2257
4.5 修改檔案260
4.5.1 對檔案的當前操作指針進行重定位261
4.5.2 對檔案進行修改261
4.6 關閉檔案263
4.6.1 當前進程與檔案管理表“脫鉤”264
4.6.2 將檔案管理表中hello.txt對應的引用次數減1265
4.6.3 hello.txt檔案與檔案管理表“脫鉤”266
4.7 刪除檔案268
4.7.1 系統準備刪除hello.txt檔案268
4.7.2 刪除hello.txt檔案在硬碟上對應的數據和i節點270
4.7.3 對hello.txt檔案所在的user目錄做處理275
4.8 本章小結275
第5章 用戶進程與記憶體管理277
5.1 用戶進程的創建277
5.1.1 為創建進程str1準備條件277
5.1.2 為str1進程管理結構找到存儲空間279
5.1.3 複製str1進程管理結構281
5.1.4 確定str1進程線上性空間中的位置282
5.1.5 複製str1進程頁表並設定其對應的頁目錄項283
5.1.6 調整str1進程中與檔案相關的結構285
5.1.7 建立str1進程與全局描述符表GDT的關聯286
5.1.8 將str1進程設為就緒態287
5.2 為用戶進程str1的載入做準備288
5.2.1 為str1進程載入自身對應的程式做準備288
5.2.2 讀取str1執行檔的i節點並統計參數和環境變數289
5.2.3 讀取str1執行檔的檔案頭290
5.2.4 對str1可執行程式檔案頭進行分析291
5.2.5 拷貝str1可執行程式的參數和環境變數292
5.2.6 調整str1進程管理結構中可執行程式對應的i節點292
5.2.7 繼續調整str1進程管理結構—檔案和信號相關的欄位293
5.2.8 釋放str1進程的頁表294
5.2.9 重新設定str1的程式代碼段和數據段295
5.2.10 創建環境變數和參數指針表296
5.2.11 繼續根據str1可執行程式情況調整str1進程管理結構297
5.2.12 設定str1可執行程式的棧指針和eip值297
5.3 對缺頁中斷的處理298
5.3.1 產生缺頁中斷並由作業系統回響298
5.3.2 為str1程式申請一個記憶體頁面299
5.3.3 將str1程式載入到新分配的頁面中300
5.3.4 檢測是否需要對頁面剩餘空間清0300
5.3.5 將str1程式占用的物理記憶體地址與str1進程的線性地址空間對應301
5.3.6 不斷通過缺頁中斷載入str1程式的全部內容301
5.3.7 str1程式需要壓棧302
5.3.8 str1程式第一次調用foo程式壓棧302
5.3.9 str1程式第二次壓棧,產生缺頁中斷302
5.3.10 處理str1程式第二次壓棧產生的缺頁中斷302
5.3.11 str1程式繼續執行,反覆壓棧並產生缺頁中斷303
5.3.12 str1程式運行結束後清棧303
5.4 str1用戶進程的退出305
5.4.1 str1進程準備退出305
5.4.2 釋放str1程式所占頁面305
5.4.3 解除str1程式與檔案有關的內容並給父進程發信號306
5.4.4 str1程式退出後執行進程調度307
5.5 多個用戶進程“同時”運行308
5.5.1 依次創建str1、str2和str3進程308
5.5.2 str1進程壓棧的執行效果309
5.5.3 str1運行過程中產生時鐘中斷並切換到str2執行309
5.5.4 str2執行過程遇到時鐘中斷切換到str3執行310
5.5.5 三個程式執行一段時間後在主記憶體的分布格局311
5.6 進程的調度與切換311
5.6.1 str1剛被shell創建並處於就緒態311
5.6.2 shell進程將自己掛起,然後準備切換到str1執行311
5.6.3 準備切換到str1進程執行312
5.6.4 str1執行時發生時鐘中斷314
5.6.5 時鐘中斷遞減str1運行的時間片315
5.6.6 str1執行一段時間後掛起,shell進程新建str2進程315
5.6.7 str2運行期間發生時鐘中斷316
5.6.8 系統切換到str1程式執行317
5.7 核心的分頁318
5.7.1 為設定核心的頁目錄表和頁表做準備—所占空間清0318
5.7.2 設定核心對應的頁目錄項和頁表項的內容319
5.7.3 設定核心對應的全局描述符表GDT320
5.8 頁防寫321
5.8.1 進程A和進程B共享頁面321
5.8.2 進程A準備進行壓棧操作322
5.8.3 進程A的壓棧動作引發頁防寫322
5.8.4 將進程A的頁表指向新申請的頁面323
5.8.5 拷貝原頁面內容到進程A新申請的頁面324
5.8.6 進程B準備操作共享頁面325
5.8.7 假設進程B先執行壓棧操作的情況325
5.9 小結326
第6章 多個進程“同時”操作一個檔案327
6.1 三個進程操作同一個檔案327
6.1.1 進程A執行,hello.txt檔案被打開328
6.1.2 進程A讀取hello.txt檔案並由於等待硬碟中斷而被系統掛起328
6.1.3 進程B準備打開hello.txt檔案330
6.1.4 系統準備為進程B獲取hello.txt檔案的i節點332
6.1.5 系統找到hello.txt檔案已經載入的i節點333
6.1.6 系統準備為進程B從硬碟上讀取hello.txt檔案334
6.1.7 系統找到了正在操作的緩衝塊,將進程B掛起335
6.1.8 系統再次切換到進程0執行337
6.1.9 進程C啟動並打開hello.txt檔案337
6.1.10 進程C也由於等待緩衝塊解鎖而被系統掛起338
6.1.11 緩衝塊解鎖後先喚醒進程C339
6.1.12 系統將進程B設為就緒狀態340
6.1.13 系統將指定數據寫入緩衝塊341
6.1.14 寫入完成後,進程C繼續執行341
6.1.15 進程C準備切換到進程B342
6.1.16 進程C切換到進程B執行,進程B喚醒進程A342
6.1.17 進程B不斷執行,直到時間片減為0後切換到進程A執行343
6.1.18 進程A、B、C退出,寫入數據由update進程同步344
6.2 緩衝區與外設的數據同步344
6.2.1 系統不斷為進程A向緩衝區寫入數據346
6.2.2 繼續執行引發緩衝塊數據需要同步346
6.2.3 將緩衝區中的數據同步到硬碟上347
6.2.4 進程A由於等待空閒請求項而被系統掛起349
6.2.5 進程B開始執行350
6.2.6 進程B也被掛起351
6.2.7 進程C開始執行並隨後被掛起352
6.2.8 進程A和進程C均被喚醒352
6.2.9 進程B切換到進程A執行354
6.3 小結356
第7章 IPC問題358
7.1 管道機制358
7.1.1 為管道檔案在檔案管理表中申請空閒項360
7.1.2 為管道檔案與進程建立聯繫創造條件360
7.1.3 創建管道檔案i節點361
7.1.4 將管道檔案i節點與檔案管理表建立聯繫362
7.1.5 將管道檔案句柄返回給用戶進程363
7.1.6 讀管道進程開始操作管道檔案363
7.1.7 寫管道進程向管道中寫入數據364
7.1.8 寫管道進程繼續向管道寫入數據366
7.1.9 寫管道進程已將管道空間寫滿366
7.1.10 寫管道進程掛起366
7.1.11 讀管道進程從管道中讀出數據367
7.1.12 讀管道進程繼續執行,不斷從管道中讀出數據369
7.1.13 讀管道進程執行中發生時鐘中斷369
7.1.14 讀管道進程執行過程中再次發生時鐘中斷370
7.1.15 讀管道進程切換到寫管道進程執行371
7.1.16 寫管道進程掛起切換到讀管道進程執行371
7.1.17 讀管道進程繼續執行,直到把管道中的數據讀完372
7.1.18 讀取完成後,讀進程掛起,寫進程繼續執行373
7.2 信號機制374
7.2.1 processig進程開始執行376
7.2.2 processig進程進入可中斷等待狀態377
7.2.3 sendsig進程開始執行並向processig進程發信號379
7.2.4 系統檢測當前進程接收到信號並準備處理381
7.2.5 系統檢測信號處理函式指針掛接是否正常382
7.2.6 調整processig進程的核心棧結構,使之先執行信號處理函式383
7.2.7 信號對進程執行狀態的影響386
7.3 小結393
第8章 作業系統的設計指導思想395
8.1 運行一個最簡單的程式,看作業系統為程式運行做了哪些工作395
8.2 作業系統的設計指導思想—主奴機制398
8.2.1 主奴機制中的進程及進程創建機制399
8.2.2 作業系統在記憶體管理中的主奴機制400
8.2.3 作業系統在檔案系統中體現的主奴機制401
8.3 實現主奴機制的三種關鍵技術402
8.3.1 保護和分頁402
8.3.2 特權級405
8.3.3 中斷405
8.4 建立主奴機制的決定性因素—先機407
8.5 軟體和硬體的關係:主機與進程、外設與檔案408
8.5.1 非用戶進程—進程0、進程1、shell進程408
8.5.2 檔案與數據存儲409
8.6 父子進程共享頁面414
8.7 作業系統的全局中斷與進程的局部中斷—信號414
8.8 小結415