嵌入式Linux系統中內核抽象的動態(tài)擴展技術
嵌入式系統由于其工作環(huán)境、位置分布、與應用系統的結合方式等方面的原因,在系統的升級、修改方面存在著相當的困難,且費用高。目前大多數嵌入式系統內核只能在一定程度上進行靜態(tài)擴展,這意味著修改某些內核屬性值后要重新編譯內核,對普通用戶而言難以實現。通信的發(fā)展使得嵌入式操作系統的動態(tài)擴展成為可能,可以在遠程控制的基礎上增加嵌入式系統的靈活性,延長嵌入式系統的壽命;同時,由于嵌入式Linux的應用日益廣泛,研究嵌入式Linux的動態(tài)擴展具有重要意義。
動態(tài)擴展是指系統在運行狀態(tài)下實現系統的升級和維護。動態(tài)擴展技術目前被廣泛應用在軟件系統開發(fā)的各個領域。組件、可擴展的數據庫系統、主動網等多種技術都是動態(tài)擴展技術在各個領域的具體體現。在嵌入式操作系統領域,動態(tài)擴展技術研究的主要目標是實現內核抽象的擴展。實現操作系統內核抽象的動態(tài)擴展能夠提高系統的靈活性、適應性,使系統能夠根據應用的需求,提供特定的服務。然而,由于嵌入式系統硬件資源有限,這對研究嵌入式Linux系統核心的動態(tài)擴展性是一個極大的挑戰(zhàn)。
本文主要討論嵌入式Linux系統中內核抽象的動態(tài)擴展技術。
1、幾種主要的內核動態(tài)擴展技術的分析
當前應用于操作系統中的動態(tài)擴展技術主要有四種:微內核技術、可擴展內核技術、解釋器技術/JOS技術和內核下載技術/LKM技術[1,2]。 這三種技術已經在桌面操作系統的不同環(huán)境中得到了充分的應用。嵌入式操作系統及其使用環(huán)境具有桌面操作系統所不同的特征,它在性能、地址空間、所需存儲空間和底層訪問頻率等方面的特征,使得我們在擴展技術的選擇上需要加以權衡。
(1) 微內核技術
在微內核操作系統中,內核中包括了一些基本內核功能(如創(chuàng)建和刪除任務、任務調度、內存管理和中斷處理等),部分操作系統抽象和關鍵服務(如文件系統、網絡協議棧等),都是在用戶空間運行的。這大大減小了內核的體積,同時也極大地方便了整個系統的升級、維護和移植。系統通過核心到用戶層向上調用服務的方法來為應用程序提供服務。由于服務存在于用戶層,用戶可通過修改服務來獲得不同的行為,因而也稱為用戶層擴展技術。由于所有的應用程序都要利用操作系統提供的API或系統調用,完成內存管理、進程管理、I/O、設備管理等,因此通過在用戶空間監(jiān)視并截獲某個進程的系統調用,然后將擴展功能代碼插入系統調用中,就可以擴展Linux操作系統功能。
與內核空間功能擴展相比,在用戶空間擴展安全性更強,對Linux操作系統和應用程序更加透明。用戶層擴展技術的缺點在于,將服務提升到用戶層使程序運行過程中核心態(tài)和用戶態(tài)之間的切換和自陷次數增加,導致系統負載增加,系統性能下降。另外,微內核與傳統的嵌入式Linux內核在結構上是完全不同的。在嵌入式Linux中,如果采用該技術來增加系統的動態(tài)擴展性能,需要對內核結構重新設計。
(2) 可擴展內核技術
可擴展內核技術允許用戶應用程序向內核植入(inject)代碼以擴展其功能。由于被植入的代碼是在核心態(tài)運行,從而避免了微內核技術中的系統性能下降的問題。被植入的代碼是在核心態(tài)運行,需要有一個實時檢查機制來驗證代碼的安全性,保證被植入代碼不會導致系統的崩潰。程步奇等人使用軟件故障孤立技術來實現擴展模塊的故障孤立,保證系統不受到擴展模塊的破壞。 Bershad等人也使用軟件故障孤立技術來限制被植入代碼可訪問的內存地址范圍。代碼安全性檢查無疑增加了系統的負擔,問題產生的根本原因是那些被植入的擴展性代碼對核心來說是不可信任的。為了減輕系統的負擔,就需要假設被植入的代碼是安全的、可信任的。
(3) 解釋器技術/JOS技術
與文獻中提到的JOS(Java Operating System)技術相同,該技術允許開發(fā)者用Java語言編寫系統模塊,例如TCP/IP協議?;蛭募到y。將這些模塊編譯成類(class)文件,并在系統運行時由JVM(Java Virtual Machine)動態(tài)地加載。Liao等人在1996年提出,將JVM插入到微內核中,從而可以讓用戶編寫Java程序,以擴展內核功能。
解釋器技術是以解釋的方式來執(zhí)行程序代碼的,比較適合于交互式系統;與編譯器相比,解釋器/JVM在移植時相對簡單;解釋器通過采用中間代碼表示的方法,當代碼長度小于500 KB的時候,可執(zhí)行的中間代碼通常比編譯產生的二進制代碼小,這一點很適合于存儲空間非常有限的嵌入式系統;最后,Java代碼容易維護和編寫,可移植性好,可實現代碼重用。采用解釋器技術的缺點是,中間可執(zhí)行代碼的執(zhí)行速度慢。在嵌入式Linux系統中,內核很大一部分由應用所共享,甚至應用程序本身就是內核的一個線程,執(zhí)行頻率高,采用解釋器技術會大大降低系統的效率。有些Java平臺采用即時(Just in time)編譯技術來改進代碼的執(zhí)行速度。該技術是利用空間來換取時間,因此很難在硬件資源非常有限的嵌入式系統上實現。此外,由于Java語言的類庫很大,在一定程度上也阻礙了其在資源有限的嵌入式系統中的發(fā)展。
(4) 內核加載技術/LKM技術
許多桌面操作系統,例如Linux,提供LKM(Loadable Kernel Module)來動態(tài)擴展它們的內核。當模塊(Module)安裝到內核后就作為核心的一部分,不進行實時安全檢測,全速運行。在嵌入式Linux系統中,LKM的主要問題是:存儲模塊需要占用額外空間以及被加載模塊的安全性。模塊的安全問題可以通過軟件保護技術來解決。
Oikawa等人在1996年提出一種與LKM類似的動態(tài)核心模塊(DKMs)技術。與LKM一樣,DKMs以文件的形式存儲并能在系統運行過程中動態(tài)地加載和卸載。DKMs由一個用戶層的DKM服務器來管理,并非由內核來管理。當核心需要某模塊時,由DKM服務器負責把相應的DKM加載;當核心的內存資源緊缺時,由DKM服務器負責卸載一個沒有被使用的DKM。缺點是所有的DKM是存儲在本地系統上的,占用了大量寶貴的存儲空間。
與Oikawa的方法不同,Chang DaWei 等人于2003年提出了OperatingSystemPortal framework(OSP)的方法。該方法是將核心模塊存儲在一個資源充足的遠程服務器上,并由服務器端工具OS Portal來管理所存儲的模塊,同時也負責處理客戶端(嵌入式系統內核)發(fā)出的請求,按照請求動態(tài)的選擇并連接模塊,然后通過網絡傳到客戶端。由于模塊的管理和連接都在服務器端,所以對客戶端來說可以節(jié)省大量的資源空間。OS Portal的結構如圖1所示。
圖1 OS Portal的結構圖
評論