uClinux操作系統的實(shí)時(shí)化分析與研究
1.引言
嵌入式Linux作為一個(gè)開(kāi)放源代碼的操作系統,以?xún)r(jià)格低廉、功能強大又易于移植的特性正在被廣泛應用,μClinux是專(zhuān)門(mén)針對沒(méi)有 MMU(Memory Manage Unit)的處理器而設計的嵌入式Linux,非常適合中低端嵌入式系統的需求。μClinux雖然符合POSIX1003.1B關(guān)于實(shí)時(shí)擴展部分的標準,但其最初的設計目標為通用分時(shí)操作系統,如果把μClinux用在工業(yè)控制、進(jìn)程控制等微控制領(lǐng)域內,必須要增強μClinux的實(shí)時(shí)性能。
目前,對嵌入式Linux的實(shí)時(shí)化改造方案主要有3種:一種是直接修改內核插入搶占點(diǎn)[3],另外一種是資源內核方法[4],最后一種是雙內核架構的解決方案。但3種方法中前兩種都只能用于軟實(shí)時(shí)應用,只有雙內核[2]架構的方案可以保障硬實(shí)時(shí)應用需求。目前,Linux平臺下開(kāi)發(fā)的具有硬實(shí)時(shí)功能的系統主要有:RTLinux和RTAI[1](Real Time Application Interface)?;?a class="contentlabel" href="http://dyxdggzs.com/news/listbylabel/label/RTAI">RTAI增強Linux的實(shí)時(shí)性方面研究得比較多,但是,基于RTAI增強μClinux實(shí)時(shí)性方面還未見(jiàn)到成型的產(chǎn)品。因此,本文借鑒RTAI對Linux的實(shí)時(shí)改進(jìn)機理,對μClinux的實(shí)時(shí)性改造進(jìn)行了分析與研究。
2. μClinux的內存管理
標準Linux使用虛擬存儲器技術(shù),應用在帶有MMU的處理器上,虛擬地址被送到MMU,把虛擬地址映射為物理地址。而μClinux同標準Linux的最大區別就在于內存管理,只有了解它們內存管理的差異后,才能更好地利用RTAI對μClinux進(jìn)行實(shí)時(shí)化改造。
μClinux雖然為嵌入式系統做了許多小型化的工作[5],但μClinux與標準Linux的架構完全一致。μClinux雖然無(wú)法使用處理器的虛擬內存管理技術(shù),但μClinux仍然采用存儲器的分頁(yè)管理,系統在啟動(dòng)時(shí)把實(shí)際存儲器進(jìn)行分頁(yè),在加載應用程序時(shí)分頁(yè)加載。一個(gè)進(jìn)程在執行前,系統必須為進(jìn)程分配足夠的連續地址空間,然后全部載入主存儲器的連續空間中。μClinux采用實(shí)存儲器管理策略,通過(guò)地址總線(xiàn)對物理內存進(jìn)行直接訪(fǎng)問(wèn)。所有程序中訪(fǎng)問(wèn)的地址都是實(shí)際的物理地址,操作系統對內存空間沒(méi)有保護,所有的進(jìn)程都在一個(gè)運行空間中運行(包括內核進(jìn)程)。
在μClinux系統中,缺少了MMU的內存映射,μClinux必須在可執行文件加載階段對可執行文件reloc處理,使得程序執行時(shí)能夠直接使用物理內存;其次,μClinux沒(méi)有自動(dòng)生長(cháng)的堆棧,也沒(méi)有brk()函數,用戶(hù)空間的程序必須使用mmap()命令來(lái)分配內存;同時(shí),在實(shí)現多個(gè)進(jìn)程時(shí)需要實(shí)現數據保護,μClinux雖然支持fork()函數,但實(shí)質(zhì)是所有的多進(jìn)程管理都通過(guò)vfork()函數來(lái)實(shí)現。vfork() 是μClinux與標準Linux應用程序的開(kāi)發(fā)中最重要的不同之處,只有對vfork()與fork()兩個(gè)函數的差異和程序處理機制有詳細的了解后,才能順利地完成從Linux到μClinux的程序移植。
3. 基于RTAI的Linux硬實(shí)時(shí)支持方案
3.1 RTAI簡(jiǎn)介
RTAI for Linux[6]是雙內核架構的Linux實(shí)時(shí)化方案的典型代表,它由意大利的Milan大學(xué)主持,是近年來(lái)非?;钴S的開(kāi)源項目。系統的實(shí)現基礎是在Linux上定義了一組實(shí)時(shí)硬件抽象層RTHAL(Real Time Hardware Abstraction Layer),通過(guò)RTHAL進(jìn)行硬件管理,把基本內核和實(shí)時(shí)內核結合在一起,其中一個(gè)內核的改變,不會(huì )影響另一個(gè)內核的執行,RTHAL將RTAI需要在Linux中修改的部分定義成一組程序界面,RTAI只使用這組界面和Linux溝通,其系統結構如圖1所示。
3.2 RTAI的RTHAL
RTAI從內核中提取一個(gè)RTHAL,RTAI首先是一個(gè)中斷分發(fā)器,當RTAI模塊被加載后,CPU中斷仍由Linux管理,RTAI只接管外部設備的中斷并分發(fā)(有可能仍分發(fā)給Linux)。這種接管是通過(guò)RTHAL來(lái)實(shí)現的,RTHAL包含一些重要的函數和數據結構,RTAI模塊可能修改的內容都收集在此結構體中。
圖1雙內核實(shí)時(shí)μClinux架構 |
當RTAI裝載時(shí),只需要重新設置RTHAL中的各項內容。內核需要修改執行RTHAL以代替原來(lái)的內容,如
do_IRQ(irq,dummy);
被修改為:
rthal.c_do_IRQ(irq,dummy);
Linux初始化RTHAL為指向原始的函數和數據結構,RTHAL僅僅進(jìn)行重定向。當RTAI被激活,RTHAL保存并且改變這些函數的值為 RTAI自己的內容。以上段代碼為例,當RTAI還沒(méi)有加載時(shí),rthal.c_do_IRQ的值就是Linux的do_IRQ,當RTAI被加載時(shí),RTAI執行以下代碼,將rthal.c_do_IRQ替換成RTAI自己的分發(fā)器:
rthal.c_do_IRQ=dispatch_irq;
評論