摘 要 隨著Linux操作系統本身的不斷完善,嵌入式Linux已經廣泛應用到手機、PDA以及其他移動終端產品中。嵌入式Linux以其開放的源碼,良好的適應性,較低的成本和很好的技術移植在手機等移動終端產品的操作系統領域,獲得了越來越多的青睐。本文通過對嵌入式Linux在移動終端產品中的優勢分析,尤其對實時性的分析比較,介紹了其在手持移動終端產品方面廣闊的應用前景和實際應用情況。 關鍵詞 Linux 嵌入式Linux 實時性 嵌入式 Monta Vista 1 前 言 1. 1 Linux操作系統的引入 早在2001年,手機生產商們便開始尋求一種基於“開放”的操作系統的手機,所謂“開放”指其所有的API(應用程序接口)應該是公開並且受到廣泛支持。當時所面臨的選擇有Symbian的EPOC平台,Palm/OS以及微軟的WIN CE。隨著研究的深入,Linux的嵌入式版本開始受到青睐並擴展其市場。從2001年至2002年,嵌入式Linux在嵌入式操作系統的市場份額迅速增長了一倍左右,從而成為嵌入式OS中的重要一員。 1. 2 Linux操作系統在移動設備領域的優勢 首先,Linux屬於開放的操作系統,它自身的技術文檔甚至源代碼都是開放的,因而在學術領域受到格外青睐,使得它對新技術,新協議有良好的適應性. 其次,由於Linux和Unix之間的相似性,使得許多對Unix熟悉的開發人員能夠很快在相似的基於嵌入式Linux開發環境中進行開發工作。另外, 由於Linux源碼的開放性使得代碼移植和重用變得相當普遍,基於嵌入式Linux平台的開發產品往往只花費較低的成本就能有很好的質量。這對於注重開發成本的公司無疑具有極大的誘惑力。 此外,Linux提供了良好的安全性能和並行處理能力。Java語言在移動領域正逐漸成為主流的開發語言,而實驗表明,在相同的硬件平台上,Java虛擬機在Linux上能取得比Windows CE上更好的性能值。因此Java+Linux成為現在的時尚搭配。當然,Linux在價格上的優勢也很關鍵。盡管Linux並非全免費,但和其他商用操作系統相比,它還是占盡價格優勢。 1. 3 Linux操作系統占用空間情況 在占用空間方面,Linux大約占用1M ROM和2M RAM。這和Windows CE的空間占用幾乎差不多,而Linux的優勢在於通過壓縮文件系統能在RAM 和ROM之間作出相對合理的平衡。 2 嵌入式Linux目前的商用版本 目前國際嵌入式Linux市場的商用版本有: 其中某些商用版本已被一些手持移動設備生產公司所使用,例如Sharp公司的ZaurusPDA采用就采用了Lineo的Embedix,該Linux版本采用“Qtopia”的GUI;而新近MOTOROLA公司推出的A760采用了MontaVista公司的Linux CEE3.0。 目前國內的Linux嵌入式操作系統廠商隊伍也正在逐漸擴大,已形成百家爭鳴的局面,在市場上主要有紅旗嵌入式Linux、博利思推出的Pocket IX、藍點的嵌入式Linux系統、網虎科技推出的Coventive和共創軟件聯盟推出的CC-Linux。這些版本大都對通用的Linux進行了合理的裁剪,實現了ROM/RAM/Flash的文件系統、軟實時、能量低中斷、電源管理、Java虛擬機、多平台和多線程支持。 3 關於嵌入式Linux實時性問題的思考 本文將重點討論在嵌入式Linux系統中如何實現實時性的問題: 3.1 問題的提出 眾所周知,在多進程的操作系統中,進程調度是一個全局性的、關鍵性的問題,它決定著系統的總體設計、實現、功能設置以及各個方面的性能。而根據不同的調度算法進行的進程切換的速度,也是衡量一個操作系統性能好壞的重要指標。一個好的系統的進程調度機制,往往兼顧三種不同的需要: (1)交互式應用:著重於系統的響應速度,使共用一個系統的各個用戶都能感覺到自己是在獨占地使用一個系統。 (2)批處理應用:對響應速度並無要求,但是完成一個作業所需的時間仍是一個重要的因素,考慮“平均速度”。 (3)實時應用:時間性最強的應用,不但要考慮進程執行的平均速度,還要考慮“即時速度”;不但要考慮響應速度,還要考慮有關程序能否在規定時間內執行完。移動設備例如手機、PDA等,對實時性要求特別高。 標准的Linux內核繼承了Unix的時間共享機制,並不太適合實時性要求。內核不是采用搶占方式而是采用基於公平原則的時間片來進行進程調度。所以其中就存在矛盾,因為如果調度的機制為:把時間分成時間片,每個時間片來一次時鐘中斷,而調度可以在時間片中斷時進行。調度原則為根據進程的優先級別安排何進程先運行,每個時間片一次,除此之外就只能在進程資源滿足時才可進行調度。這樣,只要時間片分得得當,交互式應用就能滿足,但是這樣的機制並不適合實時的應用。因為可能在某一時刻有優先級別高的進程急著要運行,而恰有進程正在運行中,那優先級別高的進程只能干等著。當然,這也取決於CPU的速度,如果CPU有能力把時間片分小到0.5毫秒,而CPU仍然能在這麼短的時間裡做足夠多的事,那麼對一般的實時應用可以滿足要求。但是,對於手機這種屬於CLDC(Connected Limited Device Configuration)的設備,CPU不快,存儲容量受限,該問題就凸顯不便。 3.2 問題的解決方案 目前在移動設備上使用的嵌入式Linux系統中,為了滿足實時性的要求,一般采用兩種方法:利用處理器的能力開發的快速應用程序; 插入第二層內核,模擬CPU的中斷處理,管理實時事件和處理,而讓本來的Linux內核運行在一個比第二層內核較低優先級上。但是該種方法對Linux的通用性產生了影響,因為該方法產生了不同的API和非標准的編程模型,並且有可能剝奪原來的Linux的正常運行權。所以當前的所謂實時Linux操作系統並非真正意義的Linux。 那麼能否從Linux本身找到解決辦法呢?Linux本身的源碼中就有解決方案。 Linux和Unix一樣,以進程優先級為基礎進行調度。內核為每個進程計算出一個反映其運行資格的權值,即我們所提到的優先級。然後挑選權值最高的進程投入運行。在運行過程中,當前進程的權值隨時間而遞減,從而在下一次調度的時候原來權值較低的進程可能就更有資格運行了。當所有進程的權值都變成0,就重新計算一下所有進程的權值。 Linux內核為了適合不同應用的需要,實現了三種不同的政策:SCHED_FIFO、SCHED_RR以及SCHED_OTHER。每個進程都有自己的適用的調度政策,並且進程還可以通過系統調用sched_setscheduler()設定自己適用的調度政策。其中,SCHED_FIFO就適用於時間性要求比較高但每次運行所需時間比較短的進程,即實時性要求比較高的情況。調度政策為SCHED_FIFO的進程一旦受到調度進入運行,就一直運行到自願讓出或者被優先級更高的進程剝奪為止。Linux針對實時進程,特別定義了實時優先級rt_priority,其權值為(1000 +p->rt_priority),也就是說實時進程的權值至少是1000,所以當有實時進程就緒時候非實時進程是沒有機會運行的。這種機制說明Linux有能力不通過插入第二層內核就能很好地支持實時性。 這就提供了第三種潛在的解決方案來實現實時嵌入式Linux:使用Linux自身所具備的實時能力,即利用支持SMP的標准內核本身的強占性能力。這樣,不僅可以使用本地的Linux代碼、API和程序模型,並可以完全發揮Linux在其他方面的處理能力。而事實上,Linux 2.4和2.5版本已經提出了該解決方案。今年Linux 2.6版本推出,對實時性的有了更好地支持。這將更加推動嵌入式Linux在實時計算方面的應用。 3. 3 Linux 2.6解決方案 在Linux 2.6推出不久,LinuxWorks立刻宣布推出基於Linux 2.6版本的嵌入式Linux版本: BlueCat 5.0。LynuxWorks宣稱這是第一款基於最新的Linux 2.6內核的嵌入式版本,因而對實時性有突破性的支持。而測試也證明了這一點,即新版本的內核對實時性的支持確實有大幅度提高。Linux 2.6之所以更好的支持實時計算,主要因為: (1)更有效率的調度算法: 在老版本的Linux中,一般有一個全局的隊列,它能掃描並且按照優先級安排好就緒狀態的進程並安排他們順序執行。而新的Linux 2.6內核提供了兩個隊列。一個用於安排就緒的進程,一個用於安排超時等待的進程。這兩個隊列都按照優先權的高低對進程進行排列並且允許實時進程共享同一隊列,從而通過減少隊列中的就緒進程數來提高實時性。 (2)改良的內核:雖然Linux 2.6還稱不上是完全的實時操作系統,但已經能夠滿足大部分情況下的實時要求。因為在老版本的內核中,強占是通過執行代碼調用的,並且只能由中斷請求(IRQ)、睡眠等來中斷。而新的內核完全支持強占,即一個新的進程能夠在接受到外部中斷後立刻進入調度狀態,因而當一個高優先權的事件到達後,系統能立刻中斷當前進程而調用新的高優先權事件,從而大大縮短了響應時間。 (3)新的同步原語: 眾所周知,程序之間有時候常需要共享一些資源,例如內存或者打印機等。為了避免競爭資源帶來的混亂,我們常引入一些信號量來保證在任一時刻只有一個程序在使用某種獨占性資源。在以往的Linux中,是通過向內核提交一個系統調用來決定是否讓一個線程繼續執行。但是這樣就引入了一個問題,即如果通過系統調用後內核還是決定繼續讓該線程運行,那麼系統調用那部分時間就完全浪費了。而Linux 2.6支持基於用戶空間的快速信號量。該功能能夠在用戶空間檢查中斷是否必需,只有當確有需要的時候才調用系統中斷線程。如果發現實際上並不需要中斷則不實行系統調用,從而節省了不必要的系統調用。當發生資源爭用的時候,該功能同樣使用調度優先權來決定哪個線程應該執行。 Linux 2.6除了在實時性方面的良好支持,它對大容量模塊,輸入輸出系統以及代碼移