Linux核心設計的藝術:圖解Linux作業系統架構設計與實現原理

來源:互聯網
上載者:User

Linux核心設計的藝術:圖解Linux作業系統架構設計與實現原理

       《Linux核心設計的藝術:圖解Linux作業系統架構設計與實現原理》對作業系統核心的駕馭能力和深刻理解程度達到世界頂尖級水平,是一本能真正引導你深入理解Linux核心設計思想的經典著作。
  
結合真實的源碼、349幅核心運行時序圖和詳細的文字描述,以一種開創性的方式對Linux核心進行了極為直觀和透徹地闡述,讀者可通過閱讀本書提出自己的設計思想。

基本資料

作者:新設計團隊  

叢書名:華章原創精品

出版社:機械工業出版社

ISBN:9787111347446

上架時間:2011-6-28

出版日期:2011 年7月

http://product.china-pub.com/198276


《Linux核心設計的藝術:圖解Linux作業系統架構設計與實現原理》電子書線上閱讀

內容簡介

  關於linux核心的書已經不計其數,但這本書卻是獨樹一幟的,它的內容代表著linux核心研究成果的世界頂尖級水平,它在世界範圍內首次提出並闡
述了作業系統設計的核心指導思想——主奴機制,這是所有作業系統研究者的一筆寶貴財富。本書可能也代表著同類圖書的頂尖水平,是一本真正能引導我們較為容
易地、極為透徹地理解linux核心的經典之作,也可能是當前唯一能從本質上指引我們去設計和開發擁有自主智慧財產權的作業系統的著作。它的出版也許會成為
linux核心研究領域的一個裡程碑事件。
  
《linux核心設計的藝術:圖解linux作業系統架構設計與實現原理》的最大特點是它的寫作方式和內容組織方式,與同類書完全不同。它在深刻地分析了
傳統講解方法的利弊之後,破舊立新,從認知學的角度開創了一種全新的方式。以作業系統的真實運行過程為主線,結合真實的核心原始碼、349幅精確的核心運
行時序圖和具有點睛之妙的文字說明,對作業系統從開機加電到系統完全準備就緒的整個過程進行了系統而完整地分析,深刻地揭示了其間每一個動作的設計意圖和
實現原理,完美地再現了作業系統設計者的設計思路。閱讀本書就如同跟隨著作業系統設計者一起去思考,我們會在閱讀的過程中發現linux核心設計的精妙,
會發現原來處處都“暗藏玄機”,哪怕是一行很短的代碼。
  
《linux核心設計的藝術:圖解linux作業系統架構設計與實現原理》在所有細節上都力求完美。為了保證知識的準確性,作業系統運行過程中的每個動作
都經過了嚴格的考證;為了讓我們真正理解linux核心的原理,它突破傳統,以linux的真實運行過程為主線進行講解;為了做到真正易於理解,創新性地
使用了圖解的方式,精心繪製了349幅解析度600dpi的時序圖,圖中表現的運行時結構和狀態與作業系統實際運行時的真實狀態完全吻合;為了提高閱讀體
驗,本書採用了雙色印刷,以便於我們更清楚地觀察每一幅圖中的細節。

目錄

《linux核心設計的藝術:圖解linux作業系統架構設計與實現原理》

本書導讀

前言

第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

結束語415

“新設計團隊”簡介416

附錄 搭建linux 0.11系統內容421

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.