google centos linux 云计算 wordpress shell Firefox php nginx 程序员 编程 Windows java 微软 Android apache Python mysql Ubuntu 开源

嵌入式定制常用的實時Linux改造方案

根據實時性系統要求以及Linux的特點和性能分析,對標準Linux實時性的改造存在多種方法,較為合理的兩大類方法為:直接修改Linux內核源代碼、雙內核法。嵌入式定制

1.直接修改Linux內核源代碼

對Linux內核代碼進行細微修改並不對內核作大規模的變動,在遵循GPL協議的情況下,直接修改內核源代碼將Linux改造成一個完全可搶占的實時系統。核心修改面向局部,不會從根本上改變Linux內核,並且一些改動還可以通過Linux的模塊加載來完成,即系統需要處理實時任務時加載該功能模塊,不需要時動態卸載該模塊。

目前kernel.org發布的主線內核版本還不支持硬實時。為了開啟硬實時的功能,必須對代碼打補丁。實時內核補丁是多方努力的共同成果,目的是為了降低Linux內核的延時。這個補丁有多位代碼貢獻者,目前由Ingo Molnar維護,補丁網址如下:www.kernel.org/pub/linux/kernel/projects/rt/。

在配置已經打過實時補丁的內核代碼時,我們發現實時補丁添加了第4種搶占模式,稱為PREEMPT_RT(實時搶占)。實時補丁在Linux內核中添加了幾個重要特性,包括使用可搶占的互斥量來替代自旋鎖;除了使用preempt_disable()保護的區域以外,內核中的所有地方都開啟了非自願式搶占(involuntary preemption)功能。這種模式能夠顯著降低抖動(延時的變化),並且使那些對延時要求很高的實時應用具有可預測的較低延時。

這種方法存在的問題是:很難百分之百保證,在任何情況下,GPOS程序代碼絕不會阻礙RTOS的實時行為。也就是說,通過修改Linux內核,難以保證實時進程的執行不會遭到非實時進程所進行的不可預測活動的幹擾。

雙內核法
實際上,雙內核的設計緣由在於,人們不相信標準Linux內核可以在任何情況下兌現它的實時承諾,因為GPOS內核本身就很復雜,更多的程序代碼通常會導致更多的不確定性,這樣將無法符合可預測性的要求。更何況Linux內核極快的發展速度,使其會在很短的時間內帶來很大的變化,直接修改Linux內核源代碼的方法將難以保持同步。

雙內核法是在同一硬件平臺上采用兩個相互配合,共同工作的系統核心,通過在Linux系統的最底層增加一層實時核心來實現。其中的一個核心提供精確的實時多任務處理,另一個核心提供復雜的非實時通用功能。

雙內核方法的實質是把標準的Linux內核作為一個普通進程在另一個內核上運行。關鍵的改造部分是在Linux和中斷控制器之間加一個中斷控制的仿真層,成為其實時內核的一部分。該中斷仿真機制提供了一個標誌用來記錄Linux的關開中斷情況。一般只在修改核心數據結構關鍵代碼時才關中斷,所以其中斷響應很小。其優點是可以做到硬實時,並且能很方便地實現一種新的調度策略。

為方便使用,實時內核通常由一套可動態載入的模塊提供,也可以像編譯任何一般的子系統那樣在Linux源碼樹中直接編譯。常用的雙內核法實時補丁有RTLinux/GPL、RTAI 和 Xenomai,其中RTLinux/GPL只允許以內核模塊的形式提供實時應用;而RTAI和Xenomai支持在具有MMU保護的用戶空間中執行實時程序。下面,我們將對RTAI與Xenomai進行分析。

嵌入式定制

圖1. RTAI(左)和Xenomai(右)實時內核在Linux中的分層結構

圖1所示為RTAI和Xenomai兩個實時內核分別與標準Linux內核組成雙內核系統是的分層結構。可以看到兩者有稍微不同的組織形式,與Xenomai讓ADEOS掌控所有的中斷源不同的是,RTAI攔截它們,使用ADEOS將那些RTAI不感興趣的中斷通知送給Linux(也就是,中斷不影響實時時序)。這樣混合過程的目的是提高性能,因為在這種情況下,如果中斷是要喚醒一個實時任務,就避免了由ADEOS管理中斷的開銷。從這裏可以看出,RTAI的實時性能應該是比Xenomai要好的。

RTAI(Real-time Linux Application interface)雖然實時性能較好,但對ARM支持不夠,更新速度極慢,造成項目開發周期長,研發成本高。

與RTAI相比,Xenomai更加專註於用戶態下的實時性、提供多套與主流商業RTOS兼容的API以及對硬件的廣泛支持,在其之上構建的應用系統能保持較高實時性,而且穩定性和兼容性更好;此外,Xenomai社區活躍,緊跟主流內核更新,支持多種架構,對ARM的支持很好。

Xenomai是Linux內核的一個實時開發框架。它希望無縫地集成到Linux環境中來給用戶空間應用程序提供全面的、與接口無關的硬實時性能。Xenomai是基於一個抽象實時操作系統核心的,可以被用來在一個通用實時操作系統調用的核心上,構建任意多個不同的實時接口。Xenomai項目始於2001年8月。2003年它和RTAI項目合並推出了RTAI/fusion。

2005年,因為開發理念不同,RTAI/fusion項目又從RTAI中獨立出來作為Xenomai項目。相比之下,RTAI項目致力於技術上可行的最低延遲;Xenomai除此之外還很著重擴展性、可移植性以及可維護性。Xenomai項目將對Ingo Molnar的PREEMPT_PT實時搶占補丁提供支持,這又是與RTAI項目的一個顯著的不同。RTAI和Xenomai都有開發者社區支持,都可以作為一個VxWorks的開源替代。

Xenomai是基於Adeos(Adaptive Domain Environment for Operating System)實現的,Adeos的目標是為操作系統提供了一個靈活的、可擴展的自適應環境;在這個環境下,多個相同或不同的操作系統可以共存,共享硬件資源。基於Adeos的系統中,每個操作系統都在獨立的域內運行,每個域可以有獨立的地址空間和類似於進程、虛擬內存等的軟件抽象層,而且這些資源也可以由不同的域共享。與以往傳統的操作系統共存方法不同,Adeos是在已有的操作系統下插入一個軟件層,通過向上層多個操作系統提供某些原語和機制實現硬件共享。應用上主要是提供了一個用於“硬件-內核”接口的納內核(超微內核),使基於Linux環境的系統能滿足硬實時的要求。

Xenomai正是充分利用了Adeos技術,它的首要目標是幫助人們盡量平緩地移植那些依賴傳統RTOS的應用程序到GNU/Linux環境,避免全部重寫應用程序。它提供一個模擬器模擬傳統實時操作系統的API,這樣就很容易移植應用程序到GNU/Linux環境中,同時又能保持很好的實時性。Xenomai的核心技術就是使用一個實時微內核來構建這些實時API,也稱作“Skin”。Xenomai通過這種接口變種技術實現了針對多種傳統RTOS的應用編程接口,方便傳統RTOS應用程序向GNU/Linux的移植。圖2描述了Xenomai的這種帶Skin的分層架構。

嵌入式系統定制.jpg

圖2. 帶Skin接口的Xenomai分層結構

從圖2可以看出,Xenomai系統包含多個抽象層:Adeos納內核直接工作在硬件之上;位於Adeos之上的是與處理器體系結構相關的硬件抽象層(Hardware Abstraction Layer, HAL);系統的中心部分是運行在硬件抽象層之上的抽象的實時內核,實時內核實現了一系列通用RTOS的基本服務。

這些基本服務可以由Xenomai的本地API(Native)或由建立在實時內核上的針對其他傳統RTOS的客戶API提供,如RTAI、POSIX、VxWorks、uITRON、pSOS+等。客戶API旨在兼容其所支持的傳統RTOS的應用程序在Xenomai上的移植,使應用程序在向Xenomai/Linux體系移植的過程中不需要完全重新改寫,此特性保證了Xenomai系統的穩健性。Xenomai/Linux系統為用戶程序提供了用戶空間和內核空間兩種模式,前者通過系統調用接口實現,後者通過實時內核實現。用戶空間的執行模式保證了系統的可靠性和良好的軟實時性,內核空間程序則能提供優秀的硬實時性。

延伸阅读

评论