《作業系統設計:Xinu方法》是2013年11月機械工業出版社出版的圖書,作者是Douglas E.Comer。
基本介紹
- 中文名:作業系統設計:Xinu方法
- 作者:Douglas E.Comer
- 出版社:機械工業出版社
- 出版時間:2013年11月28日
- 開本:16 開
- ISBN:978-7-111-42826-8
內容簡介,目錄信息,
內容簡介
本書以一個小型作業系統Xinu為例講述了作業系統設計的基本原理和實現技術,重點討論基於微核心結構的嵌入式作業系統。本書不是專門講述嵌入式系統編程重要主題的課本,而是將更多的嵌入式處理技術融入到現有的作業系統課程教學中。本書針對高等院校高年級本科生或研究生作業系統課程編寫,以滿足學生不斷增加的對作業系統專業知識的需求;也可供程式設計人員、工程技術人員、系統架構師等相關人員參考
目錄信息
出版者的話
譯者序
前言
關於作者
第1章 引言和概述1
1.1 作業系統1
1.2 本書的研究方法1
1.3 分層設計2
1.4 Xinu作業系統3
1.5 作業系統不是什麼3
1.6 從外面看作業系統4
1.7 其他章節概要4
1.8 觀點5
1.9 總結5
練習5
第2章 並發執行與作業系統服務6
2.1 引言6
2.2 多活動的編程模型6
2.3 作業系統服務7
2.4 並發處理的概念和術語7
2.5 串列程式和並發程式的區別8
2.6 多進程共享同一段代碼9
2.7 進程退出與進程終止11
2.8 共享記憶體、競爭條件和同步11
2.9 信號量與互斥14
2.10 Xinu中的類型命名方法15
2.11 使用Kputc和Kprintf進行作業系統的調試16
2.12 觀點16
2.13 總結16
練習17
第3章 硬體和運行時環境概覽18
3.1 引言18
3.2 E2100L的物理和邏輯結構18
3.3 處理器結構和暫存器19
3.4 匯流排操作:獲取-存儲範式19
3.5 直接記憶體訪問19
3.6 匯流排地址空間20
3.7 核心段KSEG0和KSEG1的內容20
3.8 匯流排啟動的靜態配置21
3.9 調用約定和運行時棧21
3.10 中斷和中斷處理22
3.11 異常處理23
3.12 計時器硬體23
3.13 串列通信24
3.14 輪詢與中斷驅動I/O24
3.15 記憶體快取和KSEG124
3.16 存儲布局24
3.17 記憶體保護25
3.18 觀點25
練習25
第4章 鍊表與佇列操作26
4.1 引言26
4.2 用於進程鍊表的統一數據結構26
4.3 簡潔的鍊表數據結構27
4.4 佇列數據結構的實現28
4.5 內聯佇列操作函式29
4.6 獲取鍊表中進程的基礎函式29
4.7 FIFO佇列操作30
4.8 優先權佇列的操作32
4.9 鍊表初始化33
4.10 觀點34
4.11 總結34
練習35
第5章 調度和上下文切換36
5.1 引言36
5.2 進程表36
5.3 進程狀態38
5.4 就緒和當前狀態38
5.5 調度策略38
5.6 調度的實現39
5.7 上下文切換的實現41
5.8 記憶體中保存的狀態41
5.9 在MIPS處理器上切換上下文41
5.10 重新啟動進程執行的地址43
5.11 並發執行和null進程44
5.12 使進程準備執行和調度不變式44
5.13 推遲重新調度45
5.14 其他進程調度算法47
5.15 觀點47
5.16 總結47
練習47
第6章 更多進程管理49
6.1 引言49
6.2 進程掛起和恢復49
6.3 自我掛起和信息隱藏49
6.4 系統調用的概念50
6.5 禁止中斷和恢復中斷51
6.6 系統調用模板51
6.7 系統調用返回SYSERR和OK值51
6.8 掛起的實現52
6.9 掛起當前進程53
6.10 suspend函式的返回值53
6.11 進程終止和進程退出54
6.12 進程創建56
6.13 其他進程管理函式59
6.14 總結60
練習61
第7章 協調並發進程62
7.1 引言62
7.2 進程同步的必要性62
7.3 計數信號量的概念63
7.4 避免忙等待63
7.5 信號量策略和進程選擇63
7.6 等待狀態64
7.7 信號量數據結構64
7.8 系統調用wait65
7.9 系統調用signal66
7.10 靜態和動態信號量分配66
7.11 動態信號量的實現示例67
7.12 信號量刪除68
7.13 信號量重置69
7.14 多核處理器之間的協調69
7.15 觀點70
7.16 總結70
練習71
第8章 訊息傳遞72
8.1 引言72
8.2 兩種類型的訊息傳遞服務72
8.3 訊息使用資源的限制72
8.4 訊息傳遞函式和狀態轉換73
8.5 send的實現73
8.6 receive的實現74
8.7 非阻塞訊息接收的實現75
8.8 觀點75
8.9 總結75
練習76
第9章 基本記憶體管理77
9.1 引言77
9.2 記憶體的類型77
9.3 重量級進程的定義77
9.4 小型嵌入式系統的記憶體管理78
9.5 程式段和記憶體區域78
9.6 嵌入式系統中的動態記憶體分配79
9.7 低層記憶體管理器的設計79
9.8 分配策略和記憶體持久性80
9.9 追蹤空閒記憶體80
9.10 低層記憶體管理的實現80
9.11 分配堆存儲82
9.12 分配棧存儲83
9.13 釋放堆和棧存儲84
9.14 觀點86
9.15 總結87
練習87
第10章 高級記憶體管理和虛擬記憶體88
10.1 引言88
10.2 分區空間分配88
10.3 緩衝池88
10.4 分配緩衝區89
10.5 將緩衝區返回給緩衝池90
10.6 創建緩衝池91
10.7 初始化緩衝池表93
10.8 虛擬記憶體和記憶體復用93
10.9 實地址空間和虛地址空間93
10.10 支持按需換頁的硬體94
10.11 使用頁表的地址翻譯95
10.12 頁表項中的元數據95
10.13 按需換頁以及設計上的問題95
10.14 頁面替換和全局時鐘算法96
10.15 觀點97
10.16 總結97
練習97
第11章 高層訊息傳遞98
11.1 引言98
11.2 進程間通信連線埠98
11.3 連線埠實現98
11.4 連線埠表初始化99
11.5 連線埠創建100
11.6 向連線埠傳送訊息101
11.7 從連線埠接收訊息102
11.8 連線埠的刪除和重置103
11.9 觀點106
11.10 總結106
練習106
第12章 中斷處理107
12.1 引言107
12.2 中斷的優點107
12.3 中斷分配107
12.4 中斷向量107
12.5 中斷向量號的分配108
12.6 硬體中斷108
12.7 中斷請求的局限性和中斷多路復用109
12.8 中斷軟體和分配109
12.9 中斷分配器底層部分110
12.10 中斷分配器高層部分112
12.11 禁止中斷114
12.12 函式中中斷代碼引起的限制115
12.13 中斷過程中重新調度的必要性115
12.14 中斷過程中的重新調度115
12.15 觀點116
12.16 總結116
練習117
第13章 實時時鐘管理118
13.1 引言118
13.2 定時事件118
13.3 實時時鐘和計時器硬體118
13.4 處理實時時鐘中斷119
13.5 延時與搶占119
13.6 使用計時器來模擬實時時鐘120
13.7 搶占的實現120
13.8 使用增量鍊表對延遲進行有效管理120
13.9 增量鍊表的實現121
13.10 將進程轉入睡眠122
13.11 定時訊息接收124
13.12 喚醒睡眠進程127
13.13 時鐘中斷處理127
13.14 時鐘初始化128
13.15 間隔計時器管理129
13.16 觀點130
13.17 總結130
練習130
第14章 設備無關的I/O132
14.1 引言132
14.2 I/O和設備驅動的概念結構132
14.3 接口抽象和驅動抽象133
14.4 I/O接口的一個示例134
14.5 打開-讀-寫-關閉範式134
14.6 綁定I/O操作和設備名134
14.7 Xinu中的設備名135
14.8 設備轉換表概念135
14.9 設備和共享驅動的多個副本136
14.10 高層I/O操作的實現138
14.11 其他高層I/O函式138
14.12 打開、關閉和引用計數141
14.13 devtab中的空條目和錯誤條目143
14.14 I/O系統的初始化143
14.15 觀點146
14.16 總結147
練習147
第15章 設備驅動示例148
15.1 引言148
15.2 tty抽象148
15.3 tty設備驅動的組成149
15.4 請求佇列和緩衝區149
15.5 上半部和下半部的同步150
15.6 硬體緩衝區和驅動設計151
15.7 tty控制塊和數據聲明151
15.8 次設備號153
15.9 上半部tty字元輸入(ttyGetc)153
15.10 通用上半部tty輸入(ttyRead)154
15.11 上半部tty字元輸出(ttyPutc)155
15.12 開始輸出(ttyKickOut)156
15.13 上半部tty多字元輸出(ttyWrite)157
15.14 下半部tty驅動函式(ttyInterrupt)157
15.15 輸出中斷處理(ttyInter_out)159
15.16 tty輸入處理(tty Inter-in)161
15.17 tty控制塊初始化(ttyInit)166
15.18 設備驅動控制168
15.19 觀點169
15.20 總結169
練習169
第16章 DMA設備和驅動(乙太網)171
16.1 引言171
16.2 直接記憶體訪問和緩衝區171
16.3 多緩衝區和環171
16.4 使用DMA的乙太網驅動例子172
16.5 設備的硬體定義和常量172
16.6 環和記憶體緩衝區174
16.7 乙太網控制塊的定義175
16.8 設備和驅動初始化177
16.9 分配輸入緩衝區181
16.10 從乙太網設備中讀取數據包182
16.11 向乙太網設備中寫入數據包183
16.12 乙太網設備的中斷處理185
16.13 乙太網控制函式187
16.14 觀點189
16.15 總結189
練習189
第17章 最小網際網路協定棧190
17.1 引言190
17.2 所需的功能190
17.3 同步對話、逾時和進程191
17.4 ARP函式192
17.5 網路數據包的定義198
17.6 網路輸入進程199
17.7 UDP表的定義202
17.8 UDP函式203
17.9 網際網路控制報文協定210
17.10 動態主機配置協定211
17.11 觀點214
17.12 總結214
練習214
第18章 遠程磁碟驅動215
18.1 引言215
18.2 磁碟抽象215
18.3 磁碟操作驅動支持215
18.4 塊傳輸和高層I/O函式215
18.5 遠程磁碟範式216
18.6 磁碟操作的語義216
18.7 驅動數據結構的定義217
18.8 驅動初始化(rdsInit)221
18.9 上半部打開函式(rdsOpen)223
18.10 遠程通信函式(rdscomm)224
18.11 上半部寫函式(rdsWrite)226
18.12 上半部讀函式(rdsRead)228
18.13 刷新掛起的請求231
18.14 上半部控制函式(rdsControl)231
18.15 分配磁碟緩衝區(rdsbufalloc)233
18.16 上半部關閉函式(rdsClose)234
18.17 下半部通信進程(rdsprocess)235
18.18 觀點239
18.19 總結239
練習240
第19章 檔案系統241
19.1 檔案系統是什麼241
19.2 檔案操作的示例集合241
19.3 本地檔案系統的設計242
19.4 Xinu檔案系統的數據結構242
19.5 索引管理器的實現243
19.6 清空索引塊(lfibclear)246
19.7 獲取索引塊(lfibget)247
19.8 存儲索引塊(lfibput)247
19.9 從空閒鍊表中分配索引塊(lfiballoc)248
19.10 從空閒鍊表中分配數據塊(lfdballoc)249
19.11 使用設備無關的I/O函式的檔案操作250
19.12 檔案系統的設備設定和函式名稱251
19.13 本地檔案系統打開函式(lfsOpen)251
19.14 關閉檔案偽設備(lflClose)256
19.15 刷新磁碟中的數據(lfflush)256
19.16 檔案的批量傳輸函式(lflWrite,lflRead)257
19.17 在檔案中查找一個新位置(lflSeek)258
19.18 從檔案中提取一個位元組(lflGetc)259
19.19 改變檔案中的一個位元組(lflPutc)260
19.20 載入索引塊和數據塊(lfsetup)261
19.21 主檔案系統設備的初始化(lfsInit)264
19.22 偽設備的初始化(lflInit)264
19.23 檔案截斷(lftruncate)265
19.24 初始檔案系統的創建(lfscreate)267
19.25 觀點269
19.26 總結269
練習269
第20章 遠程檔案機制270
20.1 引言270
20.2 遠程檔案訪問270
20.3 遠程檔案語義270
20.4 遠程檔案設計和訊息271
20.5 遠程檔案伺服器通信276
20.6 傳送一個基本訊息278
20.7 網路位元組序279
20.8 使用設備範式的遠程檔案系統279
20.9 打開遠程檔案280
20.10 檢查檔案模式282
20.11 關閉遠程檔案283
20.12 讀遠程檔案284
20.13 寫遠程檔案286
20.14 遠程檔案的定位288
20.15 遠程檔案單字元I/O288
20.16 遠程檔案系統控制函式289
20.17 初始化遠程檔案數據結構292
20.18 觀點293
20.19 總結293
練習294
第21章 句法名字空間295
21.1 引言295
21.2 透明與名字空間的抽象295
21.3 多種命名方案295
21.4 命名系統設計的其他方案296
21.5 基於句法的名字空間296
21.6 模式和替換297
21.7 前綴模式297
21.8 名字空間的實現297
21.9 名字空間的數據結構和常量297
21.10 增加名字空間前綴表的映射298
21.11 使用前綴表進行名字映射299
21.12 打開命名檔案302
21.13 名字空間初始化303
21.14 對前綴表中的項進行排序305
21.15 選擇一個邏輯名字空間305
21.16 默認層次和空前綴305
21.17 額外的對象操作函式306
21.18 名字空間方法的優點和限制306
21.19 廣義模式307
21.20 觀點307
21.21 總結308
練習308
第22章 系統初始化309
22.1 引言309
22.2 引導程式:從頭開始309
22.3 作業系統初始化309
22.4 在E2100L上啟動一個可選的映像310
22.5 Xinu初始化310
22.6 系統啟動312
22.7 從程式轉化為進程316
22.8 觀點316
22.9 總結316
練習316
第23章 異常處理317
23.1 引言317
23.2 異常、陷阱和惡意中斷317
23.3 panic的實現317
23.4 觀點318
23.5 總結318
練習318
第24章 系統配置319
24.1 引言319
24.2 多重配置的需求319
24.3 Xinu系統配置319
24.4 Xinu配置檔案的內容320
24.5 計算次設備號321
24.6 配置Xinu系統的步驟322
24.7 觀點322
24.8 總結322
練習322
第25章 一個用戶接口例子:Xinu殼323
25.1 引言323
25.2 用戶接口323
25.3 命令和設計原則323
25.4 一個簡化殼的設計決策324
25.5 殼的組織和操作324
25.6 詞法符號的定義324
25.7 命令行語法的定義325
25.8 Xinu殼的實現325
25.9 符號的存儲327
25.10 詞法分析器代碼327
25.11 命令解釋器的核心330
25.12 命令名查詢和內部處理336
25.13 傳給命令的參數336
25.14 向外部命令傳遞參數337
25.15 I/O重定向339
25.16 示例命令函式(sleep)340
25.17 觀點341
25.18 總結341
練習342
附錄1 作業系統移植343
附錄2 Xinu設計註解349
索引352