引言
Linux支持PowerPC,、MIPS、ARM,、DSP等多種嵌入式處理器,,逐漸被用于多種關鍵性場合。其中實時多媒體處理,、工業(yè)控制,、汽車電子等特定應用對Linux提出了強實時性需求。Linux提供了一些實時擴展,,但需要進行實時性改造,。本文針對嵌入式Linux實時化技術中的一些關鍵問題進行了討論,如Linux內核時延,,實時化主流技術方案等,。
Linux內核時延
主流Linux雖然部分滿足POSIX 1003.1b實時擴展標準,但還不完全是一個實時操作系統(tǒng),,主要表現(xiàn)為:
* 任務調度與內核搶占
2.6版本內核添加了許多搶占點,,使進程執(zhí)行在內核代碼時也可被搶占。為支持內核代碼可搶占,,在2.6版內核中通過采用禁用中斷的自旋鎖來保護臨界區(qū),。但此時如果有低優(yōu)先級進程在臨界區(qū)中執(zhí)行,高優(yōu)先級進程即使不訪問低優(yōu)先級所保護的臨界區(qū),,也必須等待低優(yōu)先級進程退出臨界區(qū),。
* 中斷延遲
在主流Linux內核設計中,中斷可以搶占最高優(yōu)先級的任務,,使高優(yōu)先級任務被阻塞的最長時間不確定,。而且,由于內核為保護臨界區(qū)需要關閉中斷,,更加增長了高優(yōu)先級任務阻塞時間,。
* 時鐘精度
Linux通過硬件時鐘編程來產生毫秒級周期性時鐘中斷進行內核時間管理,無法滿足實時系統(tǒng)較高精度的調度要求,。內核定時器精度同樣也受限于時鐘中斷,,無法滿足實時系統(tǒng)的高精度定時需求。
* 其他延遲
此外,,Linux內核其他子系統(tǒng)也存在多種延遲,。比如為了增強內核性能和減少內存消耗,Linux僅在需要時裝載程序地址空間相應的內存頁。當被存取內容(如代碼)不在RAM中則內存管理單元(MMU)將產生頁表錯誤(Page-Fault)觸發(fā)頁面裝載,,造成實時進程響應時間不確定,。
Linux實時化技術發(fā)展
主流Linux內核1.x、2.2.x和2.4.x版本的Linux內核無搶占支持,,直到2.6版本的Linux內核才支持可搶占內核,,支持臨界區(qū)外的內核搶占和可搶占的大內核鎖。在此基礎上,,Linux采用了下列兩類實時化技術,。
* 雙內核方式
Linux內核實時化雙內核方式以RTLinux、RTAI和Xenomai等為典型代表,。其中RT-Linux實現(xiàn)了一個微內核實時操作系統(tǒng)支持底層任務管理,、中斷服務例程、底層任務通信隊列等,。普通Linux作為實時操作系統(tǒng)的最低優(yōu)先級任務,,Linux下的任務通過FIFO命名管道和實時任務進行通信,如圖1所示,。
圖1 雙內核架構的Linux實時化技術
當Linux要關閉中斷時,,實時微內核會截取并記錄這個請求,通過軟件來模擬中斷控制器,,而沒有真正關閉硬件中斷,避免了由于關中斷所造成的響應延遲,。RT-Linux將系統(tǒng)實時時鐘設置為單次觸發(fā)模式,,提供微秒級的時鐘精度。RTAI類似RTLinux的實現(xiàn)方式,,不同之處在于它修改了體系結構相關代碼,,形成一個實時硬件抽象層(RTHAL),使其實時任務能在任何時刻中斷普通Linux任務,,兩者之間通過非阻塞隊列進行通訊,。RTAI將直接修改Linux內核的代碼減至最少,具有更好的可移植性,。Xenomai以RTAI為基礎,,也稱RTAI /Fusion。采用了Adeos微內核替代RTAI的硬件抽象層[11],。其特色還在于模仿了傳統(tǒng)RTOS的API接口,,推動傳統(tǒng)RTOS應用在GNU/Linux下的移植。類似還有基于Fiasco微內核的L4Linux等開源項目[12],。
* 內核補丁方式
雙內核實時方案下,,實時任務需要按照微內核實時操作系統(tǒng)提供的另外一套API進行設計。而內核補丁方式則不改變Linux的API,,原有應用程序可在實時化后的操作系統(tǒng)上運行,,典型的有早期研究性的Kurt-Linux和Red-Linux,,商業(yè)版本的MontaVista [2]、TimeSys 和Wind River Linux,,以及現(xiàn)階段Ingo Monlnar等人開發(fā)的實時搶占補丁內核等[3],。
Kurt-Linux是第一個基于普通Linux的實時操作系統(tǒng)。通過正常態(tài),、實時態(tài)和混合態(tài)進行實時和非實時任務的劃分,。RED-Linux通過任務多種屬性和調度程序,可以實現(xiàn)多種調度算法,。采用軟件模擬中斷管理,,并在內核插入了許多搶占點,提高了系統(tǒng)調度精度,。
MontaVista Linux在低延遲補丁以及可搶占內核補丁基礎上[4],,通過開發(fā)內核O(1)實時調度程序并對可搶占內核進行了改進和測試,Linux 2.4內核時代MontaVista Linux 作為商業(yè)成熟產品在實時性上有較強的優(yōu)勢,。TimeSys Linux通過內核模塊的方式也提供了高精度時鐘,、優(yōu)先級繼承mutex等支持。
2.6版本的主流內核吸收了以上技術,,支持CONFIG_PREEMPT_NONE,,CONFIG_PREEMPT_VOLUNTARY和CONFIG_PREEMPT等多種配置選項。分別適合于計算型任務系統(tǒng),,桌面用戶系統(tǒng)和毫秒級延遲嵌入式系統(tǒng),。2005年,針對2.6內核MontaVista推出了實時Linux計劃,,推進了Linux內核實時化進程,。隨后Ingo Molnar發(fā)布了新的實時搶占補丁,并逐漸成為Linux內核實時主流技術,,也為包括MontaVista Linux,,Wind River Linux采用和補充,本文后續(xù)內容這要涉及實時搶占補丁,。
Linux實時化技術
2.6版本Linux內核實時性能有一定增強,,雙內核方式的Linux實時化技術也在不斷發(fā)展中。原來由FSMLab維護的RTLinux,,其版權在2007年2月被Wind River購買,,先對在開源社區(qū)就不很活躍,RTAI支持x386等體系結構,,但由于其代碼較難維護,、bug較難調試等原因,許多開發(fā)者加入了Xenomai項目。Xenomai支持最新2.6版 Linux,,相比之下代碼相對穩(wěn)定和可維護,,開發(fā)模式較活躍。
內核補丁方式的Linux實時化技術在2.6版內核基礎上做了大量改進,,使得內核中除了中斷關閉和IRQ線程分派,、調度和上下文切換之外的絕大部分代碼都可以被搶占,不可搶占的自旋鎖保護臨界區(qū)從一千多個減少到幾十個,,使得內核實時性得到極大的提高,,獲得社區(qū)廣泛支持并逐漸成為Linux實時化主流技術。
Linux內核實時化改進
實時搶占內核補丁針對Linux各種延遲進行了實時化改進[5],,主要包括了幾個方面的技術,。
* 實時搶占內核
為了實現(xiàn)內核完全可搶占,實時內核臨界區(qū)用高性能優(yōu)先級繼承mutex替換原來自旋鎖(spin-lock)來進行保護,,使得在臨界區(qū)內的執(zhí)行也可被搶占,。只有當線程想訪問一個其他線程正在訪問的臨界區(qū)時,才被調度至睡眠,,直到所保護的臨界區(qū)被釋放時被喚醒,。
在實時搶占內核中通過優(yōu)先級繼承機制(PI)在線程被一個低優(yōu)先級線程所持有的資源阻塞時,低優(yōu)先級線程通過繼承被阻塞線程優(yōu)先級,,盡快執(zhí)行并釋放所持資源而不被其他線程所搶占,。
* 新型鎖機制帶來內核性能提升
實時搶占補丁替換了大內核鎖(BKL),將BKL從spin lock改成是mutex,,持有BKL的線程也可以被搶占,,減少了內核調度延遲。此外,,實時搶占補丁通過mutex替代semaphore,避免了不必要的時間負載,。實時搶占補丁實現(xiàn)了可搶占的RCU(Read Copy Update)鎖和串行化讀寫鎖,,保證了執(zhí)行可預測性,提高了性能,。
* 中斷線程化
實時搶占補丁通過內核線程來實現(xiàn)一些硬件中斷和軟件中斷的服務程序,。體系結構相關處理代碼設置IRQ狀態(tài)、檢查線程化的中斷是否使能,,并喚醒相關線程,。在中斷線程被調度執(zhí)行后,進行中斷服務處理,。在實時搶占內核中,,用戶線程優(yōu)先級可以高于設備中斷服務線程。實時任務無需等待設備驅動處理程序執(zhí)行,減小了實時搶占延遲,。
* 時鐘系統(tǒng)改進
實時搶占內核的時鐘系統(tǒng)重新進行了設計,,實現(xiàn)了高精度定時器[6]。時鐘精度不再依賴jiffies,,使POSIX定時器和nanosleep精度由具體硬件所能提供的精度決定,,使得gettimeofday能夠提供實時系統(tǒng)所需的精確時間值。
* 其他改進
Linux在用戶層支持性能良好的futex,,實現(xiàn)原理類似于內核優(yōu)先級繼承mutex,,僅在產生競態(tài)時進入內核,提高了應用程序性能,。此外,,實時搶占補丁內核還提供 mutex死鎖檢測、延遲跟蹤與測量,、中斷關閉跟蹤與延遲測量,、搶占延遲測量等內核調試與診斷、內核性能測量與調優(yōu)等工具,、實時Trace支持( Ftrace)等支持,。
現(xiàn)階段實時化技術在各體系結構上逐漸得到了支持,如表1所示,。
表1 Linux實時搶占補丁技術支持情況
實時搶占內核延遲
現(xiàn)階段,,實時搶占補丁技術仍處于完善過程中,其表現(xiàn)在以下幾點不足,。
* 中斷延遲
即使不發(fā)生中斷線程搶占,,實時搶占內核相對原來中斷服務機制額外增加一對上下文切換時間,用于喚醒中斷服務線程執(zhí)行和進入睡眠狀態(tài),。此外,,內核中還存在少量用raw_spinlock鎖禁用中斷來保護的臨界區(qū),需要計算這些鎖造成的中斷延遲,。
* 任務搶占延遲
內核搶占延遲主要是由于在內核中使用各種鎖機制用于控制任務和中斷對臨界區(qū)的訪問所造成的,,特別是實時搶占內核中為了避免優(yōu)先級逆轉增加的鎖機制帶來了額外時間負載。
* 內核模塊其他延遲
在實時搶占補丁中,,內存管理模塊還需減少頁表錯誤引起的延遲,,降低mlockall內存鎖存造成的性能降級影響。實時搶占內核中高精度定時器的使用導致了額外定時器管理時間負載,。此外,,內核中一些驅動程序需要針對實時應用進行優(yōu)化來提高實時響應。軟浮點處理和軟浮點內核仿真需要和實時搶占補丁兼容,,能耗管理子系統(tǒng)還需要具備實時系統(tǒng)感知能力,。
實時搶占內核性能測試
本文在Intel Pentium M 1.7 GHz處理器上進行了測試,。測試環(huán)境包括:Linux內核2.6.25.8最小配置;patch-2.6.25.8-rt7實時補??;libc 2.5+和busybox-1.10.0構建initrdfs方式的根文件系統(tǒng)。
* 中斷延遲
采用實時搶占補丁支持的內核中斷延遲測量工具測量中斷關閉(IRQ OFF)時間,。在100%負載情況下,,十萬采樣點中,最大值在31 us左右,,絕大多數(shù)在1 us左右,,如圖2所示。
圖2
* 任務搶占延遲
內核搶占關閉時間采用實時搶占補丁所支持的內核搶占關閉測量工具測量,。實時搶占內核和普通Linux內核情況比較如表2所示,。
實時應用中周期性任務需要能在確定的時間內得到執(zhí)行。實時搶占內核和普通內核下的周期性任務延遲對比中可以看出實時搶占內核提供了實時任務的精確執(zhí)行,,如圖3所示,。
結語
嵌入式應用對Linux實時性要求越來越多,主流內核逐漸加入實時化技術,,最終將為實時應用提供完美解決方案,。本文綜述了Linux內核時延,介紹了Linux內核實時化發(fā)展,,分析了內核實時化主流技術,,并分析了實時化技術不足之處,為更好地理解Linux實時化技術提供了參考,。