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