新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > uClinux操作系統(tǒng)的實時化分析與研究

uClinux操作系統(tǒng)的實時化分析與研究

作者: 時間:2012-05-21 來源:網絡 收藏

1.引言

嵌入式Linux作為一個開放源代碼的操作系統(tǒng),以價格低廉、功能強大又易于移植的特性正在被廣泛應用,是專門針對沒有 MMU(Memory Manage Unit)的處理器而設計的嵌入式Linux,非常適合中低端嵌入式系統(tǒng)的需求。雖然符合POSIX1003.1B關于實時擴展部分的標準,但其最初的設計目標為通用分時操作系統(tǒng),如果把用在工業(yè)控制、進程控制等微控制領域內,必須要增強μClinux的能。

目前,對嵌入式Linux的實時化改造方案主要有3種:一種是直接修改內核插入搶占點[3],另外一種是資源內核方法[4],最后一種是雙內核架構的解決方案。但3種方法中前兩種都只能用于軟實時應用,只有雙內核[2]架構的方案可以保障硬實時應用需求。目前,Linux平臺下開發(fā)的具有硬實時功能的系統(tǒng)主要有:RTLinux和[1](Real Time Application Interface)?;?a class="contentlabel" href="http://2s4d.com/news/listbylabel/label/RTAI">RTAI增強Linux的方面研究得比較多,但是,基于增強μClinux方面還未見到成型的產品。因此,本文借鑒RTAI對Linux的實時改進機理,對μClinux的實時性改造進行了分析與研究。

2. μClinux的內存管理

標準Linux使用虛擬存儲器技術,應用在帶有MMU的處理器上,虛擬地址被送到MMU,把虛擬地址映射為物理地址。而μClinux同標準Linux的最大區(qū)別就在于內存管理,只有了解它們內存管理的差異后,才能更好地利用RTAI對μClinux進行實時化改造。

μClinux雖然為嵌入式系統(tǒng)做了許多小型化的工作[5],但μClinux與標準Linux的架構完全一致。μClinux雖然無法使用處理器的虛擬內存管理技術,但μClinux仍然采用存儲器的分頁管理,系統(tǒng)在啟動時把實際存儲器進行分頁,在加載應用程序時分頁加載。一個進程在執(zhí)行前,系統(tǒng)必須為進程分配足夠的連續(xù)地址空間,然后全部載入主存儲器的連續(xù)空間中。μClinux采用實存儲器管理策略,通過地址總線對物理內存進行直接訪問。所有程序中訪問的地址都是實際的物理地址,操作系統(tǒng)對內存空間沒有保護,所有的進程都在一個運行空間中運行(包括內核進程)。

在μClinux系統(tǒng)中,缺少了MMU的內存映射,μClinux必須在可執(zhí)行文件加載階段對可執(zhí)行文件reloc處理,使得程序執(zhí)行時能夠直接使用物理內存;其次,μClinux沒有自動生長的堆棧,也沒有brk()函數,用戶空間的程序必須使用mmap()命令來分配內存;同時,在實現(xiàn)多個進程時需要實現(xiàn)數據保護,μClinux雖然支持fork()函數,但實質是所有的多進程管理都通過vfork()函數來實現(xiàn)。vfork() 是μClinux與標準Linux應用程序的開發(fā)中最重要的不同之處,只有對vfork()與fork()兩個函數的差異和程序處理機制有詳細的了解后,才能順利地完成從Linux到μClinux的程序移植。

3. 基于RTAI的Linux硬實時支持方案

3.1 RTAI簡介

RTAI for Linux[6]是雙內核架構的Linux實時化方案的典型代表,它由意大利的Milan大學主持,是近年來非?;钴S的開源項目。系統(tǒng)的實現(xiàn)基礎是在Linux上定義了一組實時硬件抽象層RTHAL(Real Time Hardware Abstraction Layer),通過RTHAL進行硬件管理,把基本內核和結合在一起,其中一個內核的改變,不會影響另一個內核的執(zhí)行,RTHAL將RTAI需要在Linux中修改的部分定義成一組程序界面,RTAI只使用這組界面和Linux溝通,其系統(tǒng)結構如圖1所示。

3.2 RTAI的RTHAL

RTAI從內核中提取一個RTHAL,RTAI首先是一個中斷分發(fā)器,當RTAI模塊被加載后,CPU中斷仍由Linux管理,RTAI只接管外部設備的中斷并分發(fā)(有可能仍分發(fā)給Linux)。這種接管是通過RTHAL來實現(xiàn)的,RTHAL包含一些重要的函數和數據結構,RTAI模塊可能修改的內容都收集在此結構體中。

圖1雙內核實時μClinux架構

當RTAI裝載時,只需要重新設置RTHAL中的各項內容。內核需要修改執(zhí)行RTHAL以代替原來的內容,如

do_IRQ(irq,dummy);

被修改為:

rthal.c_do_IRQ(irq,dummy);

Linux初始化RTHAL為指向原始的函數和數據結構,RTHAL僅僅進行重定向。當RTAI被激活,RTHAL保存并且改變這些函數的值為 RTAI自己的內容。以上段代碼為例,當RTAI還沒有加載時,rthal.c_do_IRQ的值就是Linux的do_IRQ,當RTAI被加載時,RTAI執(zhí)行以下代碼,將rthal.c_do_IRQ替換成RTAI自己的分發(fā)器:

rthal.c_do_IRQ=dispatch_irq;


上一頁 1 2 3 下一頁

評論


相關推薦

技術專區(qū)

關閉