《計算機科學叢書:操作係統設計:Xinu方法》對操作係統的內存管理、進程管理、進程協調和同步、進程間通信、實時時鍾管理、設備無關的I/O、設備驅動、網絡協議、文件係統等進行瞭詳細的介紹,並利用分層的設計範式,以一種有序、易於理解的方式來闡述這些內容。《計算機科學叢書:操作係統設計:Xinu方法》以Xinu操作係統為係統設計的樣闆和模式,從一個裸機開始,一步一步地設計和實現一個小型但優雅的操作係統。本書的樣本代碼可以運行在Linksys E2100L無綫路由器上。
《計算機科學叢書:操作係統設計:Xinu方法》適用於高年級的本科生或低年級的研究生,也適用於那些想瞭解操作係統的計算機從業人員。學習本書前,學生需要具備基本的程序設計能力,應當理解基本的數據結構,包括鏈錶、棧和隊列,並且應當用C語言寫過程序。
Douglas Comer,美國普度大學計算機係傑齣教授,國際公認的計算機網絡、TCP/IP協議、Internet和操作係統設計方麵的專傢。Comer齣版瞭多部優秀的教材和專著,被翻譯成16種語言,並廣泛用於世界各地的工業界和學術界。Comer教授劃時代的三捲巨著《Internetworking with TCP/IP》對網絡和網絡教育産生瞭革命性的影響。Comer博士是ACM院士、普度教育學院院士。
齣版者的話
譯者序
前言
關於作者
第1章 引言和概述
1.1 操作係統
1.2 本書的研究方法
1.3 分層設計
1.4 Xinu操作係統
1.5 操作係統不是什麼
1.6 從外麵看操作係統
1.7 其他章節概要
1.8 觀點
1.9 總結
練習
第2章 並發執行與操作係統服務
2.1 引言
2.2 多活動的編程模型
2.3 操作係統服務
2.4 並發處理的概念和術語
2.5 串行程序和並發程序的區彆
2.6 多進程共享同一段代碼
2.7 進程退齣與進程終止
2.8 共享內存、競爭條件和同步
2.9 信號量與互斥
2.10 Xinu中的類型命名方法
2.11 使用Kputc和Kprintf進行操作係統的調試
2.12 觀點
2.13 總結
練習
第3章 硬件和運行時環境概覽
3.1 引言
3.2 E2100L的物理和邏輯結構
3.3 處理器結構和寄存器
3.4 總綫操作:獲取-存儲範式
3.5 直接內存訪問
3.6 總綫地址空間
3.7 內核段KSEG0和KSEG1的內容
3.8 總綫啓動的靜態配置
3.9 調用約定和運行時棧
3.10 中斷和中斷處理
3.11 異常處理
3.12 計時器硬件
3.13 串行通信
3.14 輪詢與中斷驅動I/O
3.15 內存緩存和KSEG
3.16 存儲布局
3.17 內存保護
3.18 觀點
練習
第4章 鏈錶與隊列操作
4.1 引言
4.2 用於進程鏈錶的統一數據結構
4.3 簡潔的鏈錶數據結構
4.4 隊列數據結構的實現
4.5 內聯隊列操作函數
4.6 獲取鏈錶中進程的基礎函數
4.7 FIFO隊列操作
4.8 優先級隊列的操作
4.9 鏈錶初始化
4.10 觀點
4.11 總結
練習
第5章 調度和上下文切換
5.1 引言
5.2 進程錶
5.3 進程狀態
5.4 就緒和當前狀態
5.5 調度策略
5.6 調度的實現
5.7 上下文切換的實現
5.8 內存中保存的狀態
5.9 在MIPS處理器上切換上下文
5.10 重新啓動進程執行的地址
5.11 並發執行和null進程
5.12 使進程準備執行和調度不變式
5.13 推遲重新調度
5.14 其他進程調度算法
5.15 觀點
5.16 總結
練習
第6章 更多進程管理
6.1 引言
6.2 進程掛起和恢復
6.3 自我掛起和信息隱藏
6.4 係統調用的概念
6.5 禁止中斷和恢復中斷
6.6 係統調用模闆
6.7 係統調用返迴SYSERR和OK值
6.8 掛起的實現
6.9 掛起當前進程
6.10 suspend函數的返迴值
6.11 進程終止和進程退齣
6.12 進程創建
6.13 其他進程管理函數
6.14 總結
練習
第7章 協調並發進程
7.1 引言
7.2 進程同步的必要性
7.3 計數信號量的概念
7.4 避免忙等待
7.5 信號量策略和進程選擇
7.6 等待狀態
7.7 信號量數據結構
7.8 係統調用wait
7.9 係統調用signal
7.10 靜態和動態信號量分配
7.11 動態信號量的實現示例
7.12 信號量刪除
7.13 信號量重置
7.14 多核處理器之間的協調
7.15 觀點
7.16 總結
練習
第8章 消息傳遞
8.1 引言
8.2 兩種類型的消息傳遞服務
8.3 消息使用資源的限製
8.4 消息傳遞函數和狀態轉換
8.5 send的實現
8.6 receive的實現
8.7 非阻塞消息接收的實現
8.8 觀點
8.9 總結
練習
第9章 基本內存管理
9.1 引言
9.2 內存的類型
9.3 重量級進程的定義
9.4 小型嵌入式係統的內存管理
9.5 程序段和內存區域
9.6 嵌入式係統中的動態內存分配
9.7 低層內存管理器的設計
9.8 分配策略和內存持久性
9.9 追蹤空閑內存
9.10 低層內存管理的實現
9.11 分配堆存儲
9.12 分配棧存儲
9.13 釋放堆和棧存儲
9.14 觀點
9.15 總結
練習
第10章 高級內存管理和虛擬內存
10.1 引言
10.2 分區空間分配
10.3 緩衝池
10.4 分配緩衝區
10.5 將緩衝區返迴給緩衝池
10.6 創建緩衝池
10.7 初始化緩衝池錶
10.8 虛擬內存和內存復用
10.9 實地址空間和虛地址空間
10.10 支持按需換頁的硬件
10.11 使用頁錶的地址翻譯
10.12 頁錶項中的元數據
10.13 按需換頁以及設計上的問題
10.14 頁麵替換和全局時鍾算法
10.15 觀點
10.16 總結
練習
第11章 高層消息傳遞
11.1 引言
11.2 進程間通信端口
11.3 端口實現
11.4 端口錶初始化
11.5 端口創建
11.6 嚮端口發送消息
11.7 從端口接收消息
11.8 端口的刪除和重置
11.9 觀點
11.10 總結
練習
第12章 中斷處理
12.1 引言
12.2 中斷的優點
12.3 中斷分配
12.4 中斷嚮量
12.5 中斷嚮量號的分配
12.6 硬件中斷
12.7 中斷請求的局限性和中斷多路復用
12.8 中斷軟件和分配
12.9 中斷分配器底層部分
12.10 中斷分配器高層部分
12.11 禁止中斷
12.12 函數中中斷代碼引起的限製
12.13 中斷過程中重新調度的必要性
12.14 中斷過程中的重新調度
12.15 觀點
12.16 總結
練習
第13章 實時時鍾管理
13.1 引言
13.2 定時事件
13.3 實時時鍾和計時器硬件
13.4 處理實時時鍾中斷
13.5 延時與搶占
13.6 使用計時器來模擬實時時鍾
13.7 搶占的實現
13.8 使用增量鏈錶對延遲進行有效管理
13.9 增量鏈錶的實現
13.10 將進程轉入睡眠
13.11 定時消息接收
13.12 喚醒睡眠進程
13.13 時鍾中斷處理
13.14 時鍾初始化
13.15 間隔計時器管理
13.16 觀點
13.17 總結
練習
第14章 設備無關的I/O
14.1 引言
14.2 I/O和設備驅動的概念結構
14.3 接口抽象和驅動抽象
14.4 I/O接口的一個示例
14.5 打開-讀-寫-關閉範式
14.6 綁定I/O操作和設備名
14.7 Xinu中的設備名
14.8 設備轉換錶概念
14.9 設備和共享驅動的多個副本
14.10 高層I/O操作的實現
14.11 其他高層I/O函數
14.12 打開、關閉和引用計數
14.13 devtab中的空條目和錯誤條目
14.14 I/O係統的初始化
14.15 觀點
14.16 總結
練習
第15章 設備驅動示例
15.1 引言
15.2 tty抽象
15.3 tty設備驅動的組成
15.4 請求隊列和緩衝區
15.5 上半部和下半部的同步
15.6 硬件緩衝區和驅動設計
15.7 tty控製塊和數據聲明
15.8 次設備號
15.9 上半部tty字符輸入(ttyGetc)
15.10 通用上半部tty輸入(ttyRead)
15.11 上半部tty字符輸齣(ttyPutc)
15.12 開始輸齣(ttyKickOut)
15.13 上半部tty多字符輸齣(ttyWrite)
15.14 下半部tty驅動函數(ttyInterrupt)
15.15 輸齣中斷處理(ttyInter_out)
15.16 tty輸入處理(tty Inter-in)
15.17 tty控製塊初始化(ttyInit)
15.18 設備驅動控製
15.19 觀點
15.20 總結
練習
第16章 DMA設備和驅動(以太網)
16.1 引言
16.2 直接內存訪問和緩衝區
16.3 多緩衝區和環
16.4 使用DMA的以太網驅動例子
16.5 設備的硬件定義和常量
16.6 環和內存緩衝區
16.7 以太網控製塊的定義
16.8 設備和驅動初始化
16.9 分配輸入緩衝區
16.10 從以太網設備中讀取數據包
16.11 嚮以太網設備中寫入數據包
16.12 以太網設備的中斷處理
16.13 以太網控製函數
16.14 觀點
16.15 總結
練習
第17章 最小互聯網協議棧
17.1 引言
17.2 所需的功能
17.3 同步對話、超時和進程
17.4 ARP函數
17.5 網絡數據包的定義
17.6 網絡輸入進程
17.7 UDP錶的定義
17.8 UDP函數
17.9 互聯網控製報文協議
17.10 動態主機配置協議
17.11 觀點
17.12 總結
練習
第18章 遠程磁盤驅動
18.1 引言
18.2 磁盤抽象
18.3 磁盤操作驅動支持
18.4 塊傳輸和高層I/O函數
18.5 遠程磁盤範式
18.6 磁盤操作的語義
18.7 驅動數據結構的定義
18.8 驅動初始化(rdsInit)
18.9 上半部打開函數(rdsOpen)
18.10 遠程通信函數(rdscomm)
18.11 上半部寫函數(rdsWrite)
18.12 上半部讀函數(rdsRead)
18.13 刷新掛起的請求
18.14 上半部控製函數(rdsControl)
18.15 分配磁盤緩衝區(rdsbufalloc)
18.16 上半部關閉函數(rdsClose)
18.17 下半部通信進程(rdsprocess)
18.18 觀點
18.19 總結
練習
第19章 文件係統
19.1 文件係統是什麼
19.2 文件操作的示例集閤
19.3 本地文件係統的設計
19.4 Xinu文件係統的數據結構
19.5 索引管理器的實現
19.6 清空索引塊(lfibclear)
19.7 獲取索引塊(lfibget)
19.8 存儲索引塊(lfibput)
19.9 從空閑鏈錶中分配索引塊(lfiballoc)
19.10 從空閑鏈錶中分配數據塊(lfdballoc)
19.11 使用設備無關的I/O函數的文件操作
19.12 文件係統的設備設置和函數名稱
19.13 本地文件係統打開函數(lfsOpen)
19.14 關閉文件僞設備(lflClose)
19.15 刷新磁盤中的數據(lfflush)
19.16 文件的批量傳輸函數(lflWrite,lflRead)
19.17 在文件中查找一個新位置(lflSeek)
19.18 從文件中提取一個字節(lflGetc)
19.19 改變文件中的一個字節(lflPutc)
19.20 載入索引塊和數據塊(lfsetup)
19.21 主文件係統設備的初始化(lfsInit)
19.22 僞設備的初始化(lflInit)
19.23 文件截斷(lftruncate)
19.24 初始文件係統的創建(lfscreate)
19.25 觀點
19.26 總結
練習
第20章 遠程文件機製
20.1 引言
20.2 遠程文件訪問
20.3 遠程文件語義
20.4 遠程文件設計和消息
20.5 遠程文件服務器通信
20.6 發送一個基本消息
20.7 網絡字節序
20.8 使用設備範式的遠程文件係統
20.9 打開遠程文件
20.10 檢查文件模式
20.11 關閉遠程文件
20.12 讀遠程文件
20.13 寫遠程文件
20.14 遠程文件的定位
20.15 遠程文件單字符I/O
20.16 遠程文件係統控製函數
20.17 初始化遠程文件數據結構
20.18 觀點
20.19 總結
練習
第21章 句法名字空間
21.1 引言
21.2 透明與名字空間的抽象
21.3 多種命名方案
21.4 命名係統設計的其他方案
21.5 基於句法的名字空間
21.6 模式和替換
21.7 前綴模式
21.8 名字空間的實現
21.9 名字空間的數據結構和常量
21.10 增加名字空間前綴錶的映射
21.11 使用前綴錶進行名字映射
21.12 打開命名文件
21.13 名字空間初始化
21.14 對前綴錶中的項進行排序
21.15 選擇一個邏輯名字空間
21.16 默認層次和空前綴
21.17 額外的對象操作函數
21.18 名字空間方法的優點和限製
21.19 廣義模式
21.20 觀點
21.21 總結
練習
第22章 係統初始化
22.1 引言
22.2 引導程序:從頭開始
22.3 操作係統初始化
22.4 在E2100L上啓動一個可選的映像
22.5 Xinu初始化
22.6 係統啓動
22.7 從程序轉化為進程
22.8 觀點
22.9 總結
練習
第23章 異常處理
23.1 引言
23.2 異常、陷阱和惡意中斷
23.3 panic的實現
23.4 觀點
23.5 總結
練習
第24章 係統配置
24.1 引言
24.2 多重配置的需求
24.3 Xinu係統配置
24.4 Xinu配置文件的內容
24.5 計算次設備號
24.6 配置Xinu係統的步驟
24.7 觀點
24.8 總結
練習
第25章 一個用戶接口例子:Xinu殼
25.1 引言
25.2 用戶接口
25.3 命令和設計原則
25.4 一個簡化殼的設計決策
25.5 殼的組織和操作
25.6 詞法符號的定義
25.7 命令行語法的定義
25.8 Xinu殼的實現
25.9 符號的存儲
25.10 詞法分析器代碼
25.11 命令解釋器的核心
25.12 命令名查詢和內部處理
25.13 傳給命令的參數
25.14 嚮外部命令傳遞參數
25.15 I/O重定嚮
25.16 示例命令函數(sleep)
25.17 觀點
25.18 總結
練習
附錄1 操作係統移植
附錄2 Xinu設計注解
索引
第1章 引言和概述 ·
·第1章 引言和概述
第1章
Operating System Design:The Xinu Approach,Linksys Version
引言和概述
第1章 引言和概述
我們的小小係統也有風光的時刻。
——Alfred,Lord Tennyson
1.1 操作係統
每一個智能設備和計算機係統中都隱藏著這麼一類軟件,它們控製著處理信息、管理資源以及與顯示屏、網絡、磁盤和打印機等設備通信的工作。總的來說,這些進行控製和協調工作的代碼通常叫做執行器、監視器、任務管理器,或者內核,而我們將使用一個更寬泛的術語操作係統。
計算機操作係統是人類創造的最復雜的物體之一:計算機操作係統允許多個計算進程和用戶同時共享一個CPU,保護數據免受未經授權的訪問,並保持獨立輸入/輸齣(I/O)設備的正確運行。操作係統提供的高級服務都是通過嚮復雜的硬件發送一係列詳細的命令實現的。有趣的是,操作係統並不是從外部控製電腦的獨立機製——它還包括一些軟件,這些軟件由執行應用程序的同一處理器執行。事實上,當處理器運行應用程序的時候,處理器是不能執行操作係統的,反之亦然。
保證操作係統總在應用程序運行結束後重新奪迴控製權的安排機製使得操作係統的設計變得非常復雜。操作係統最令人印象深刻的方麵來自於服務和硬件之間的不同:操作係統在低級的硬件上提供高級服務。隨著本書內容的推進,讀者就會理解係統軟件處理像串行接口這樣簡單的設備需要做的事情。而其中的哲學原理很簡單:操作係統應該提供讓編程更加容易的抽象,而不是反映底層硬1件設備的抽象。因此,我們得齣結論:
設計操作係統時,應該隱藏底層的硬件細節,並創建一個為應用程序提供高級服務的抽象機器。
操作係統的設計並不是人們所熟知的工藝。最初,由於計算機的缺乏和價格的昂貴,隻有少數程序員有從事操作係統相關工作的機會。而現在,由於先進的微電子技術降低瞭製造成本使得微處理器不再昂貴,操作係統便成為一種商品,與此同時也隻有少數程序員從事操作係統方麵的工作。有趣的是,由於微處理器變得非常便宜,大多數電子設備都是從可編程處理器構建得到,而不是從離散的邏輯構建得到。因此,設計與實現微機和微控製器的軟件係統不再是專傢的專利,它已成為一個稱職的係統程序員必須能勝任的技術。
幸運的是,隨著生産新機器的技術的發展,我們對於操作係統的理解也在不斷提高。研究人員已經找齣瞭根本問題,製定瞭設計原則,定義瞭基本的組件,並設計瞭組件一起工作的機製。更重要的是,研究人員還定義瞭一係列的抽象,如文件和當前進程(這些抽象對於所有的操作係統都是相同的),並且已經找到瞭實現這些抽象的有效方式。最後,我們知道瞭如何將操作係統的不同組件組織成一個有意義的係統設計與實現。
同早期係統相比,現代操作係統是簡潔的、可移植的。設計良好的係統都遵循著將軟件分割成一係列基本組件的基本設計模式。因此,現代係統就變得更容易理解和修改,相比早期的係統其處理開銷也比較小。
供應商齣售的大型商業操作係統通常包括很多額外的軟件組件。例如,一個典型的操作係統軟件發行版包括編譯器、連接器、裝載程序、庫函數和一係列的應用程序。為瞭區分這些額外的軟件和一個基本的操作係統,我們有時會用內核指代常駐在內存中並且提供諸如並發進程支持等關鍵性服務的代碼。在本書中,操作係統這個術語指的就是內核,而不包括其他附加的功能。一個最小化內核功能的設計有時稱為微內核設計。我們的討論就將集中在微內核上。
1.2 本書的研究方法
本書講解瞭如何構建、設計並且實現操作係統的內核。書中使用瞭工程學方法,而不是僅僅羅列操作係統的特性和抽象地對其進行描述。這種方法嚮我們展示瞭每一個抽象是如何建立的,以及如何將這些抽象組織成一個優雅、高效的設計。
這種工程學方法有兩個優勢。第一,因為本書的內容涵蓋操作係統的每一部分,所以讀者會看到整個係統如何融閤在一起,而不僅僅是一兩個部分之間如何交互。第二,由於讀者可以得到書中描述的所有部分的源代碼,所以任何部分的實現都沒有什麼神秘的地方——讀者可以獲得一份係統的副本來檢查、修改、工具化、測量、擴展或者將其移植到其他架構。在本書的最後,讀者會看到操作係統的每個部分是如何滿足設計需求的,以幫助讀者理解可選的設計方案。
本書的關注點是實現,這意味著代碼是本書的一個重要組成部分。事實上,代碼是討論的核心,必須通過閱讀和學習所羅列的程序來欣賞其中的微妙之處和工程中的細節。例子代碼都非常精簡,這意味著讀者可以集中精力在概念的理解上而不需要費力地閱讀許多頁的代碼。但某些練習建議的改進或修改需要讀者深入細節或者找到其他方案。熟練的程序員會找到更多方法來改進和擴展我們的係統。
……
建造計算機操作係統有點像編織錦緞。這兩種工作的最終成品都是一個和諧一緻、大型、復雜的人造係統。在每一種情況下,最後的人造成品都是由細微但卻精巧的步驟所構造。在編織錦緞時,細節是至關重要的,因為一點點不協調的瑕疵都很容易觀察到。就像錦緞裏的緞麵一樣,加入到操作係統裏的每個新組件都需要與整體的設計相協調。從這個角度看,將不同片段組裝起來的機械加工隻是整個建造過程中的一小部分,一個大師級的産品必須以某個模式為藍本,所有參與係統設計的工作人員都必須遵守這種模式。
有諷刺意味的是,現有的操作係統教材或課程很少對底層的模式和原理進行解釋,而這些模式和原理正是操作係統構造的基礎。在學生看來:操作係統似乎是一個暗箱,而現有的教材則加強瞭這種誤解,因為這些教材所解釋的不過是操作係統的功能,其關注的也隻是操作係統各種能力的使用。更為重要的是,學生在學習操作係統時采取的是從操作係統外麵來察看的方式,從而常常導緻這樣一種感覺:認為操作係統由一組抽象的界麵所組成,這些界麵下的功能由一大堆晦澀神秘的代碼連接在一起,而這些神秘的代碼本身還包含著許多與機器硬件直接相關的、無規律可尋的奇技巧術。
令人驚奇的是,學生一旦從大學畢業,就馬上覺得與操作係統有關的工作已經結束,自己不再需要理解或學習操作係統,因為由商業公司和開源社區所構造的現有操作係統足以應付各種需要,沒有自己什麼事情瞭。但沒有什麼比這種想法離真理更遠瞭。有諷刺意味的是,盡管為個人計算機設計傳統操作係統的公司數量比以前更少瞭,但社會和行業對操作係統技能的需求卻在增長,許多公司雇傭大學生來從事操作係統方麵的工作。社會上這些對操作係統技能的需求來源於更便宜的微處理器,這些便宜的微處理器嵌入在智能手機、視頻遊戲、iPod、Internet路由器、綫纜和機頂盒以及打印機中。
在與嵌入式係統打交道時,有關原理和結構的知識非常關鍵,因為程序員可能需要在現有的操作係統內部構造某種或某個新的機製,或者對現有操作係統進行修改以便可以在新的硬件平颱上運行。而且,為嵌入式設備編寫應用程序時需要理解下層的操作係統。如果不理解操作係統設計的各種細微之處,則不可能充分利用這些小型嵌入式處理器的能力。
本書的目的是揭開操作係統設計中的神秘感,將方方麵麵的材料整閤為一個係統化的整體。本書對操作係統的主要係統組件進行瞭詳細闡述,並以一種層次架構的設計範式來組織這些組件,從而以一種有序、可理解的方式來展開這些內容。與其他評述性書籍不同的是,本書並不盡可能多地提供不同方案,呈現給讀者的將是一個基於傳統過程的、使用實際的、直截瞭當的原語所構造的操作係統。本書從一個裸機開始,一步一步地設計和實現一個小型但優雅的操作係統。這個稱為Xinu的操作係統將成為係統設計的樣闆和模式。
雖然Xinu操作係統的規模較小,可以完全容納在本書中,但該係統卻包括瞭構成一個普通操作係統的全部組件:內存管理、進程管理、進程協調和同步、進程間通信、實時時鍾管理、設備獨立的輸入輸齣、設備驅動、網絡協議和一個文件係統。本書將這些組件組織成一個層次架構,使它們之間的相互連接清晰可見、設計過程淺顯易懂。盡管規模小,但Xinu卻擁有大型係統的能力。此外,Xinu並不是一個玩具係統,它在很多商業産品中得到瞭應用。使用該係統的廠商包括Mitsubishi、Lexmark、HP、IBM、Woodward(woodward.com)、Barnard Software和Mantissa公司。學生通過本書可以學到的重要一課是:不管是小型嵌入式係統還是大型係統,好的係統設計都一樣重要,一個係統的大部分能力都來自於良好的抽象。
本書所覆蓋的所有議題都以一種特定的次序排列,這種次序就是設計人員在構建操作係統時所遵守的工作次序。本書每一章描述設計架構裏的一個組件,並提供示例軟件來演示由該層架構所提供的功能。使用這種方式具有如下幾種優點:第一,每一章所解釋的操作係統的功能子集均比上一章所討論的功能子集更大,這種安排使我們在考慮一層特定架構的設計和實現時不用關心後續層麵的實現。第二,每一章的細節描述在第一次閱讀時可以跳過去,讀者隻需要理解該層所提供的服務即可,而不是這些服務是如何實現的。第三,如果按次序閱讀本書,讀者可以先理解一個功能,然後在後麵看到該功能是如何被後續部分所使用的。第四,有智力挑戰的議題(如對並發的支持)齣現在書的較前麵,高層次的操作係統服務則齣現在後麵。在本書中,讀者將看到大部分核心的功能僅僅隻用幾行代碼就可以完成,這樣我們就可以將大部分的代碼(網絡和文件係統)放到書的較後麵,在讀者已經做齣瞭充分的思想準備後再進行講解。
如前所述,與其他關於操作係統的許多書不一樣的是,本書並不試圖對每個係統組件的每種實現方案進行評估,也不對現有的商業係統進行綜述。而是選擇對一組使用最廣泛的操作係統原語的實現細節進行闡述。例如,在討論進程協調的一章,我們解釋的是信號量(使用最廣泛的進程協調原語)原語,而對其他原語(如監視器)的討論則放到練習裏。我們的目的是展示如何將原語在傳統的硬件上實現,消除神秘。學生一旦理解瞭一組特定原語的魔力,其他原語的實現也就容易掌握瞭。
本書的示例代碼可以運行在Linksys E2100L無綫路由器上,該無綫路由器在零售商店裏就可以買到。隻不過,我們並不是將Linksys硬件作為一個無綫路由器來使用。我們的做法是,打開Linksys設備,將一根串行綫連接到其控製端口,使用該串行綫來中斷Linksys正常的啓動過程,並通過輸入命令來迫使Linksys硬件下載和運行一個Xinu操作係統副本。也就是說,我們基本上忽略供應商所提供的軟件,而是對其底層的硬件進行控製來運行Xinu。
本書適用於高年級的本科生或者研究生,也適用於那些想瞭解操作係統的計算機從業人員。在本書所提供的全部材料裏,雖然沒有任何議題的難度達到不能理解的程度,但學習本書的全部內容可能需要超過一學期的時間。本科生裏很少有學生能夠熟練地閱讀串行程序,而理解運行時環境的細節或機器架構的學生就更少瞭。因此,必須對學生進行仔細引導,以便使其可以掌握進程管理和進程同步的知識。如果時間有限,我推薦覆蓋的內容包括第1章~第7章(進程管理)、第9章(基本的內存管理)、第12章(中斷處理)、第13章(時鍾管理)、第14章(設備無關的I/O)和第19章(文件係統)。此外,對於一個完整學期的本科生課程來說,討論第20章的遠程文件係統等基本的遠程訪問議題也很重要。對於研究生課程來說,學生應當完整地閱讀整本書,課堂討論則應該專注於一些微妙的細節、各種摺中和不同實現方案的比較。不管是本科生課程還是研究生課程,都應該包括的兩個議題是:1)在初始化階段,當一個運行中的程序轉化為一個進程時所發生的各種改變;2)當輸入行裏的字符序列作為一個字符串變量傳遞給命令進程時,在操作係統殼裏所發生的轉化。
在所有情況下,如果學生能夠在實驗室中對係統進行動手實驗,則學習的效果將大幅提高。理想的狀態下,學生可以在課程的最初幾天或幾個星期開始使用這個係統,然後再試圖理解係統的內部結構。本書第1章提供瞭幾個例子和一些能夠引起學生興趣的實驗(令人吃驚的是,很多學生在學習過操作係統課程後,卻沒有寫過一個並發程序或使用過操作係統功能)。
如果要在一個學期內覆蓋本書的大部分內容,則要求極快的進度,而這在本科生課程裏難以達到。此時,選擇略去哪些內容將很大程度上取決於選修本課程的學生的背景。在係統課程裏,我們需要課堂講解時間來幫助學生理解動機和細節。如果學生修過的“數據結構”課程裏對內存管理和錶處理進行過討論,則本書第4章和第9章的內容可以略過。如果學生在將來會選修網絡方麵的課程,則第17章的網絡協議內容也可以跳過。此外,本書包括一章遠程磁盤係統和一章遠程文件係統,這兩章的內容存在一些相似之處,可以略過一章。相對來說,遠程磁盤係統一章的內容可能更加貼切,因為該章引入瞭磁盤塊緩存的議題,而該議題對於許多操作係統來說都非常重要。
在研究生課程裏,課堂時間可以用來討論動機、原理、摺中、不同原語集和不同的實現方案比較。學生在本課程學習結束後,應當對進程模型、中斷和進程之間的關係有一個深刻的理解,同時也將具備理解、創建和修改係統組件的能力。學生應當在大腦中建立起瞭整個係統的完整概念模型,並且知道所有的組件之間是如何交互協作的。
我推薦在各個層麵上設計程序設計實驗。本書的許多練習都推薦對代碼進行修改或者測量,或者嘗試不同的實現方案。相關的軟件可在下麵的網站上免費下載,該網站上還列有如何創建一個Linksys實驗平颱的指令:www.xinu.cs.purdue.edu。
因為Linksys的硬件非常便宜,所以構建一個實驗的成本很低。此外,我們也有用於其他硬件平颱的軟件版本,這些版本包括x86和ARM的一個功能有限的版本。
本書中的許多練習都建議進行改進、實驗和不同實現,但是也可以設計大型實驗項目。可以用於不同硬件平颱的大型實驗例子包括:虛擬內存係統、不同計算機之間指令執行的同步機製、虛擬網絡的設計等。例如,普度大學的一些學生就將Xinu操作係統移植到瞭各種處理器上,或者為各種I/O設備編寫瞭設備驅動程序。
學習本書前,學生需要具備基本的程序設計能力。學生應當理解基本的數據結構,這些基本結構包括鏈錶、棧和隊列,並且應當用C語言寫過程序。
最後,我鼓勵設計人員盡可能使用高級程序設計語言,僅在必要的情況下纔使用匯編語言。根據這種原則,Xinu操作係統的大部分都是用C語言編寫的。少數一些與機器相關的功能,如上下文切換和中斷分配器的最底層功能,則是用匯編語言寫成的。所有的匯編語言代碼都附有解釋和注釋,使讀者無需學習匯編語言的細節就可以理解這些代碼。此外,我們還提供用於其他平颱的Xinu版本,這樣就可以對在各種平颱上實現Xinu操作係統的成本進行比較。例如,我們可以對在MIPS處理器上實現Xinu所需要的代碼量和在其他處理器架構(如x86)上實現Xinu所需要的代碼量進行比較。
本書的成書要歸功於我過去在商業操作係統上所獲得的各種經驗,這些經驗有好也有壞。雖然Xinu操作係統與現有的操作係統在內部機製上並不相同,但其基本的思想卻並不新穎。另外,雖然Xinu係統裏的許多概念和名稱都來自於UNIX係統,但讀者應當注意,這兩個係統裏的許多函數所使用的參數和內部結構有巨大的不同。因此,為一個係統所寫的應用程序在未經修改的情況下不能在另一個平颱上運行。
我感謝為Xinu項目貢獻瞭思想、辛勞和激情的所有人的幫助。在過去的歲月裏,普度大學的許多研究生都從事過本係統的工作,他們為Xinu進行過移植,寫過設備驅動。從原始的係統版本開始,Xinu到目前已經走過瞭30多年的曆程。本書的Xinu版本是原始版本的一個完全重寫,但卻保留瞭原始設計的優雅。Dennis Brylow將Xinu移植到瞭Linksys平颱,並且創建瞭許多底層的構件,包括啓動代碼、上下文切換和Ethernet驅動。Dennis還設計瞭重啓機製,並應用在普度大學的實驗室裏。另外,我特彆要感謝我的妻子和我的閤作夥伴Christine,她的仔細編輯和建議讓本書改善良多。
Douglas E.Comer
2011年8月
对理解操作系统的实现很有帮助
评分好书 有点难 适合本科毕业想考研的同学
评分质量很好,价格实惠,送货及时。
评分经典丛书
评分学习操作系统的,可以参考的一本书
评分很不错的一本书,源码很好
评分很不错的一本书,源码很好
评分keyi
评分书质量很不错,都是正版的,价格也比较优惠。京东客服态度很好,比较有礼貌,疑问都能很好解决。送货速度也很快,上午下单,下午就能送到。不是专业的,所以具体的内容不怎么太懂,别人看了都说是蛮不错的书,挺有用的。
本站所有內容均為互聯網搜索引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度,google,bing,sogou 等
© 2025 tushu.tinynews.org All Rights Reserved. 求知書站 版权所有