基于A(yíng)PIC時(shí)鐘的嵌入式Linux內核實(shí)時(shí)化研究
引言
嵌入式Linux是指對Linux進(jìn)行剪裁后,將其固化在單片機或者存儲器中,應用于特定場(chǎng)合的專(zhuān)用Linux系統。嵌入式系統要求實(shí)時(shí)性能高,但Linux為分時(shí)系統設計的操作系統,盡管最新的內核在實(shí)時(shí)性能方面有所提高,但它仍然不是一個(gè)實(shí)時(shí)系統,在很多場(chǎng)合不能滿(mǎn)足實(shí)時(shí)性要求。一般地,通過(guò)改造Linux的內核以提高其實(shí)時(shí)性能有2種策略:一種是采用底層編程的方法對Linux內核進(jìn)行修改(如調度算法、時(shí)鐘修改等),典型的系統有Kansas大學(xué)開(kāi)發(fā)的KURT。文獻提出了搶占式內核調度算法,容易引起內核優(yōu)先級翻轉,文獻針對非搶占式內核,增加搶占點(diǎn),該方法需要優(yōu)秀的調度算法。另一種途徑是Linux的外部實(shí)時(shí)性擴展,在原有Linux基礎上再設計一個(gè)用于專(zhuān)門(mén)處理實(shí)時(shí)進(jìn)程的內核,典型的系統有RTLinux、RTAI等。此方法的不足是RTLinux現在已經(jīng)停止了更新,目前的開(kāi)源版本僅支持2.4內核,RTAI的設計原理和RTLinux類(lèi)似,也是一個(gè)實(shí)時(shí)性應用接口。本文采用APIC時(shí)鐘修改的方法對Linux內核進(jìn)行實(shí)時(shí)化改造,修改APIC中斷函數,將APIC中斷和8254中斷排序,使得硬實(shí)時(shí)中斷的優(yōu)先級大于普通8254中斷。通過(guò)多組仿真實(shí)驗,驗證了該改造方法是有效的。
1 嵌入式Linux的實(shí)時(shí)性分析
Linux設計的初衷是系統吞吐量的平衡,其內核試圖通過(guò)一種公平分配的策略來(lái)實(shí)現各進(jìn)程平均地共享系統資源:
(1)內核的不可搶占性:Linux的內核在單處理器上不可搶占,當一個(gè)任務(wù)進(jìn)入內核態(tài)運行時(shí),一個(gè)具有更高優(yōu)先級的進(jìn)程,只有等待處于核心態(tài)的系統調用返回后方能執行,這將導致優(yōu)先級逆轉。
(2)進(jìn)程調度的不可搶占性:Linux作為一個(gè)分時(shí)系統,采用多級反饋輪轉調度算法,它保證了每一個(gè)進(jìn)程都有一種調度策略,但是都放在同一個(gè)隊列中運行,這也是Linux作為實(shí)時(shí)操作系統的一個(gè)弱點(diǎn)。圖1是Linux調度機制框圖。
(3)時(shí)鐘中斷的精度不高:Linux 2.4.X內核的時(shí)鐘中斷周期為10 ms,時(shí)鐘粒度太過(guò)于粗糙,不能滿(mǎn)足實(shí)時(shí)性要求。
(4)Linux的虛擬存儲管理:Linux采用段和頁(yè)機制的虛擬存儲管理技術(shù),進(jìn)程在硬盤(pán)和內存間的換入換出必然帶來(lái)額外的開(kāi)銷(xiāo),造成很大的延遲。
由此可見(jiàn),要將Linux應用于嵌入式系統,必須對其進(jìn)行實(shí)時(shí)化改造,以適應嵌入式領(lǐng)域要求。
2 基于時(shí)鐘修改的內核改造方案
在單CPU系統中,與時(shí)間有關(guān)的活動(dòng)都是由8254時(shí)鐘芯片來(lái)驅動(dòng)的,8254產(chǎn)生0號中斷。直接修改內核定時(shí)參數HZ的初值就可構造細粒度定時(shí)器。這種方式實(shí)現起來(lái)很簡(jiǎn)單,但是由此帶來(lái)頻繁的定時(shí)中斷使得系統的開(kāi)銷(xiāo)很大,當然隨著(zhù)硬件速度的提高,這種開(kāi)銷(xiāo)會(huì )逐步降低。
簡(jiǎn)單地修改赫茲參數HZ進(jìn)行實(shí)時(shí)化的方法顯然并不可取。Linux 2.6內核的時(shí)鐘粒度是1 ms,但仍然與嵌入式領(lǐng)域的實(shí)時(shí)化要求差距較遠,因此需要更高精度的時(shí)鐘。目前常見(jiàn)的修改時(shí)鐘系統達到實(shí)時(shí)化的方法都是從軟件層面著(zhù)手,這方面己獲得較大進(jìn)展,但是從時(shí)鐘系統的硬件結構分析并開(kāi)展實(shí)時(shí)化工作也是一個(gè)值得注意的方向。本文利用先進(jìn)的APIC時(shí)鐘實(shí)現一個(gè)高精度時(shí)鐘系統,提供了高精度的中斷響應,從而以較少的改動(dòng)獲得較高的實(shí)時(shí)性。
APIC以總線(xiàn)頻率工作,可立即執行所有的定時(shí)器操作,目前x86都有片內APIC,用戶(hù)可在單CPU內使用APIC。APIC除了能提供高精度的時(shí)鐘外還具有一個(gè)重要的優(yōu)點(diǎn),是由于它位于片內,對其編程只需幾個(gè)CPU指令周期,而對IntelX86的8254存取需要若干慢速的ISA總線(xiàn)指令。
在100MHz的CPU系統中,處理一個(gè)中斷的時(shí)間不到10μs,因此高速CPU完全可在更短的時(shí)間內處理更多的APIC中斷。理論上APIC可實(shí)現10 ns左右的系統時(shí)鐘,但實(shí)際上在處理中斷時(shí)要耗費一些時(shí)間,因此中斷的響應時(shí)間要大于10 ns。
APIC本身提供了中斷處理函數apic_timer_interrupt,該函數包括Irq_enter(),Run_realtimer_queue()和irq_exit(),其中函數irq_ exit通常負責判斷當前是否有8254產(chǎn)生的軟中斷存在,如果存在,就會(huì )觸發(fā)8254軟中斷,這樣會(huì )造成APIC硬中斷處理延遲。本文的思路就是修改irq_exit,在其中將各軟中斷線(xiàn)程和硬中斷線(xiàn)程進(jìn)行排序,使APIC硬中斷的優(yōu)先級高于軟中斷,此時(shí)硬中斷線(xiàn)程得到優(yōu)先處理,從而提高內核的實(shí)時(shí)性能。Irp_exit函數的核心代碼如下:
評論