針對嵌入式Linux實時化技術(shù)的討論
引言
本文引用地址:http://butianyuan.cn/article/149939.htmLinux支持PowerPC、MIPS、ARM、DSP等多種嵌入式處理器,逐漸被用于多種關(guān)鍵性場合。其中實時多媒體處理、工業(yè)控制、汽車電子等特定應(yīng)用對Linux提出了強(qiáng)實時性需求。Linux提供了一些實時擴(kuò)展,但需要進(jìn)行實時性改造。本文針對嵌入式Linux實時化技術(shù)中的一些關(guān)鍵問題進(jìn)行了討論,如Linux內(nèi)核時延,實時化主流技術(shù)方案及其評價等。
Linux內(nèi)核時延
主流Linux雖然部分滿足POSIX 1003.1b實時擴(kuò)展標(biāo)準(zhǔn),但還不完全是一個實時操作系統(tǒng),主要表現(xiàn)為:
● 任務(wù)調(diào)度與內(nèi)核搶占
2.6版本內(nèi)核添加了許多搶占點,使進(jìn)程執(zhí)行在內(nèi)核代碼時也可被搶占。為支持內(nèi)核代碼可搶占,在2.6版內(nèi)核中通過采用禁用中斷的自旋鎖來保護(hù)臨界區(qū)。但此時如果有低優(yōu)先級進(jìn)程在臨界區(qū)中執(zhí)行,高優(yōu)先級進(jìn)程即使不訪問低優(yōu)先級所保護(hù)的臨界區(qū),也必須等待低優(yōu)先級進(jìn)程退出臨界區(qū)。
● 中斷延遲
在主流Linux內(nèi)核設(shè)計中,中斷可以搶占最高優(yōu)先級的任務(wù),使高優(yōu)先級任務(wù)被阻塞的最長時間不確定。而且,由于內(nèi)核為保護(hù)臨界區(qū)需要關(guān)閉中斷,更加增長了高優(yōu)先級任務(wù)阻塞時間。
● 時鐘精度
Linux通過硬件時鐘編程來產(chǎn)生毫秒級周期性時鐘中斷進(jìn)行內(nèi)核時間管理,無法滿足實時系統(tǒng)較高精度的調(diào)度要求。內(nèi)核定時器精度同樣也受限于時鐘中斷,無法滿足實時系統(tǒng)的高精度定時需求。
● 其他延遲
此外,Linux內(nèi)核其他子系統(tǒng)也存在多種延遲。比如為了增強(qiáng)內(nèi)核性能和減少內(nèi)存消耗,Linux僅在需要時裝載程序地址空間相應(yīng)的內(nèi)存頁。當(dāng)被存取內(nèi)容(如代碼)不在RAM中則內(nèi)存管理單元(MMU)將產(chǎn)生頁表錯誤(Page-Fault)觸發(fā)頁面裝載,造成實時進(jìn)程響應(yīng)時間不確定。
Linux實時化技術(shù)發(fā)展
主流Linux內(nèi)核1.x、2.2.x和2.4.x版本的Linux內(nèi)核無搶占支持,直到2.6版本的Linux內(nèi)核才支持可搶占內(nèi)核,支持臨界區(qū)外的內(nèi)核搶占和可搶占的大內(nèi)核鎖。在此基礎(chǔ)上,Linux采用了下列兩類實時化技術(shù)。
● 雙內(nèi)核方式
Linux內(nèi)核實時化雙內(nèi)核方式以RTLinux、RTAI和Xenomai等為典型代表。其中RTLinux實現(xiàn)了一個微內(nèi)核實時操作系統(tǒng)支持底層任務(wù)管理、中斷服務(wù)例程、底層任務(wù)通信隊列等。普通Linux作為實時操作系統(tǒng)的最低優(yōu)先級任務(wù),Linux下的任務(wù)通過FIFO命名管道和實時任務(wù)進(jìn)行通信,如圖1所示。
當(dāng)Linux要關(guān)閉中斷時,實時微內(nèi)核會截取并記錄這個請求,通過軟件來模擬中斷控制器,而沒有真正關(guān)閉硬件中斷,避免了由于關(guān)中斷所造成的響應(yīng)延遲。RT-Linux將系統(tǒng)實時時鐘設(shè)置為單次觸發(fā)模式,提供微秒級的時鐘精度。RTAI類似RTLinux的實現(xiàn)方式,不同之處在于它修改了體系結(jié)構(gòu)相關(guān)代碼,形成一個實時硬件抽象層(RTHAL),使其實時任務(wù)能在任何時刻中斷普通Linux任務(wù),兩者之間通過非阻塞隊列進(jìn)行通訊。RTAI將直接修改Linux內(nèi)核的代碼減至最少,具有更好的可移植性。Xenomai以RTAI為基礎(chǔ),也稱RTAI /Fusion。采用了Adeos微內(nèi)核替代RTAI的硬件抽象層。其特色還在于模仿了傳統(tǒng)RTOS的API接口,推動傳統(tǒng)RTOS應(yīng)用在GNU/Linux下的移植。類似還有基于Fiasco微內(nèi)核的L4Linux等開源項目。
● 內(nèi)核補(bǔ)丁方式
雙內(nèi)核實時方案下,實時任務(wù)需要按照微內(nèi)核實時操作系統(tǒng)提供的另外一套API進(jìn)行設(shè)計。而內(nèi)核補(bǔ)丁方式則不改變Linux的API,原有應(yīng)用程序可在實時化后的操作系統(tǒng)上運行,典型的有早期研究性的Kurt-Linux和Red-Linux,商業(yè)版本的MontaVista、TimeSys 和Wind River Linux,以及現(xiàn)階段Ingo Monlnar等人開發(fā)的實時搶占補(bǔ)丁內(nèi)核等[3]。
Kurt-Linux是第一個基于普通Linux的實時操作系統(tǒng)。通過正常態(tài)、實時態(tài)和混合態(tài)進(jìn)行實時和非實時任務(wù)的劃分。RED-Linux通過任務(wù)多種屬性和調(diào)度程序,可以實現(xiàn)多種調(diào)度算法。采用軟件模擬中斷管理,并在內(nèi)核插入了許多搶占點,提高了系統(tǒng)調(diào)度精度。
MontaVista Linux在低延遲補(bǔ)丁以及可搶占內(nèi)核補(bǔ)丁基礎(chǔ)上[4],通過開發(fā)內(nèi)核O(1)實時調(diào)度程序并對可搶占內(nèi)核進(jìn)行了改進(jìn)和測試,Linux 2.4內(nèi)核時代,MontaVista Linux 作為商業(yè)成熟產(chǎn)品在實時性上有較強(qiáng)的優(yōu)勢。TimeSys Linux通過內(nèi)核模塊的方式也提供了高精度時鐘、優(yōu)先級繼承mutex等支持。
2.6版本的主流內(nèi)核吸收了以上技術(shù),支持CONFIG_PREEMPT_NONE,CONFIG_PREEMPT_VOLUNTARY和CONFIG_PREEMPT等多種配置選項。分別適合于計算型任務(wù)系統(tǒng),桌面用戶系統(tǒng)和毫秒級延遲嵌入式系統(tǒng)。2005年,針對2.6內(nèi)核MontaVista推出了實時Linux計劃,推進(jìn)了Linux內(nèi)核實時化進(jìn)程。隨后Ingo Molnar發(fā)布了新的實時搶占補(bǔ)丁,并逐漸成為Linux內(nèi)核實時主流技術(shù),也為包括MontaVista Linux,Wind River Linux采用和補(bǔ)充,本文后續(xù)內(nèi)容要涉及實時搶占補(bǔ)丁。
評論