全面了解應(yīng)運而起嵌入式Linux
你了解嵌入式Linux么?嵌入式發(fā)展越來越普及,隨著硬件的發(fā)展,嵌入式系統(tǒng)變得越來越復(fù)雜,很多行業(yè)都在應(yīng)用嵌入式,在這里為你介紹嵌入式Linux。完整的嵌入式Linux解決方案應(yīng)包括嵌入式Linux操作系統(tǒng)內(nèi)核、運行環(huán)境、圖形化界面和應(yīng)用軟件等。
由于嵌入式設(shè)備的特殊要求,嵌入式Linux解決方案中的內(nèi)核、環(huán)境、GUI等都與標(biāo)準(zhǔn)Linux有很大不同,其主要挑戰(zhàn)是如何在狹小的FLASH、ROM和內(nèi)存中實現(xiàn)高質(zhì)量的任務(wù)實時調(diào)度、圖形化顯示、網(wǎng)絡(luò)通信等功能。
1、 精簡內(nèi)核
Linux內(nèi)核有自己的結(jié)構(gòu)體系,其中進程管理、內(nèi)存管理和文件系統(tǒng)是其最基本的3個子系統(tǒng)。圖1簡單表示了它的框架。用戶進程可直接通過系統(tǒng)調(diào)用或者函數(shù)庫來訪問內(nèi)核資源。正因為Linux內(nèi)核具有這樣的結(jié)構(gòu),因此修改內(nèi)核時必須注意各個子系統(tǒng)之間的協(xié)調(diào)。
嵌入式Linux內(nèi)核一般由標(biāo)準(zhǔn)Linux內(nèi)核裁剪而來。用戶可根據(jù)需求配置系統(tǒng),剔除不需的服務(wù)功能、文件系統(tǒng)和設(shè)備驅(qū)動。經(jīng)過裁剪、壓縮后的系統(tǒng)內(nèi)核一般只有300k左右,十分適合嵌入式設(shè)備。同標(biāo)準(zhǔn)Linux不同的是嵌入式Linux必須要實現(xiàn)從FLASH或ROM的啟動。標(biāo)準(zhǔn)Linux啟動代碼實現(xiàn)了系統(tǒng)初始化和從軟盤、硬盤O盤區(qū)引導(dǎo)內(nèi)核。嵌入式Linux一般保存在FLASH或ROM中,標(biāo)準(zhǔn)LILO無法引導(dǎo)。在支持直接從FLASH設(shè)備引導(dǎo)的系統(tǒng)中,如華恒公司的uClinux,引導(dǎo)程序主要完成對硬件系統(tǒng)的初始化工作和操作系統(tǒng)的解壓、移位工作。在不支持直接從FLASH引導(dǎo)的系統(tǒng)中,F(xiàn)LASH設(shè)備只能作為非引導(dǎo)磁盤使用。此時,可采用先從硬盤或軟盤加載一個小操作系統(tǒng),如嵌入式DOS,然后再執(zhí)行"Loadlin"加載程序從FLASH引導(dǎo)嵌入式Linux。
對標(biāo)準(zhǔn)Linux的修改主要是虛擬內(nèi)存和調(diào)度程序部分的改動。因為標(biāo)準(zhǔn)Linux系統(tǒng)使用虛擬內(nèi)存管理的目的是為了能同時運行多個進程,但是這樣每個待運行的進程所能分配的CPU時間片就受限制,資源的使用效率就低。這樣對于實時性要求較高的嵌入式系統(tǒng)來說,實時任務(wù)往往要求CPU具有很高的突發(fā)處理能力,即在有些時候需要極高的處理效率,因此需要屏蔽內(nèi)核的虛擬內(nèi)存管理機制。對于無硬盤設(shè)備的嵌入式系統(tǒng),不必采用虛存管理。強實時需求的嵌入式應(yīng)用可以通過修改任務(wù)調(diào)度模塊實現(xiàn),主要是在內(nèi)核和設(shè)備驅(qū)動程序中加入了許多切換點。在該點處,系統(tǒng)檢測是否存在未處理的緊急中斷,有則剝奪內(nèi)核的運行,及時處理中斷。實現(xiàn)實時性服務(wù)的一個較好的方法是在標(biāo)準(zhǔn)的Linux內(nèi)核上增加一個實時內(nèi)核,標(biāo)準(zhǔn)Linux內(nèi)核作為一個任務(wù)運行于實時內(nèi)核上,強實時性任務(wù)也直接運行在實時內(nèi)核上,如RT-Linux等。
文件系統(tǒng)是嵌入式Linux操作系統(tǒng)必不可少的。但標(biāo)準(zhǔn)Linux支持大量的文件系統(tǒng),因此除了滿足系統(tǒng)的正常運行需要而保留一種外,其它的全部可以刪除,利用原有的設(shè)置選項可以移除。一般嵌入式設(shè)備文件系統(tǒng)主要使用RamDisk技術(shù)和網(wǎng)絡(luò)文件系統(tǒng)技術(shù)。RamDisk可駐留于Flash,運行時加載到內(nèi)存中。
2、 精簡運行環(huán)境
Linux通常的運行環(huán)境指用戶運行任何應(yīng)用的基礎(chǔ)設(shè)施,主要包括函數(shù)庫和基本命令集等。標(biāo)準(zhǔn)Linux系統(tǒng)同時向用戶提供了靜態(tài)和動態(tài)函數(shù)庫。靜態(tài)函數(shù)庫在生成應(yīng)用時直接鏈接到用戶應(yīng)用中。動態(tài)庫在應(yīng)用運行時才鏈接。由于嵌入式系統(tǒng)應(yīng)用一般都是在開發(fā)平臺上預(yù)先生成的,因此嵌入式系統(tǒng)只需向應(yīng)用提供動態(tài)函數(shù)庫。Linux應(yīng)用運行所需的函數(shù)庫主要有C庫、數(shù)學(xué)庫、線程庫、加密庫、網(wǎng)絡(luò)通信庫等。其中最基本的是C語言的運行庫glib。這個庫主要完成基本的輸入輸出,內(nèi)存訪問,文件處理。一個標(biāo)準(zhǔn)的glib庫大約要1200kB存儲空間,考慮到嵌入式Linux內(nèi)核往往很小,這種運行庫實在太大,我們做了一些精簡的工作,方法有兩種:(1)、使用靜態(tài)連接的方法,完全不使用運行庫動態(tài)連接;(2)、對這個庫的函數(shù)進行精簡。
在一個桌面系統(tǒng)上,使用動態(tài)連接可以帶來許多好處。使用動態(tài)連接庫,可以讓應(yīng)用程序跟函數(shù)庫的更新、升級分離,便于維護,可以讓同時運行的多個程序共享一段代碼。但是,在嵌入式系統(tǒng)中,很少有多個程序并行的可能,程序的維護,尤其是庫函數(shù)的維護更新是不常見的。這時,使用靜態(tài)連接的優(yōu)勢就極為明顯。因為靜態(tài)連接可以只將庫中用到的部分連接進程序。在應(yīng)用程序較少(小于5)的情況下,靜態(tài)連接可以達(dá)到較好的結(jié)果。為了便于將來擴充的需要,我們也采用第二種方法,針對我們的需要,對庫函數(shù)的內(nèi)容進行精簡,只保留一些基本功能,還有一種方法是采用其它的C語言運行庫。但是這些庫對兼容性影響很大。
基本命令集同樣是運行用戶應(yīng)用的基礎(chǔ),主要包括初始化進程init,終端獲取getty、Shell和基本命令等。嵌入式系統(tǒng)的啟動過程可能與標(biāo)準(zhǔn)Linux不同,例如跳過登錄過程直接啟動GUI等。這就要求修改init,getty等。標(biāo)準(zhǔn)Linux命令集同樣由于體積問題無法直接應(yīng)用于嵌入式環(huán)境。目前,小命令集的解決方法主要有集成方法和匯編方法兩種。集成方法采用集成公共部分減少命令集整體體積,用C實現(xiàn),有較好的平臺移植性;匯編方法則采用匯編編程減少每個命令的體積.這樣可使體積很小但其平臺移植性較差。
3、 嵌入式Linux下的GUI
GUI在嵌入式系統(tǒng)或者實時系統(tǒng)中的地位越來越重要,比如PDA、DVD播放機、WAP手機等,都需要一個完整.漂亮的圖形用戶界面。這些系統(tǒng)對GUI的基本要求包括:(1)、輕型、占用資源少;(2)、高性能;(3)、高可靠性;(4)、可配置。這些也成為評價嵌入式系統(tǒng)的重要指標(biāo)。目前,嵌入式Linux上的GUI主要有winCE、Micro Window、緊縮的X Window、MiniGUI(國內(nèi)做得較好的自由軟件之一)。標(biāo)準(zhǔn)Linux的Xfree86由于體積龐大,運行環(huán)境要求高,無法運行于嵌入式環(huán)境。嵌入式GUI主要通過削減功能,降低性能來實現(xiàn)體積小和占用資源少。目前嵌入式Linux上的GUI環(huán)境主要有兩類:X類和win32類。X類GUI分為服務(wù)方和客戶方兩方。服務(wù)器方提供鼠標(biāo)、鍵盤處理和顯示功能,客戶方是用戶應(yīng)用,服務(wù)方和客戶方通過socket接口和X協(xié)議通信。采用該方式十分有利于遠(yuǎn)程網(wǎng)絡(luò)圖形化服務(wù),客戶方和服務(wù)方可通過網(wǎng)絡(luò)實現(xiàn)X協(xié)議和圖形顯示。典型的X類GUI有Micro Window、緊縮的X Window等。win32類的GUI不存在客戶方和服務(wù)方,每個任務(wù)都自成一體,任何任務(wù)間的切換、事件分發(fā)由專門的管理任務(wù)負(fù)責(zé)。如wiCE、MiniGUI就是類似于win32類的GUI。
【編輯推薦】