淺談組件機制與操作系統的實現

淺談組件機制與操作系統的實現

淺談組件機制與操作系統的實現

1 引言

當前,操作系統的功能不斷擴展,操作系統的類型呈現出多樣化的趨勢。一個小規模的開發小組已經不可能完全從頭開始實現一個實用的操作系統,而一般情況下,研究人員只對操作系統的一些特定領域感興趣,而對於另外一些元素,如啓動加載代碼、核心啓動代碼、設備驅動程序和內存分配代碼等往往不感興趣,但是一個可運行的原型系統又必須包含這些內容。編寫這些基礎結構延緩了操作系統研究項目的進度,同時也增加了進行操作系統研究的代價。爲了解決這一問題,猶他大學的FLUX研究小組開發了OSKit,它提供了一個框架和一組模塊化的、具有簡單接口的庫以及一組清晰的、可重用的OS組件。OSKit可以用來構建操作系統內核、外層服務和其他核心OS功能模塊。OSKit提供了各種功能模塊,諸如簡單自舉,一個可用於內核的最小化POSIX環境、與物理內存和其約束一致的內存管理、廣泛的調試支持,以及高層子系統如協議棧和文件系統。開發者可以根據自己的研究興趣或所要考慮的性能來使用這些模塊,或用他們自己的模塊來替代標準的OSKit模塊。

OSKit公開了它內部的實現細節,允許用戶從成熟的操作系統中不加修改地提取代碼,然後通過一小部分經過仔細設計的粘接代碼將它們合併到一起,隔離它們的依賴性,並輸出良好定義的接口。OSKit使用這一技術整合了許多穩定而成熟的源代碼,包括設備驅動、文件系統、網絡協議等等。實踐表明,使用組件軟件架構和重用技術會給操作系統實現領域帶來大的影響。

2 組件技術簡介

組件技術是一種較新的軟件開發技術。到目前爲止,還難以確定組件技術的明確定義。比如,對組件技術的常見說法有以下這些:“二進制軟件單元”、“任意場合可部署的軟件”、“特別適合第三方開發”和“規範定義的接口”等等。大致上可以這樣理解:所謂組件,其實就是一種可部署軟件的代碼包,其中包括某些可執行模塊。組件單獨開發並作爲軟件單元使用,它具有明確的接口,軟件就是通過這些接口調用組件所能提供的服務,多種組件可以聯合起來構成更大型的組件乃至直接建立整個系統。組件的實現必須支持一種或者多種其用戶所希望獲得的接口。實現組件並不一定需要採用面嚮對象語言。爲了構造新應用程序,軟件開發人員找出適當的組件,將這些組件加入到正在開發中的應用程序,同時對應用程序進行測試並保證應用程序的組裝工作按照預定的規劃正常進行。採用組件技術能降低開發、測試和維護成本,提高可靠性和穩定性。

3 Oskit組件綜述

OSKIT的組件庫提供了一般情況下更高層的功能,它通常只對外開放一些相關的公用調用接口。目標系統通過OSKit的面向對象的COM接口來與這些組件進行交互。以下幾節概述了OSKit所提供的組件。

3. 1 引導程序

大多數操作系統多有自身的啓動加載機制,彼此互不兼容。這種加載機制的多樣性並不是由於每個OS所要求的自舉服務不同而引起,而是由於構建啓動加載器的特定方式造成的。因爲從操作系統研究的立場來看,啓動加載器是一個令人不敢興趣的領域,因此OS開發者通常進行一個最小化、快捷的設計。由於設計理念和要求的輕微差別,每個啓動加載器都不適用於下一個OS。爲了解決這個問題,OSKit直接支持多啓動標準,這一標準是由幾個OS項目的成員共同設計的,它的目的是提供一個簡單而通用的啓動加載器與OS內核間的接口,從而允許一個啓動加載器加載任何兼容的OS。

在進行操作系統研究時,多啓動標準非常有用,這其中的主要原因是啓動加載器在加載內核自身的同時還具有加載附加文件或者啓動模塊的能力。這裏的一個啓動模塊只是一個普通文件,啓動加載器不以任何方式解釋它,而僅僅把它隨同內核映像一起加載到保留物理內存塊中。在啓動內核時,啓動加載器提供給內核以下內容:物理地址的列表、所有已加載的啓動模塊的大小,以及與每個模塊相聯繫的由用戶定義的字符串。這些啓動模塊和與它們相聯繫的用戶定義的字符串由內核解釋。這樣做的目的是爲了通過提供內核啓動時需要的數據,諸如初始化程序、設備驅動和文件系統服務器,來減輕內核啓動的負擔。

3.2核心支持庫

OSKit核心支持庫的主要用途是讓客戶OS更容易訪問硬件設施。它包含了一個較大的實用函數和符號定義的集合,該集合對於管理模式代碼是非常具體的。與此相對應,OSKit的大多數其他庫在用戶模式代碼中通常很有用。和OSKit的其餘部分所不同的是,多數核心支持代碼必須是針對特定系統結構的,而這些特定機器的細節對客戶OS也是有用的。例如,在x86機器上,核心支持庫包含一些函數,用來創建和操縱x86頁表和段寄存器。其他OSKit組件通常提供建立在這些低層機制上的與體系結構無關的設施,但是爲了提供最大的靈活性,與特定結構相關的接口始終可以被訪問。

OSKit核心支持庫在x86體系結構上尤爲重要,因爲該體系結構的OS級編程環境特別複雜和模糊。核心支持庫仔細地設置了一個基本的32位執行環境(爲了與MS-DOS兼容,x86處理器通常以16位模式開始),初始化段和頁轉換表,安裝一箇中斷向量表,並提供缺省的陷阱和中斷處理程序。當然,客戶OS能夠修改或重載這些行爲。然而,在缺省情況下,核心支持庫自動地做所有必要的工作,以便使處理器進入一個方便的執行環境,此時中斷、陷阱、調試以及其他標準設施已經如預期的那樣開始工作。該庫在缺省情況下自動地定位所有隨內核加載的啓動模塊,並保留它們所在的物理內存。接下來,應用程序可以很容易使用它們。客戶OS只需以標準C語言風格提供一個main()函數。一切都設置好以後,內核支持庫將用所有參數和由啓動加載器傳遞過來的環境變量來調用它。

3.3內存管理庫

如同在一個標準C語言庫中實現的malloc()一樣,內存管理代碼典型地用於用戶空間。通常並不適用於內核。設備驅動常常需要分配特定類型的內存,並伴隨具體的調整屬性。例如,對於內建的DMA控制器只能訪問最初的16M物理內存。爲解決這些內存管理問題,OSKit包含了兩個簡單而靈活的內存管理庫:(1)基於隊列的內存管理器(或稱LMM),它提供了功能強大且高效的原語來進行分配管理,並支持在一個池中管理多種類型的內存。(2)地址映射管理器(或稱AMM)被設計用來管理不必直接映射到物理內存或虛擬內存的地址空間,它對OS的其他方面提供了類似的支持,諸如進程地址空間、分頁、空閒塊或IPC名字空間的管理。儘管這些庫可以很容易地應用在用戶空間,但實際上它們是被特別設計用來滿足OS內核的需求。

3.4 最小C語言庫

成熟的OS內核一般都包含着相當數量的僅僅用來重新實現基本的C語言庫函數如printf()和malloc()的代碼。與此形成對比的是,OSKit提供了一個最小化C語言函數庫,它圍繞着最小化依賴性而不是最大化函數性和性能的原則來設計。

3.5調試支持

OSKit的一個最實用的好處是:給定一個適當的硬件設置,它立刻就能提供給OS開發者一個完全源代碼級的.內核調試環境。OSKit內核支持庫包括一個可用於GNU調試器(GDB)的串行存根模塊,它在客戶OS環境中處理陷阱,並使用GDB的標準遠程調試協議通過一個串行程序與運行在另一臺機器上的GDB通信。甚至當客戶機OS執行自己的陷阱處理時,OSKit的GDB存根模塊也是可用的。如果客戶OS提供適當的鉤子,它甚至支持多線程調試。除了基本的調試器支持,OSKit也提供了一個內存分配調試庫,它可以跟蹤內存分配並檢測一般的錯誤,如緩衝區溢出和釋放已釋放的內存。這個庫提供了與許多普通應用程序調試器相似的功能性,所不同的是它運行在由OSKit提供的最小內核環境中

3.6 設備驅動支持

在OS開發和維護中最艱鉅的一個任務是支持多種多樣的I/O硬件。這些複雜的設備常會含有潛在的錯誤,而新硬件的發佈又常常伴隨着不兼容的軟件接口。由於這些原因,OSKit採用了爲現有內核開發的穩定的、經過充分測試的驅動程序。OSKit使用了一種封裝技術,將現有的驅動程序代碼基本上未加修改地合併到OSKit中。這些現有的驅動程序被一個OSKit粘結代碼層所包裝,從而使得這些驅動程序可以在與開發它們的環境完全不同的環境中工作。目前,來自Linux的大多數以太網卡、SCSI和IDE磁盤的設備驅動程序被包括進來,總數超過了五十種。用同樣的方式,來自FreeBSD的八個字符設備驅動程序也被包含了進來,它們支持標準PC控制檯和串口及不同的多串口板。由於OSKit把這些驅動仔細地進行了包裝,FreeBSD驅動程序可以與Linux驅動程序一起工作。

3.7 協議棧

OSKit提供了一個完整的TCP/IP網絡協議棧。如同驅動程序一樣,有關網絡的代碼也可以通過封裝機制被合併進來。OSKit當前可以從Linux中獲取網絡設備驅動程序,它們是PC平臺可獲得的最大的免費資源。OSKit的網絡組件繼承於FreeBSD4.4,它通常被認爲具有更多成熟的網絡協議。這顯示了使用封裝機制將現有軟件包裝成靈活的組件的第二個優點:即從不同的資源中獲取最好的組件,並讓它們一起被使用。

3.8文件系統

通過使用封裝技術,OSKit吸收了NetBSD的基於磁盤的文件系統代碼。NetBSD之所以被選擇爲首要資源庫,是因爲在可用的系統中,它的文件系統代碼被最清晰地分離了出來,而FreeBSD和Linux的文件系統與它們的虛擬內存系統結合的更緊密。當前,OSKit也把Linux文件系統合併了進來,以便能夠支持多種類型的文件系統格式,如Windows95、OS/2和System V的文件系統格式等等。

OSKit文件系統輸出的COM接口類似於許多Unix文件系統所使用的內部VFS接口。這些接口具有很好的粒度,使我們可以不必接觸OSKit文件系統的內部。例如,OSKit接口只接受簡單的路徑名組件,允許安全封裝的代碼執行適當的訪問許可檢查。

4 OSKit的現狀

自從在1996年6月發佈了OSKit的第一個公開發行版以來,OSKit已經更新了多次,每次更新都增加了一些算法,並修正了一些錯誤。最新的發行版是2002年3月的版本。由此可見,OSKit一直處於操作系統開發平臺的前沿,其自身也在不斷完善和發展。

5 結論

作爲一個操作系統研究與開發的平臺,OSKit大大減輕了操作系統研究與開發者的負擔。它可以讓開發人員避開復雜的底層,而把興趣集中與他們所感興趣的領域。開發者可以用自己編寫的組件來取代OSKit中的部分組件,以滿足自己特定的需要,從而豐富了操作系統的應用層。總之,OSKit滿足了實際客戶系統的需求,有助於操作系統的研究與開發。