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

圖1 OS Portal的結構圖
OS Portal的結構通常,內核動(dòng)態(tài)加載模塊的時(shí)候,模塊的連接工作由內核完成。Chang DaWei的方法的獨特之處在于把模塊連接的工作交給服務(wù)器端執行,不但降低了對內存空間的需求,也減輕了內核的負擔。
2、其他相關(guān)研究
(1) 基于FPGA的可動(dòng)態(tài)配置的片上系統
FPGA(Field Programmable Gate Array,現場(chǎng)可編程門(mén)陣列)是電子設計領(lǐng)域中最具活力和發(fā)展前途的一項技術(shù)。FPGA能完成任何數字器件的功能,上至高性能CPU,下至簡(jiǎn)單的74電路,都可以用它來(lái)實(shí)現。FPGA在嵌入式系統中的應用越來(lái)越廣泛。John Williams和Neil Bergmann[6]用uCLinux作為操作系統平臺,設計出可動(dòng)態(tài)配置的片上系統(rSoC)。uCLinux從遠程服務(wù)器上下載FPGA程序代碼,然后利用shell腳本工具將代碼寫(xiě)進(jìn)FPGA芯片,實(shí)現系統功能的可動(dòng)態(tài)擴展。
(2) 動(dòng)態(tài)更新Linux內核變量的方法
在進(jìn)行Linux內核嵌入式開(kāi)發(fā)時(shí),經(jīng)常使用內核啟動(dòng)過(guò)程中讀取靜態(tài)配置文件內容的方法對內核某些變量進(jìn)行初始化。當靜態(tài)配置文件改動(dòng)時(shí),只有重新啟動(dòng)內核才能使新的配置生效。北京科技大學(xué)的田玉鳳等人[7]通過(guò)修改文件./include/linux/proc_fs.h,重新編譯、安裝新內核后,利用/proc文件系統,可動(dòng)態(tài)改變Linux內核變量。
(3) 在用戶(hù)空間擴展Linux操作系統功能的方法
與內核空間功能擴展相比,在用戶(hù)空間擴展安全性更強,對Linux操作系統和應用程序更加透明。魏東林、盧正鼎等人通過(guò)在用戶(hù)空間跟蹤截獲系統調用并更改系統調用的行為來(lái)達到擴展操作系統功能的目的[8]。從本質(zhì)上來(lái)說(shuō),該方法和本文第1部分提到的可擴展內核技術(shù)是一樣的。
3、動(dòng)態(tài)擴展技術(shù)面臨的挑戰和發(fā)展趨勢
(1) 高實(shí)時(shí)性是嵌入式系統的基本要求
由于Linux是一種通用操作系統,而不是一個(gè)真正的實(shí)時(shí)操作系統,內核不支持事件優(yōu)先級和搶占實(shí)時(shí)特性(2003年底推出的Linux2.6 內核實(shí)現了一定程度上的可搶占性),所以,在進(jìn)行嵌入式Linux系統動(dòng)態(tài)擴展性研究開(kāi)發(fā)時(shí),首要的問(wèn)題是擴展Linux的實(shí)時(shí)性能。系統在進(jìn)行動(dòng)態(tài)擴展的過(guò)程中,如果擴展的過(guò)程時(shí)間太長(cháng),肯定會(huì )影響到系統的實(shí)時(shí)響應,所以要求擴展過(guò)程快速完成,例如基于LKM的內核擴展機制。如果模塊加載或替換的時(shí)間太長(cháng),在規定的時(shí)間內不能完成,這對于嵌入式Linux的某些應用來(lái)說(shuō)是不能接受的。
(2) 資源有限性是嵌入式系統基本特征
嵌入式系統無(wú)多余軟件也無(wú)多余硬件存儲器,增加存儲空間意味著(zhù)成本的上升。在非常有限的存儲空間中要實(shí)現快速的內核動(dòng)態(tài)擴展,對研究人員來(lái)說(shuō)是一個(gè)極大的挑戰。在桌面PC世界,雖然已經(jīng)有很多動(dòng)態(tài)擴展系統功能的方法,但在嵌入式世界很難實(shí)現。例如Linux系統的LKM機制,若模塊加載過(guò)程不經(jīng)改造,在嵌入式Linux系統中是不能使用的。
(3) 期待完善的集成開(kāi)發(fā)環(huán)境
一個(gè)完整的嵌入式系統的集成開(kāi)發(fā)環(huán)境一般需要編譯/連接器、內核調試/跟蹤器和集成圖形界面開(kāi)發(fā)平臺。其中的集成圖形界面開(kāi)發(fā)平臺包括編輯器、調試器、軟件仿真器和監視器等。在Linux系統中,具有功能強大的gcc編譯器工具鏈,使用了基于GNU的調試器gdb的遠程調試功能,一般由一臺客戶(hù)機運行調試程序調試宿主機運行的操作系統內核;在使用遠程開(kāi)發(fā)時(shí)還可以使用交叉平臺的方式,如在Windows平臺下的調試跟蹤器對Linux的宿主系統作調試。但是,Linux在基于圖形界面的特定系統定制平臺的研究上,與Windows操作系統相比還存在差距。因此,要使嵌入式Linux動(dòng)態(tài)擴展的研究更加方便、快捷,整體集成開(kāi)發(fā)環(huán)境還有待提高和完善。
桌面Linux使用LKM技術(shù)成功實(shí)現了系統功能的動(dòng)態(tài)擴展。嵌入式Linux繼承了桌面Linux絕大部分功能和特性,桌面Linux固有的 LKM機制為嵌入式Linux動(dòng)態(tài)擴展的研究帶來(lái)了先天性的優(yōu)勢,可大大節省研究人員的時(shí)間和精力。在動(dòng)態(tài)模塊替換方面也有了很大的發(fā)展,Chris Walton等人[9]通過(guò)對二空間拷貝垃圾回收算法進(jìn)行改進(jìn),在2000年提出了一種動(dòng)態(tài)模塊替換的抽象機模型。
基于JOS的動(dòng)態(tài)擴展技術(shù)是一個(gè)主要發(fā)展方向。Java代碼可移植性強,容易維護,在嵌入式系統上很有發(fā)展前途。采用Java技術(shù)的另外一個(gè)好處是可實(shí)現代碼重用,在進(jìn)行嵌入式系統開(kāi)發(fā)時(shí)不必每次都從零開(kāi)始。很多研究成果也促進(jìn)了Java在嵌入式系統上的應用。Derek Rayside等人在2002年提出一種類(lèi)庫子集選擇方法[10]。該方法可以讓嵌入式系統中的Java程序在運行時(shí)從遠程Java類(lèi)庫中僅選擇所需要的子集,然后下載到本地系統,從而減小對嵌入式系統存儲空間的需求,解決了因Java語(yǔ)言的類(lèi)庫太大而阻礙了在嵌入式系統中的應用。
結束語(yǔ)
隨著(zhù)嵌入式Linux的快速發(fā)展和嵌入式Linux設備的普及,人們對可動(dòng)態(tài)擴展的嵌入式Linux的需求越來(lái)越迫切。目前主要的幾種可動(dòng)態(tài)擴展系統功能的技術(shù),例如微內核技術(shù)、JOS技術(shù)、LKM技術(shù)等,由于嵌入式系統的存儲空間有限,實(shí)時(shí)性要求高,在應用到嵌入式Linux系統中時(shí)都有所不足。其中,桌面Linux固有的LKM機制為嵌入式Linux動(dòng)態(tài)擴展的研究帶來(lái)了先天性的優(yōu)勢;另外,Java代碼可移植性強,維護容易,在嵌入式系統上很有發(fā)展前途,因此基于JOS的動(dòng)態(tài)擴展技術(shù)是另一個(gè)主要發(fā)展方向。最后,一個(gè)完善的嵌入式Linux集成開(kāi)發(fā)環(huán)境是每一個(gè)開(kāi)發(fā)人員所期待的。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論