摘 要: 首先對Linux系統(tǒng)的實時機制作了分析,然后根據(jù)多媒體應(yīng)用" title="多媒體應(yīng)用">多媒體應(yīng)用的特點,通過改進Linux系統(tǒng)的實時性" title="實時性">實時性,構(gòu)建了面向多媒體應(yīng)用的嵌入式" title="的嵌入式">的嵌入式Linux系統(tǒng)。實驗結(jié)果表明,該系統(tǒng)在實時性方面完全可以滿足多媒體應(yīng)用的需求。
關(guān)鍵詞: 嵌入式系統(tǒng) 實時性 Linux 多媒體應(yīng)用
當今信息社會,以多媒體為特征的信息技術(shù)和信息產(chǎn)業(yè)的發(fā)展及應(yīng)用對人類社會產(chǎn)生的影響和作用愈來愈明顯,愈來愈重要。多媒體技術(shù)的發(fā)展在很大程度上依賴于多媒體軟件開發(fā)的水平。目前不管是支撐多媒體的系統(tǒng)軟件,還是應(yīng)用軟件,都在能力和數(shù)量上難以滿足多媒體飛速發(fā)展的需要。特別是多媒體系統(tǒng)軟件的缺乏,一直是制約多媒體產(chǎn)業(yè)發(fā)展的瓶頸問題之一。
Linux從1991年誕生之日起至今不過十來年,卻已發(fā)展成為一個功能強大、設(shè)計完善的操作系統(tǒng)。在嵌入式領(lǐng)域,Linux同樣獲得了飛速發(fā)展。Linux具有以下特點:
(1)Linux操作系統(tǒng)的開放源碼易于定制剪裁,在價格上有竟爭力;
(2)Linux操作系統(tǒng)的內(nèi)核小、功能強大、運行穩(wěn)定、系統(tǒng)強壯、效率高;
(3)Linux操作系統(tǒng)不僅支持X86 CPU,還可以支持其他數(shù)十種CPU芯片;
(4)Linux支持所有標準的因特網(wǎng)協(xié)議,幾乎所有的協(xié)議和網(wǎng)絡(luò)接口都定制在其中。
因此,Linux系統(tǒng)是多媒體終端操作系統(tǒng)的首選。
1 通用Linux實時性分析及其在實時性方面的不足
雖然目前Linux內(nèi)核在實時性方面有所增強,但由于Linux系統(tǒng)本身是一個面向桌面的系統(tǒng),所以將它應(yīng)用于多媒體終端時,在實時性方面仍存在一些問題。
1.1 通用Linux系統(tǒng)的調(diào)度策略
通用Linux系統(tǒng)支持實時和非實時兩種進程,實時進程相對于普通進程具有絕對的優(yōu)先級。對應(yīng)地,實時進程采用SCHED_FIFO或者SCHED_RR調(diào)度策略" title="調(diào)度策略">調(diào)度策略,普通的進程采用SCHED_OTHER調(diào)度策略。
SCHED_OTHER調(diào)度策略本質(zhì)上是一種比例共享的調(diào)度策略,它的這種設(shè)計方法能夠保證進程調(diào)度時的公平性:一個低優(yōu)先級的進程在每一個epoch中也會得到自己應(yīng)得的那些CPU執(zhí)行時間,另外它也提供了不同進程的優(yōu)先級區(qū)分,具有高priority值的進程能夠獲得更多的執(zhí)行時間。
對于實時進程來說,它們使用基于實時優(yōu)先級rt_priority的優(yōu)先級調(diào)度策略,但根據(jù)不同的調(diào)度策略,同一實時優(yōu)先級的進程之間的調(diào)度方法有所不同。
Linux調(diào)度時,要遍歷運行隊列,對隊列中的每一個進程計算goodness值,goodness 最大的進程將被選中運行。根據(jù)調(diào)度策略的不同,進程的goodness值也要做不同的計算。普通進程的goodness值是在該進程計數(shù)值counter基礎(chǔ)上略有浮動,其范圍是0~999。實時進程的goodness值是將該進程實時優(yōu)先級rt_priority 加上1000。所以實時進程的goodness 總是大于非實時進程,從而保證了實時進程的優(yōu)先調(diào)度權(quán)。函數(shù)goodness( )如下:
static inline int goodness(struct task_struct*p,int
this_cpu,struct mm_struct*this _ mm)
{int weight;
weight=-1;
if(P->policy&SCHED_YIELD) goto out;/*非實時進程*/
if (p-> policy= =SCHED_OTHER)
{ weight=p一>counter;
if(! weight)goto out;
if(P一>mm= =this _ mm!!!p一>mm)
weight +=1;
weight +=20一P一>nice;
goto out;
}/*軟實時進程*/
weight= 1000+P一>rt_priority;
goto out;
return weight;
}一
從上面的goodness()函數(shù)可以看出普通Linux內(nèi)核的進程調(diào)度算法只是軟實時的,并不是硬實時的。
1.2 通用Linux實時性方面的缺陷
(1)Linux系統(tǒng)中的調(diào)度單位為10ms,所以它不能夠提供精確的定時;
(2)當一個進程調(diào)用系統(tǒng)調(diào)用進入內(nèi)核態(tài)運行時,它是不可被搶占的;
(3)Linux內(nèi)核實現(xiàn)使用了大量的封中斷操作會造成中斷的丟失;
(4)由于使用虛擬內(nèi)存技術(shù),當發(fā)生頁出錯時,需要從硬盤中讀取交換數(shù)據(jù),但硬盤讀寫由于存儲位置的隨機性會導致隨機的讀寫時間,這在某些情況下會影響一些實時任務(wù)的截止期限;
(5)雖然Linux進程調(diào)度也支持實時優(yōu)先級,但缺乏有效的實時任務(wù)調(diào)度" title="任務(wù)調(diào)度">任務(wù)調(diào)度機制和調(diào)度算法;其網(wǎng)絡(luò)子系統(tǒng)的協(xié)議處理和其他設(shè)備的中斷處理都沒有與它對應(yīng)的進程的調(diào)度關(guān)聯(lián)起來,并且其自身也沒有明確的調(diào)度機制。
2 面向多媒體應(yīng)用的Linux實時性改進
提高Linux的實時性一般有兩種方法:一種是對普通的Linux內(nèi)核的數(shù)據(jù)結(jié)構(gòu)、調(diào)度函數(shù)、中斷方式等進行修改,使其能夠處理實時進程。另一種是在Linux內(nèi)核之外,進行實時性擴展。也就是在普通Linux的基礎(chǔ)之上再設(shè)計一個用于專門處理實時進程的內(nèi)核。為了提高Linux的實時性,并且使之能夠更好地滿足多媒體應(yīng)用系統(tǒng)的需求,本文采用第一種方法來提高系統(tǒng)的實時性。
2.1 提高系統(tǒng)所支持的時鐘精度
為了提高Linux系統(tǒng)的實時特性,必須提高系統(tǒng)所支持的時鐘精度。但如果僅僅簡單地提高時鐘頻率,會引起調(diào)度負載的增加,從而嚴重降低系統(tǒng)的性能。為了解決這個矛盾, 本文將時鐘芯片設(shè)置為單次觸發(fā)狀態(tài),即每次給時鐘芯片設(shè)置一個超時時間,然后到該超時事件發(fā)生時在時鐘中斷處理程序中再次根據(jù)需要給時鐘芯片設(shè)置一個超時時間。其基本思想是:一個精確的定時意味著時鐘中斷在一個比較精確的時間發(fā)生,但并非一定需要系統(tǒng)時鐘頻率達到此精度。它利用CPU的時鐘計數(shù)器來提供精度可達CPU主頻的時間精度。
2.2 可搶占式內(nèi)核設(shè)計
(1)搶占式內(nèi)核給task struct數(shù)據(jù)結(jié)構(gòu)增加一個數(shù)據(jù)項:preempt_count。該數(shù)據(jù)項由宏preempt_disable()、preempt_enable()、以及preempt_enable_no_resched()所使用。preempt_disable對preempt_count計數(shù)進行遞增,preempt_enable對preempt_count進行遞減。preempt_enable宏查看當前進程的preempt_count和need_resched域的內(nèi)容,如果 preempt_count為0并且need_resched為1,則調(diào)用preempt_schedule()函數(shù)。該函數(shù)將給當前進程的preempt_count項增加一個很大的值,然后調(diào)用進程調(diào)度函數(shù)schedule(),在schedule函數(shù)返回后從該進程preempt_count中再減去該值,從而實現(xiàn)內(nèi)核可搶占。
(2)修改schedule函數(shù),使它檢測進程的preempt_co-unter是否很大(這是為了屏蔽一些普通調(diào)度流程中對于搶占式調(diào)度來說是冗余的那些操作),然后執(zhí)行搶占式調(diào)度。同時修改spinlock的代碼。在spin_lock()和spin_try_lock中增加了對于preempt_disable的調(diào)用,在spin_unlock()中增加了對于preempt_enable的調(diào)用。修改中斷返回的代碼,在其中增加了對于preempt_enable的調(diào)用。
由以上可看出內(nèi)核的搶占式調(diào)度發(fā)生在如下情況:在釋放spinlock時,或者當中斷返回時,如果當前執(zhí)行進程的need_resched被標記,則進行搶占式調(diào)度。
2.3 實時任務(wù)調(diào)度的實現(xiàn)
在任務(wù)切換方面限制Linux不能進入RTOS行列的主要原因是:內(nèi)核無法及時進行進程調(diào)度,即任務(wù)調(diào)度器schedule()函數(shù)不能及時被執(zhí)行;當中斷返回到內(nèi)核態(tài)時,Linux內(nèi)核禁止進行進程調(diào)度,只有中斷返回到用戶態(tài)時,Linux內(nèi)核才允許進行進程調(diào)度。針對這兩點,對Linux內(nèi)核的相關(guān)函數(shù)作如下修改:
(1)當系統(tǒng)從中斷返回到內(nèi)核態(tài)時,強制調(diào)用調(diào)度函數(shù)preemp_schedule(),為此,在arch/i386/kernel/Entry.S中修改如下代碼:
……
#ifdef CONFIG PREEMPT
cli
decl preempt count(%ebx)/*恢復(fù)內(nèi)核搶占標志*/
#endif
……
incl preempt count(%ebx)
sti
call SYMBOL_ NAME(preempt_schedule)
jmp ret_from_intr/*新進程返回ret_from_intr恢復(fù)搶占標志后再返回*/
……
(2)對于內(nèi)核態(tài)搶占的任務(wù)不要從運行隊列刪除,為此需要對文件kernel/schedule.c作修改,關(guān)鍵代碼如下:
……
#ifdef CONFIG PREEMPT
ctx_sw_off();/*加鎖,禁止內(nèi)核搶占*/
#endif
……
#ifdef CONFIG_PREEMPT
if(prev->state & TASK_PREEMPTED)
break;/*如果是內(nèi)核搶占調(diào)度,則保留運行隊列*/
#endif
……
#ifdef CONFIG PREEMPT
ctx_sw_on_no_preempt();/*解鎖,允許內(nèi)核搶占*/
#endif
……
這樣可以解決當中斷返回到內(nèi)核態(tài)時,Linux內(nèi)核禁止進行進程調(diào)度,只有中斷返回到用戶態(tài)時,Linux內(nèi)核才允許進行進程調(diào)度的問題,從而增強了任務(wù)調(diào)度的實時性。
3 嵌入式Linux實時性能測試結(jié)果
測試工具:Linux Trace ToolKit-0.8
測試環(huán)境:Intel Celeron 1.2GHz CPU、256MB SDRAM,通用Linux為Red Hat9.0,RT-Linux為3.0版,Media-Linux即為本文實現(xiàn)的嵌入式Linux。
測試結(jié)果如表1所示。
可以看出,本文構(gòu)建的Linux系統(tǒng)的任務(wù)響應(yīng)時間處于十微秒級,完全可以滿足多媒體應(yīng)用終端的實時性需求。
根據(jù)多媒體應(yīng)用的特點,在盡可能地保證系統(tǒng)性能的前提下,本文通過提高系統(tǒng)所支持的時鐘精度、設(shè)計可搶占式內(nèi)核、增強實時任務(wù)調(diào)度改進了通用Linux的實時性(關(guān)鍵部分給出了源代碼及數(shù)據(jù)結(jié)構(gòu))。實驗結(jié)果表明,該系統(tǒng)在實時性方面完全可以滿足多媒體終端應(yīng)用的需求,具有較好的應(yīng)用前景。
參考文獻
1 李善平,劉文峰,李程遠.Linux內(nèi)核2.4版源代碼分析大全[M].北京:機械工業(yè)出版社,2001
2 鄒思鐵.嵌入式Linux設(shè)計與應(yīng)用[M].北京:清華大學出版社,2002
3 Yaghmour K著,韓存兵,龔波譯.構(gòu)建嵌入式Linux系統(tǒng)[M].北京:中國電力出版社,2004
4 Jeffay K.Scheduling Sporadic Tasks with Shared Resources in Hard-Real-Time Systems[J].in Proc.Of the 13th Real-Time Systems Symposuim.Phoenix,Arizona,1992;(12)
5 Embedded Linux nears real time.http://www.edn.com/article/CA450620.html