天天看點

【嵌入式】linux核心感覺,Linux核心時延、實時化主流技術和發展

【嵌入式】linux核心感覺,Linux核心時延、實時化主流技術和發展

【嵌入式】linux核心感覺,Linux核心時延、實時化主流技術和發展

///插播一條:我自己在今年年初錄制了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以哦~點我頭像黑色字型加我地球呺也能領取哦。最近比較閑,帶做畢設,帶學生參加省級或以上比賽///

【嵌入式】linux核心感覺,Linux核心時延、實時化主流技術和發展

Linux支援PowerPC、MIPS、ARM、DSP等多種嵌入式處理器,逐漸被用于多種關鍵性場合。其中實時多媒體處理、工業控制、汽車電子等特定應用對Linux提出了強實時性需求。Linux提供了一些實時擴充,但需要進行實時性改造。本文針對嵌入式Linux實時化技術中的一些關鍵問題進行了讨論,如Linux核心時延,實時化主流技術方案及其評價等。

Linux核心時延

主流Linux雖然部分滿足POSIX 1003.1b實時擴充标準,但還不完全是一個實時作業系統,主要表現為:

*任務排程與核心搶占

2.6版本核心添加了許多搶占點,使程序執行在核心代碼時也可被搶占。為支援核心代碼可搶占,在2.6版核心中通過采用禁用中斷的自旋鎖來保護臨界區。但此時如果有低優先級程序在臨界區中執行,高優先級程序即使不通路低優先級所保護的臨界區,也必須等待低優先級程序退出臨界區。

*中斷延遲

在主流Linux核心設計中,中斷可以搶占最高優先級的任務,使高優先級任務被阻塞的最長時間不确定。而且,由于核心為保護臨界區需要關閉中斷,更加增長了高優先級任務阻塞時間。

*時鐘精度

Linux通過硬體時鐘程式設計來産生毫秒級周期性時鐘中斷進行核心時間管理,無法滿足實時系統較高精度的排程要求。核心定時器精度同樣也受限于時鐘中斷,無法滿足實時系統的高精度定時需求。

*其他延遲

此外,Linux核心其他子系統也存在多種延遲。比如為了增強核心性能和減少記憶體消耗,Linux僅在需要時裝載程式位址空間相應的記憶體頁。當被存取内容(如代碼)不在RAM中則記憶體管理單元(MMU)将産生頁表錯誤(Page-Fault)觸發頁面裝載,造成實時程序響應時間不确定。

Linux實時化技術發展

主流Linux核心1.x、2.2.x和2.4.x版本的Linux核心無搶占支援,直到2.6版本的Linux核心才支援可搶占核心,支援臨界區外的核心搶占和可搶占的大核心鎖。在此基礎上,Linux采用了下列兩類實時化技術。

*雙核心方式

Linux核心實時化雙核心方式以RTLinux、RTAI和Xenomai等為典型代表。其中RT-Linux實作了一個微核心實時作業系統支援底層任務管理、中斷服務例程、底層任務通信隊列等。普通Linux作為實時作業系統的最低優先級任務,Linux下的任務通過FIFO命名管道和實時任務進行通信,如圖1所示。

【嵌入式】linux核心感覺,Linux核心時延、實時化主流技術和發展

圖1雙核心架構的Linux實時化技術

當Linux要關閉中斷時,實時微核心會截取并記錄這個請求,通過軟體來模拟中斷控制器,而沒有真正關閉硬體中斷,避免了由于關中斷所造成的響應延遲。RT-Linux将系統實時時鐘設定為單次觸發模式,提供微秒級的時鐘精度。RTAI類似RTLinux的實作方式,不同之處在于它修改了體系結構相關代碼,形成一個實時硬體抽象層(RTHAL),使其實時任務能在任何時刻中斷普通Linux任務,兩者之間通過非阻塞隊列進行通訊。RTAI将直接修改Linux核心的代碼減至最少,具有更好的可移植性。Xenomai以RTAI為基礎,也稱RTAI /Fusion。采用了Adeos微核心替代RTAI的硬體抽象層。其特色還在于模仿了傳統RTOS的API接口,推動傳統RTOS應用在GNU/Linux下的移植。類似還有基于Fiasco微核心的L4Linux等開源項目。

*核心更新檔方式

雙核心實時方案下,實時任務需要按照微核心實時作業系統提供的另外一套API進行設計。而核心更新檔方式則不改變Linux的API,原有應用程式可在實時化後的作業系統上運作,典型的有早期研究性的Kurt-Linux和Red-Linux,商業版本的MontaVista、TimeSys和Wind River Linux,以及現階段Ingo Monlnar等人開發的實時搶占更新檔核心等。

Kurt-Linux是第一個基于普通Linux的實時作業系統。通過正常态、實時态和混合态進行實時和非實時任務的劃分。RED-Linux通過任務多種屬性和排程程式,可以實作多種排程算法。采用軟體模拟中斷管理,并在核心插入了許多搶占點,提高了系統排程精度。

MontaVista Linux在低延遲更新檔以及可搶占核心更新檔基礎上,通過開發核心O(1)實時排程程式并對可搶占核心進行了改進和測試,Linux 2.4核心時代MontaVista Linux作為商業成熟産品在實時性上有較強的優勢。TimeSys Linux通過核心子產品的方式也提供了高精度時鐘、優先級繼承mutex等支援。

2.6版本的主流核心吸收了以上技術,支援CONFIG_PREEMPT_NONE,CONFIG_PREEMPT_VOLUNTARY和CONFIG_PREEMPT等多種配置選項。分别适合于計算型任務系統,桌面使用者系統和毫秒級延遲嵌入式系統。2005年,針對2.6核心MontaVista推出了實時Linux計劃,推進了Linux核心實時化程序。随後Ingo Molnar釋出了新的實時搶占更新檔,并逐漸成為Linux核心實時主流技術,也為包括MontaVista Linux,Wind River Linux采用和補充,本文後續内容這要涉及實時搶占更新檔。

Linux實時化技術及評價

2.6版本Linux核心實時性能有一定增強,雙核心方式的Linux實時化技術也在不斷發展中。原來由FSMLab維護的RTLinux,其版權在2007年2月被Wind River購買,先對在開源社群就不很活躍,RTAI支援x386等體系結構,但由于其代碼較難維護、bug較難調試等原因,許多開發者加入了Xenomai項目。Xenomai支援最新2.6版 Linux,相比之下代碼相對穩定和可維護,開發模式較活躍。

核心更新檔方式的Linux實時化技術在2.6版核心基礎上做了大量改進,使得核心中除了中斷關閉和IRQ線程分派、排程和上下文切換之外的絕大部分代碼都可以被搶占,不可搶占的自旋鎖保護臨界區從一千多個減少到幾十個,使得核心實時性得到極大的提高,獲得社群廣泛支援并逐漸成為Linux實時化主流技術。

Linux核心實時化改進

實時搶占核心更新檔針對Linux各種延遲進行了實時化改進,主要包括了幾個方面的技術。

*實時搶占核心

為了實作核心完全可搶占,實時核心臨界區用高性能優先級繼承mutex替換原來自旋鎖(spin-lock)來進行保護,使得在臨界區内的執行也可被搶占。隻有當線程想通路一個其他線程正在通路的臨界區時,才被排程至睡眠,直到所保護的臨界區被釋放時被喚醒。

在實時搶占核心中通過優先級繼承機制(PI)線上程被一個低優先級線程所持有的資源阻塞時,低優先級線程通過繼承被阻塞線程優先級,盡快執行并釋放所持資源而不被其他線程所搶占。

*新型鎖機制帶來核心性能提升

實時搶占更新檔替換了大核心鎖(BKL),将BKL從spinlock改成是mutex,持有BKL的線程也可以被搶占,減少了核心排程延遲。此外,實時搶占更新檔通過mutex替代semaphore,避免了不必要的時間負載。實時搶占更新檔實作了可搶占的RCU(Read Copy Update)鎖和串行化讀寫鎖,保證了執行可預測性,提高了性能。

*中斷線程化

實時搶占更新檔通過核心線程來實作一些硬體中斷和軟體中斷的服務程式。體系結構相關處理代碼設定IRQ狀态、檢查線程化的中斷是否使能,并喚醒相關線程。在中斷線程被排程執行後,進行中斷服務處理。在實時搶占核心中,使用者線程優先級可以高于裝置中斷服務線程。實時任務無需等待裝置驅動處理程式執行,減小了實時搶占延遲。

*時鐘系統改進

實時搶占核心的時鐘系統重新進行了設計,實作了高精度定時器。時鐘精度不再依賴jiffies,使POSIX定時器和nanosleep精度由具體硬體所能提供的精度決定,使得gettimeofday能夠提供實時系統所需的精确時間值。

*其他改進

Linux在使用者層支援性能良好的futex,實作原理類似于核心優先級繼承mutex,僅在産生競态時進入核心,提高了應用程式性能。此外,實時搶占更新檔核心還提供mutex死鎖檢測、延遲跟蹤與測量、中斷關閉跟蹤與延遲測量、搶占延遲測量等核心調試與診斷、核心性能測量與調優等工具、實時Trace支援(Ftrace)等支援。

現階段實時化技術在各體系結構上逐漸得到了支援,如表1所示。

【嵌入式】linux核心感覺,Linux核心時延、實時化主流技術和發展

表1 Linux實時搶占更新檔技術支援情況

實時搶占核心延遲

現階段,實時搶占更新檔技術仍處于完善過程中,其表現在以下幾點不足。

*中斷延遲

即使不發生中斷線程搶占,實時搶占核心相對原來中斷服務機制額外增加一對上下文切換時間,用于喚醒中斷服務線程執行和進入睡眠狀态。此外,核心中還存在少量用raw_spinlock鎖禁用中斷來保護的臨界區,需要計算這些鎖造成的中斷延遲。

*任務搶占延遲

核心搶占延遲主要是由于在核心中使用各種鎖機制用于控制任務和中斷對臨界區的通路所造成的,特别是實時搶占核心中為了避免優先級逆轉增加的鎖機制帶來了額外時間負載。

*核心子產品其他延遲

在實時搶占更新檔中,記憶體管理子產品還需減少頁表錯誤引起的延遲,降低mlockall記憶體鎖存造成的性能降級影響。實時搶占核心中高精度定時器的使用導緻了額外定時器管理時間負載。此外,核心中一些驅動程式需要針對實時應用進行優化來提高實時響應。軟浮點處理和軟浮點核心仿真需要和實時搶占更新檔相容,能耗管理子系統還需要具備實時系統感覺能力。

實時搶占核心性能測試

本文在Intel Pentium M 1.7 GHz處理器上進行了測試。測試環境包括:Linux核心2.6.25.8最小配置;patch-2.6.25.8-rt7實時更新檔;libc 2.5+和busybox-1.10.0建構initrdfs方式的根檔案系統。

*中斷延遲

采用實時搶占更新檔支援的核心中斷延遲測量工具測量中斷關閉(IRQ OFF)時間。在100%負載情況下,十萬采樣點中,最大值在31 us左右,絕大多數在1 us左右,如圖2所示。

【嵌入式】linux核心感覺,Linux核心時延、實時化主流技術和發展

圖2實時搶占核心中斷關閉延遲分布

*任務搶占延遲

核心搶占關閉時間采用實時搶占更新檔所支援的核心搶占關閉測量工具測量。實時搶占核心和普通Linux核心情況比較如表2所示。

【嵌入式】linux核心感覺,Linux核心時延、實時化主流技術和發展

表2核心任務搶占關閉時間分布

實時應用中周期性任務需要能在确定的時間内得到執行。實時搶占核心和普通核心下的周期性任務延遲對比中可以看出實時搶占核心提供了實時任務的精确執行,如圖3所示。

【嵌入式】linux核心感覺,Linux核心時延、實時化主流技術和發展

圖3實時搶占核心和普通核心下周期性任務排程延遲對比

結語

嵌入式應用對Linux實時性要求越來越多,主流核心逐漸加入實時化技術,最終将為實時應用提供完美解決方案。本文綜述了Linux核心時延,介紹了Linux核心實時化發展,分析了核心實時化主流技術,并分析了實時化技術不足之處,為更好地了解Linux實時化技術提供了參考。