<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式Linux實(shí)時(shí)化技術(shù)

嵌入式Linux實(shí)時(shí)化技術(shù)

—— Embedded Linux Real-Time Technology
作者:黃武陵 中科院自動(dòng)化所,何小慶 北京麥克泰軟件技術(shù)有限公司,艾云峰 中科院研究生院 時(shí)間:2009-02-26 來(lái)源:電子產(chǎn)品世界 收藏

摘要:已經(jīng)被移植到多種處理器,并得到廣泛應用。主流內核實(shí)時(shí)性能不斷增強,但在工業(yè)控制等特定場(chǎng)合仍無(wú)法滿(mǎn)足強實(shí)時(shí)性需求。本文分析了內核時(shí)延和實(shí)時(shí)化主流技術(shù),對實(shí)時(shí)搶占內核技術(shù)進(jìn)行了分析和評測。
關(guān)鍵詞:內核延遲分析;內核實(shí)時(shí)化技術(shù);實(shí)時(shí)搶占內核分析;Linux實(shí)時(shí)性

本文引用地址:http://dyxdggzs.com/article/91768.htm

引言

  Linux支持PowerPC、MIPS、ARM、DSP等多種處理器,逐漸被用于多種關(guān)鍵性場(chǎng)合。其中實(shí)時(shí)多媒體處理、工業(yè)控制、汽車(chē)電子等特定應用對Linux提出了強實(shí)時(shí)性需求[1]。Linux提供了一些實(shí)時(shí)擴展,但需要進(jìn)行實(shí)時(shí)性改造。本文針對Linux實(shí)時(shí)化技術(shù)中的一些關(guān)鍵問(wèn)題進(jìn)行了討論,如Linux內核時(shí)延,實(shí)時(shí)化主流技術(shù)方案及其評價(jià)等。

Linux內核時(shí)延

  主流Linux雖然部分滿(mǎn)足POSIX 1003.1b實(shí)時(shí)擴展標準,但還不完全是一個(gè)實(shí)時(shí)操作系統,主要表現為:

  * 任務(wù)調度與內核搶占

  2.6版本內核添加了許多搶占點(diǎn),使進(jìn)程執行在內核代碼時(shí)也可被搶占。為支持內核代碼可搶占,在2.6版內核中通過(guò)采用禁用中斷的自旋鎖來(lái)保護臨界區。但此時(shí)如果有低優(yōu)先級進(jìn)程在臨界區中執行,高優(yōu)先級進(jìn)程即使不訪(fǎng)問(wèn)低優(yōu)先級所保護的臨界區,也必須等待低優(yōu)先級進(jìn)程退出臨界區。

  * 中斷延遲

  在主流Linux內核設計中,中斷可以搶占最高優(yōu)先級的任務(wù),使高優(yōu)先級任務(wù)被阻塞的最長(cháng)時(shí)間不確定。而且,由于內核為保護臨界區需要關(guān)閉中斷,更加增長(cháng)了高優(yōu)先級任務(wù)阻塞時(shí)間。

  * 時(shí)鐘精度

  Linux通過(guò)硬件時(shí)鐘編程來(lái)產(chǎn)生毫秒級周期性時(shí)鐘中斷進(jìn)行內核時(shí)間管理,無(wú)法滿(mǎn)足實(shí)時(shí)系統較高精度的調度要求。內核定時(shí)器精度同樣也受限于時(shí)鐘中斷,無(wú)法滿(mǎn)足實(shí)時(shí)系統的高精度定時(shí)需求。

  * 其他延遲

  此外,Linux內核其他子系統也存在多種延遲。比如為了增強內核性能和減少內存消耗,Linux僅在需要時(shí)裝載程序地址空間相應的內存頁(yè)。當被存取內容(如代碼)不在RAM中則內存管理單元(MMU)將產(chǎn)生頁(yè)表錯誤(Page-Fault)觸發(fā)頁(yè)面裝載,造成實(shí)時(shí)進(jìn)程響應時(shí)間不確定。

Linux實(shí)時(shí)化技術(shù)發(fā)展

  主流Linux內核1.x、2.2.x和2.4.x版本的Linux內核無(wú)搶占支持,直到2.6版本的Linux內核才支持可搶占內核,支持臨界區外的內核搶占和可搶占的大內核鎖。在此基礎上,Linux采用了下列兩類(lèi)實(shí)時(shí)化技術(shù)。

  * 雙內核方式

  Linux內核實(shí)時(shí)化雙內核方式以RTLinux、RTAI和Xenomai等為典型代表。其中RT-Linux實(shí)現了一個(gè)微內核實(shí)時(shí)操作系統支持底層任務(wù)管理、中斷服務(wù)例程、底層任務(wù)通信隊列等。普通Linux作為實(shí)時(shí)操作系統的最低優(yōu)先級任務(wù),Linux下的任務(wù)通過(guò)FIFO命名管道和實(shí)時(shí)任務(wù)進(jìn)行通信,如圖1所示。


圖1 雙內核架構的Linux實(shí)時(shí)化技術(shù)

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

  * 內核補丁方式

  雙內核實(shí)時(shí)方案下,實(shí)時(shí)任務(wù)需要按照微內核實(shí)時(shí)操作系統提供的另外一套API進(jìn)行設計。而內核補丁方式則不改變Linux的API,原有應用程序可在實(shí)時(shí)化后的操作系統上運行,典型的有早期研究性的Kurt-Linux和Red-Linux,商業(yè)版本的MontaVista [2]、TimeSys 和Wind River Linux,以及現階段Ingo Monlnar等人開(kāi)發(fā)的實(shí)時(shí)搶占補丁內核等[3]。

  Kurt-Linux是第一個(gè)基于普通Linux的實(shí)時(shí)操作系統。通過(guò)正常態(tài)、實(shí)時(shí)態(tài)和混合態(tài)進(jìn)行實(shí)時(shí)和非實(shí)時(shí)任務(wù)的劃分。RED-Linux通過(guò)任務(wù)多種屬性和調度程序,可以實(shí)現多種調度算法。采用軟件模擬中斷管理,并在內核插入了許多搶占點(diǎn),提高了系統調度精度。

  MontaVista Linux在低延遲補丁以及可搶占內核補丁基礎上[4],通過(guò)開(kāi)發(fā)內核O(1)實(shí)時(shí)調度程序并對可搶占內核進(jìn)行了改進(jìn)和測試,Linux 2.4內核時(shí)代MontaVista Linux 作為商業(yè)成熟產(chǎn)品在實(shí)時(shí)性上有較強的優(yōu)勢。TimeSys Linux通過(guò)內核模塊的方式也提供了高精度時(shí)鐘、優(yōu)先級繼承mutex等支持。

  2.6版本的主流內核吸收了以上技術(shù),支持CONFIG_PREEMPT_NONE,CONFIG_PREEMPT_VOLUNTARY和CONFIG_PREEMPT等多種配置選項。分別適合于計算型任務(wù)系統,桌面用戶(hù)系統和毫秒級延遲嵌入式系統。2005年,針對2.6內核MontaVista推出了實(shí)時(shí)Linux計劃,推進(jìn)了Linux內核實(shí)時(shí)化進(jìn)程。隨后Ingo Molnar發(fā)布了新的實(shí)時(shí)搶占補丁,并逐漸成為L(cháng)inux內核實(shí)時(shí)主流技術(shù),也為包括MontaVista Linux,Wind River Linux采用和補充,本文后續內容這要涉及實(shí)時(shí)搶占補丁。

Linux實(shí)時(shí)化技術(shù)及評價(jià)

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

  內核補丁方式的Linux實(shí)時(shí)化技術(shù)在2.6版內核基礎上做了大量改進(jìn),使得內核中除了中斷關(guān)閉和IRQ線(xiàn)程分派、調度和上下文切換之外的絕大部分代碼都可以被搶占,不可搶占的自旋鎖保護臨界區從一千多個(gè)減少到幾十個(gè),使得內核實(shí)時(shí)性得到極大的提高,獲得社區廣泛支持并逐漸成為L(cháng)inux實(shí)時(shí)化主流技術(shù)。

Linux內核實(shí)時(shí)化改進(jìn)

  實(shí)時(shí)搶占內核補丁針對Linux各種延遲進(jìn)行了實(shí)時(shí)化改進(jìn)[5],主要包括了幾個(gè)方面的技術(shù)。

  * 實(shí)時(shí)搶占內核

  為了實(shí)現內核完全可搶占,實(shí)時(shí)內核臨界區用高性能優(yōu)先級繼承mutex替換原來(lái)自旋鎖(spin-lock)來(lái)進(jìn)行保護,使得在臨界區內的執行也可被搶占。只有當線(xiàn)程想訪(fǎng)問(wèn)一個(gè)其他線(xiàn)程正在訪(fǎng)問(wèn)的臨界區時(shí),才被調度至睡眠,直到所保護的臨界區被釋放時(shí)被喚醒。

  在實(shí)時(shí)搶占內核中通過(guò)優(yōu)先級繼承機制(PI)在線(xiàn)程被一個(gè)低優(yōu)先級線(xiàn)程所持有的資源阻塞時(shí),低優(yōu)先級線(xiàn)程通過(guò)繼承被阻塞線(xiàn)程優(yōu)先級,盡快執行并釋放所持資源而不被其他線(xiàn)程所搶占。

  * 新型鎖機制帶來(lái)內核性能提升

  實(shí)時(shí)搶占補丁替換了大內核鎖(BKL),將BKL從spin lock改成是mutex,持有BKL的線(xiàn)程也可以被搶占,減少了內核調度延遲。此外,實(shí)時(shí)搶占補丁通過(guò)mutex替代semaphore,避免了不必要的時(shí)間負載。實(shí)時(shí)搶占補丁實(shí)現了可搶占的RCU(Read Copy Update)鎖和串行化讀寫(xiě)鎖,保證了執行可預測性,提高了性能。

  * 中斷線(xiàn)程化

  實(shí)時(shí)搶占補丁通過(guò)內核線(xiàn)程來(lái)實(shí)現一些硬件中斷和軟件中斷的服務(wù)程序。體系結構相關(guān)處理代碼設置IRQ狀態(tài)、檢查線(xiàn)程化的中斷是否使能,并喚醒相關(guān)線(xiàn)程。在中斷線(xiàn)程被調度執行后,進(jìn)行中斷服務(wù)處理。在實(shí)時(shí)搶占內核中,用戶(hù)線(xiàn)程優(yōu)先級可以高于設備中斷服務(wù)線(xiàn)程。實(shí)時(shí)任務(wù)無(wú)需等待設備驅動(dòng)處理程序執行,減小了實(shí)時(shí)搶占延遲。

  * 時(shí)鐘系統改進(jìn)

  實(shí)時(shí)搶占內核的時(shí)鐘系統重新進(jìn)行了設計,實(shí)現了高精度定時(shí)器[6]。時(shí)鐘精度不再依賴(lài)jiffies,使POSIX定時(shí)器和nanosleep精度由具體硬件所能提供的精度決定,使得gettimeofday能夠提供實(shí)時(shí)系統所需的精確時(shí)間值。

  * 其他改進(jìn)

  Linux在用戶(hù)層支持性能良好的futex,實(shí)現原理類(lèi)似于內核優(yōu)先級繼承mutex,僅在產(chǎn)生競態(tài)時(shí)進(jìn)入內核,提高了應用程序性能。此外,實(shí)時(shí)搶占補丁內核還提供mutex死鎖檢測、延遲跟蹤與測量、中斷關(guān)閉跟蹤與延遲測量、搶占延遲測量等內核調試與診斷、內核性能測量與調優(yōu)等工具、實(shí)時(shí)Trace支持( Ftrace)等支持。

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

表1 Linux實(shí)時(shí)搶占補丁技術(shù)支持情況


實(shí)時(shí)搶占內核延遲

  現階段,實(shí)時(shí)搶占補丁技術(shù)仍處于完善過(guò)程中,其表現在以下幾點(diǎn)不足。

  * 中斷延遲

  即使不發(fā)生中斷線(xiàn)程搶占,實(shí)時(shí)搶占內核相對原來(lái)中斷服務(wù)機制額外增加一對上下文切換時(shí)間,用于喚醒中斷服務(wù)線(xiàn)程執行和進(jìn)入睡眠狀態(tài)。此外,內核中還存在少量用raw_spinlock鎖禁用中斷來(lái)保護的臨界區,需要計算這些鎖造成的中斷延遲。

  * 任務(wù)搶占延遲

  內核搶占延遲主要是由于在內核中使用各種鎖機制用于控制任務(wù)和中斷對臨界區的訪(fǎng)問(wèn)所造成的,特別是實(shí)時(shí)搶占內核中為了避免優(yōu)先級逆轉增加的鎖機制帶來(lái)了額外時(shí)間負載。

  * 內核模塊其他延遲

  在實(shí)時(shí)搶占補丁中,內存管理模塊還需減少頁(yè)表錯誤引起的延遲,降低mlockall內存鎖存造成的性能降級影響。實(shí)時(shí)搶占內核中高精度定時(shí)器的使用導致了額外定時(shí)器管理時(shí)間負載。此外,內核中一些驅動(dòng)程序需要針對實(shí)時(shí)應用進(jìn)行優(yōu)化來(lái)提高實(shí)時(shí)響應。軟浮點(diǎn)處理和軟浮點(diǎn)內核仿真需要和實(shí)時(shí)搶占補丁兼容,能耗管理子系統還需要具備實(shí)時(shí)系統感知能力。
實(shí)時(shí)搶占內核性能測試

  本文在Intel Pentium M 1.7 GHz處理器上進(jìn)行了測試。測試環(huán)境包括:Linux內核2.6.25.8最小配置;patch-2.6.25.8-rt7實(shí)時(shí)補??;libc 2.5+和busybox-1.10.0構建initrdfs方式的根文件系統。

  * 中斷延遲

  采用實(shí)時(shí)搶占補丁支持的內核中斷延遲測量工具測量中斷關(guān)閉(IRQ OFF)時(shí)間。在100%負載情況下,十萬(wàn)采樣點(diǎn)中,最大值在31 us左右,絕大多數在1 us左右,如圖2所示。


圖2 實(shí)時(shí)搶占內核中斷關(guān)閉延遲分布

  * 任務(wù)搶占延遲

  內核搶占關(guān)閉時(shí)間采用實(shí)時(shí)搶占補丁所支持的內核搶占關(guān)閉測量工具測量。實(shí)時(shí)搶占內核和普通Linux內核情況比較如表2所示。

表2 內核任務(wù)搶占關(guān)閉時(shí)間分布


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


圖3 實(shí)時(shí)搶占內核和普通內核下周期性任務(wù)調度延遲對比

結語(yǔ)

  嵌入式應用對Linux實(shí)時(shí)性要求越來(lái)越多,主流內核逐漸加入實(shí)時(shí)化技術(shù),最終將為實(shí)時(shí)應用提供完美解決方案。本文綜述了Linux內核時(shí)延,介紹了Linux內核實(shí)時(shí)化發(fā)展,分析了內核實(shí)時(shí)化主流技術(shù),并分析了實(shí)時(shí)化技術(shù)不足之處,為更好地理解Linux實(shí)時(shí)化技術(shù)提供了參考。

參考文獻:

[1] 何小慶,比爾·溫博格.移動(dòng)電話(huà)挑戰嵌入式Linux[J].電子產(chǎn)品世界,2006(12)
[2] Real-Time Linux[R/OL].http://www.mvista.com/real_time_linux.php
[3] Index of /pub/linux/kernel/projects/rt. [R/OL]. http://www.kernel.org/pub/linux/kernel/projects/rt/
[4] WILLIAMS C. Linux Scheduler Latency[R/OL].  (2002-03-20). http://www.linuxdevices.com/articles/AT8906594941.html
[5] D. Hart; J. Stultz; T. Ts’o, Real-time Linux in real time, IBM SYSTEMS JOURNAL, VOL 47, NO 2, 2008
[6] Index of /pub/linux/kernel/people/tglx/hrtimers【R/OL】.  http://www.kernel.org/pub/linux/kernel/people/tglx/hrtimers/
[7] Paul E. McKenney,‘Real Time’ vs. ‘Real Fast’: How to Choose?, Proceedings of the Linux Symposium Volume One, 2008 Ottawa, Ontario Canada, p57-p66

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux相關(guān)文章:linux教程




關(guān)鍵詞: 嵌入式 Linux 200902

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>