胡麗輝,張建泉,李楠,席隆
(1.中國科學院空間應用工程與技術中心,北京100094;2.中國科學院大學)
本文以不帶內存保護的嵌入式實時操作系統FreeRTOS為研究對象,在TMS570處理器平臺上移植了帶內存保護功能的操作系統FreeRTOS-MPU,不僅可以保護RTOS內核代碼不被任務破壞并防止內核數據崩潰,也可以保護系統外設不被任務無意地修改,確保檢測出任務堆棧溢出[2],從而提高系統的可靠性。
FreeRTOS操作系統是一個開源、輕型、簡單、可移植、可裁減的免費實時操作系統,能夠很好地移植到各種體系結構的微型處理器[3]。FreeRTOS僅僅包含了任務調度、任務管理、時間管理、內存管理和任務間的通信和同步等基本功能[4],不提供輸入/輸出管理、文件系統、網絡等額外的服務,用戶可根據需要自行實現。
MPU(Memory Protection Unit,內存保護單元)是Cortex-R4F內核的一個組件,可以用來捕獲非法或者危險的內存訪問。通過MPU可以設置保護區域的屬性和訪問權限,當處理器訪問內存的一個區域時,MPU比較該區域的訪問權限和當時的處理器模式。如果請求符合區域訪問標準,則MPU允許內核讀/寫主存;否則,MPU產生一個異常信號。
MPU在執行其功能時,是以region為單位的。一個region其實就是一段連續的地址,只是它們的位置和范圍都要滿足一些限制(對齊方式,最小容量等)。Cortex-R4的MPU共支持8個regions,還允許把每個region進一步劃分成更小的子region。此外,還允許啟用一個背景region(即沒有MPU時的全部地址空間),不過它只能由特權級享用。在啟用MPU后,就不得再訪問定義之外的地址區間,也不得訪問未經授權的region。否則,將以“訪問違例”處理,觸發MPU錯誤。MPU定義的regions可以相互交迭。如果某塊內存落在多個region中,則訪問屬性和權限將由編號最大的region來決定[5]。
MPU可以通過下列方法提高系統的可靠性[6]:
◆阻止應用程序破壞操作系統使用的代碼和數據;
◆阻止一個任務訪問其他任務的數據區,從而把任務隔開;
◆可以把關鍵數據區設置為只讀,從根本上消除了被破壞的可能;
◆檢測意外的存儲訪問,如堆棧溢出、數組越界等。
FreeRTOS-MPU操作系統是在FreeRTOS操作系統的基礎上加入內存保護模塊而來的,其特點如下[2]:
①可以創建任務運行在特權模式下或者用戶模式下,用戶模式下的任務只能訪問它們自己的堆棧和最多3個用戶自定義的內存區域,在任務被創建時用戶自定義的內存區域被指定給任務,但是在運行時可以重新配置;
②用戶模式下的任務不能共享數據存儲,但是用戶模式下的任務可以使用標準隊列和信號量機制來傳遞信息;
③特權模式下的任務可以自己進入用戶模式,但是一旦進入用戶模式,它就不能再回到特權模式;
④位于Flash區域的FreeRTOS API只有在進入特權模式下才能訪問;
⑤位于RAM區域的RTOS內核維護的數據只有在進入特權模式下才能訪問;
⑥系統外設只有在處理器進入特權模式下才能訪問,標準外設可以被任何代碼訪問,也可通過一個用戶自定義的內存區域來顯式地保護。
與沒有內存保護模塊的標準FreeRTOS操作系統相比,FreeRTOS-MPU可以用來保護RTOS內核代碼不被任務破壞并防止內核數據崩潰,也可以保護系統外設不被任務無意地修改,確保檢測出任務堆棧溢出,從而提高了軟件的可靠性。當然,不足之處是引入內存保護模塊后,操作系統運行需要的RAM、ROM資源會增加,上下文切換時還需要進行MPU相關的設置,因此任務切換時間增加。
TMS570LS系列是TI公司推出的基于ARM Cortex-R4F處理器的鎖步雙內核微處理器。本系統使用的TMS570LS20216最高運行頻率達到160 MHz,配置2 MB帶ECC的內置Flash和160 KB帶ECC的RAM,帶有TI核心安全策略,其可提供雙核鎖步CPU架構、硬件PBIST、MPU和片上時鐘及電壓監控等一些關鍵功能的安全特性來滿足汽車電子、鐵路和航天應用的需求[7]。
本移植針對TMS570LS系列芯片,使用的編譯軟件是Code Composer Studio v5.3.0,操作系統版本是 V7.4.0,由于FreeRTOS官方提供的demo中沒有在TMS570上實現MPU功能,因此本文移植主要參考的是針對ARM Cortex-M3實現的FreeRTOS-MPU,移植的主要內容集中在3個文件:portmacro.h,port.c,portasm.asm。
其中,portmacro.h文件主要是關于編譯器相關的數據類型的定義、CPU架構相關的定義、臨界區管理函數的宏定義和函數聲明等。port.c文件中包含了與移植有關的C函數,包括堆棧初始化函數、任務調度器啟動函數、設置默認MPU函數等。portasm.asm文件主要實現內核任務切換處理,包括上下文保存和恢復、啟動第一個任務等。以下主要針對關鍵模塊的移植實現做詳細的分析與說明。
堆棧的初始化是嵌入式操作系統移植的關鍵,是針對硬件結構以及堆棧保存特點進行的設置。堆棧初始化函數主要作用是初始化任務的堆棧結構,定義堆棧的上下文內容,將所有的寄存器值保存到堆棧中,使其看起來像剛剛發生過中斷一樣。堆棧保存格式如圖1所示。

圖1 任務堆棧結構
在堆棧的結構中,第一個入棧的是任務函數的起始地址,SP保存的是任務堆棧棧頂,然后預留一定空間給寄存器R12~R1,R0則保存傳遞給任務的參數,最后設置CPSR和ul UsingFPU標志位。


在創建任務之后將進行任務調度,首先配置MPU,然后設置并啟動系統的時鐘節拍,初始化臨界區嵌套次數為0,最后啟動優先級最高的就緒任務。具體程序如下:

FreeRTOS-MPU操作系統在任務調度器啟動時默認配置了5個區域,配置的流程圖如圖2所示,配置完成后內存區域分布如表1所列。

圖2 MPU默認配置流程圖
在任務創建時,x Task CreateRestricted()會調用vPortStore Task MPUSettings()對 TCB的結構體成員x MPU_SETTINGS x MPUSettings進行初始化,初始化的結果根據創建任務時提供的參數不同而不同。如果創建任務時定義了區域,那么此函數的作用是初始化如下3個區域:區域4是任務堆棧區、5和6是用戶自定義區域。這3個區域只能被當前任務訪問,見表2。

表1 默認配置的MPU區域

表2 任務堆棧和用戶自定義區域
如果創建任務時沒有定義區域,那么任務的MPU配置見表3,區域4是整個RAM區,區域5是用戶堆棧區,區域6無效。

表3 無自定義區時MPU配置
此上下文的保存是按照進入ISR中斷來編寫的,入棧順序是返回地址、用戶模式下的LR、R13-R0、SPSR,然后根據ulFPUContextConst的值確定任務是否維護FPU上下文。由于在初始化堆棧時默認不使用FPU,所以無需保存FPU上下文,最后把新的任務棧頂賦值給任務TCB結構體的第一個成員。保存任務上下文核心代碼如下:


根據TCB中任務的MPU設置來設置內存區域4、5和6,然后判斷FPU標志位,由于沒有保存FPU上下文,所以不需要恢復,再次把SPSR、R0-R14出棧,最后修正LR的值,程序返回?;謴腿蝿丈舷挛牧鞒虉D如圖3所示。

圖3 恢復任務上下文流程圖
任務代碼略——編者注。
首先把CPU工作模式變為管理模式,然后修復之前在pxPortInitialiseStack函數中入棧的寄存器值,程序自動跳到第一個任務去執行。

由于本文移植的是FreeRTOS-MPU操作系統,要想驗證是否移植成功,需要進行兩方面的測試:首先測試任務之間能否正確地調度與切換,然后測試MPU能否實現對地址空間的保護。硬件測試平臺選用的是Keil公司生產的MCBTMS570開發板。
程序運行的結果是兩個LED燈不斷的閃爍,時間間隔是500 ms,因此任務能正常調度。
在main函數中用x TaskCreateRestricted()創建兩個用戶模式下的任務,這兩個任務各定義一個region,在任務函數中分別訪問內核數據、內核代碼、另一個任務自定義的region和另一個任務堆棧。
實驗結果表明MPU可阻止應用程序破壞操作系統使用的代碼和數據、阻止一個任務訪問其他任務的數據區、阻止用戶模式任務訪問系統外設、阻止任務訪問未定義區域。由此可見,用戶模式下的任務僅僅只能訪問它們自己的堆棧和用戶自定義的內存區域。
綜合上述兩個測試,表明FreeRTOS-MPU操作系統移植成功。
FreeRTOS-MPU操作系統利用內部的內存保護模塊能有效地保護內核代碼和數據,實現任務之間的隔離與保護,提高了系統可靠性,因此本移植可以應用在對可靠性要求高的行業(如航天領域等)。
編者注:本文為期刊縮略版,全文見本刊網站www.mesnet.com.cn。
[1]程勝,蔡銘.航天高可靠嵌入式實時操作系統原理與技術[M].北京:中國宇航出版社,2012:195.
[2]Memory Protection Unit Support[EB/OL].[2014-08].http://www.freertos.org/FreeRTOS-MPU-memory-protection-unit.html.
[3]The FreeRTOS Project[EB/OL].[2014-08].http://www.freertos.org.
[4]USING THE FREERTOS REAL TIME KERNEL[EB/OL].[2014-08].http://www.docin.com/p-673371875.html.
[5]ARM Limited.Cortex-R4 and Cortex-R4F Technical Reference Maunal[EB/OL].[2014-08].http://www.arm.com.
[6]Joseph Yiu.Cortex-M3權威指南[M].宋巖,譯.北京:北京航空航天大學出版社,2009:187-204.
[7]Overview for TMS570 ARM Cortex-R[EB/OL].[2014-08].http://www.ti.com/lsds/ti/microcontroller/safety_mcu/tms570_arm_cortex-r4/overview.page.
[8]ARM Limited.ARM Architecture Reference Manual ARM V7-A and ARM V7-R edition[EB/OL].[2014-08].http://www.arm.com.