胡麗輝,張建泉,李楠,席隆
(1.中國科學(xué)院空間應(yīng)用工程與技術(shù)中心,北京100094;2.中國科學(xué)院大學(xué))
本文以不帶內(nèi)存保護(hù)的嵌入式實時操作系統(tǒng)FreeRTOS為研究對象,在TMS570處理器平臺上移植了帶內(nèi)存保護(hù)功能的操作系統(tǒng)FreeRTOS-MPU,不僅可以保護(hù)RTOS內(nèi)核代碼不被任務(wù)破壞并防止內(nèi)核數(shù)據(jù)崩潰,也可以保護(hù)系統(tǒng)外設(shè)不被任務(wù)無意地修改,確保檢測出任務(wù)堆棧溢出[2],從而提高系統(tǒng)的可靠性。
FreeRTOS操作系統(tǒng)是一個開源、輕型、簡單、可移植、可裁減的免費實時操作系統(tǒng),能夠很好地移植到各種體系結(jié)構(gòu)的微型處理器[3]。FreeRTOS僅僅包含了任務(wù)調(diào)度、任務(wù)管理、時間管理、內(nèi)存管理和任務(wù)間的通信和同步等基本功能[4],不提供輸入/輸出管理、文件系統(tǒng)、網(wǎng)絡(luò)等額外的服務(wù),用戶可根據(jù)需要自行實現(xiàn)。
MPU(Memory Protection Unit,內(nèi)存保護(hù)單元)是Cortex-R4F內(nèi)核的一個組件,可以用來捕獲非法或者危險的內(nèi)存訪問。通過MPU可以設(shè)置保護(hù)區(qū)域的屬性和訪問權(quán)限,當(dāng)處理器訪問內(nèi)存的一個區(qū)域時,MPU比較該區(qū)域的訪問權(quán)限和當(dāng)時的處理器模式。如果請求符合區(qū)域訪問標(biāo)準(zhǔn),則MPU允許內(nèi)核讀/寫主存;否則,MPU產(chǎn)生一個異常信號。
MPU在執(zhí)行其功能時,是以region為單位的。一個region其實就是一段連續(xù)的地址,只是它們的位置和范圍都要滿足一些限制(對齊方式,最小容量等)。Cortex-R4的MPU共支持8個regions,還允許把每個region進(jìn)一步劃分成更小的子region。此外,還允許啟用一個背景region(即沒有MPU時的全部地址空間),不過它只能由特權(quán)級享用。在啟用MPU后,就不得再訪問定義之外的地址區(qū)間,也不得訪問未經(jīng)授權(quán)的region。否則,將以“訪問違例”處理,觸發(fā)MPU錯誤。MPU定義的regions可以相互交迭。如果某塊內(nèi)存落在多個region中,則訪問屬性和權(quán)限將由編號最大的region來決定[5]。
MPU可以通過下列方法提高系統(tǒng)的可靠性[6]:
◆阻止應(yīng)用程序破壞操作系統(tǒng)使用的代碼和數(shù)據(jù);
◆阻止一個任務(wù)訪問其他任務(wù)的數(shù)據(jù)區(qū),從而把任務(wù)隔開;
◆可以把關(guān)鍵數(shù)據(jù)區(qū)設(shè)置為只讀,從根本上消除了被破壞的可能;
◆檢測意外的存儲訪問,如堆棧溢出、數(shù)組越界等。
FreeRTOS-MPU操作系統(tǒng)是在FreeRTOS操作系統(tǒng)的基礎(chǔ)上加入內(nèi)存保護(hù)模塊而來的,其特點如下[2]:
①可以創(chuàng)建任務(wù)運行在特權(quán)模式下或者用戶模式下,用戶模式下的任務(wù)只能訪問它們自己的堆棧和最多3個用戶自定義的內(nèi)存區(qū)域,在任務(wù)被創(chuàng)建時用戶自定義的內(nèi)存區(qū)域被指定給任務(wù),但是在運行時可以重新配置;
②用戶模式下的任務(wù)不能共享數(shù)據(jù)存儲,但是用戶模式下的任務(wù)可以使用標(biāo)準(zhǔn)隊列和信號量機制來傳遞信息;
③特權(quán)模式下的任務(wù)可以自己進(jìn)入用戶模式,但是一旦進(jìn)入用戶模式,它就不能再回到特權(quán)模式;
④位于Flash區(qū)域的FreeRTOS API只有在進(jìn)入特權(quán)模式下才能訪問;
⑤位于RAM區(qū)域的RTOS內(nèi)核維護(hù)的數(shù)據(jù)只有在進(jìn)入特權(quán)模式下才能訪問;
⑥系統(tǒng)外設(shè)只有在處理器進(jìn)入特權(quán)模式下才能訪問,標(biāo)準(zhǔn)外設(shè)可以被任何代碼訪問,也可通過一個用戶自定義的內(nèi)存區(qū)域來顯式地保護(hù)。
與沒有內(nèi)存保護(hù)模塊的標(biāo)準(zhǔn)FreeRTOS操作系統(tǒng)相比,F(xiàn)reeRTOS-MPU可以用來保護(hù)RTOS內(nèi)核代碼不被任務(wù)破壞并防止內(nèi)核數(shù)據(jù)崩潰,也可以保護(hù)系統(tǒng)外設(shè)不被任務(wù)無意地修改,確保檢測出任務(wù)堆棧溢出,從而提高了軟件的可靠性。當(dāng)然,不足之處是引入內(nèi)存保護(hù)模塊后,操作系統(tǒng)運行需要的RAM、ROM資源會增加,上下文切換時還需要進(jìn)行MPU相關(guān)的設(shè)置,因此任務(wù)切換時間增加。
TMS570LS系列是TI公司推出的基于ARM Cortex-R4F處理器的鎖步雙內(nèi)核微處理器。本系統(tǒng)使用的TMS570LS20216最高運行頻率達(dá)到160 MHz,配置2 MB帶ECC的內(nèi)置Flash和160 KB帶ECC的RAM,帶有TI核心安全策略,其可提供雙核鎖步CPU架構(gòu)、硬件PBIST、MPU和片上時鐘及電壓監(jiān)控等一些關(guān)鍵功能的安全特性來滿足汽車電子、鐵路和航天應(yīng)用的需求[7]。
本移植針對TMS570LS系列芯片,使用的編譯軟件是Code Composer Studio v5.3.0,操作系統(tǒng)版本是 V7.4.0,由于FreeRTOS官方提供的demo中沒有在TMS570上實現(xiàn)MPU功能,因此本文移植主要參考的是針對ARM Cortex-M3實現(xiàn)的FreeRTOS-MPU,移植的主要內(nèi)容集中在3個文件:portmacro.h,port.c,portasm.asm。
其中,portmacro.h文件主要是關(guān)于編譯器相關(guān)的數(shù)據(jù)類型的定義、CPU架構(gòu)相關(guān)的定義、臨界區(qū)管理函數(shù)的宏定義和函數(shù)聲明等。port.c文件中包含了與移植有關(guān)的C函數(shù),包括堆棧初始化函數(shù)、任務(wù)調(diào)度器啟動函數(shù)、設(shè)置默認(rèn)MPU函數(shù)等。portasm.asm文件主要實現(xiàn)內(nèi)核任務(wù)切換處理,包括上下文保存和恢復(fù)、啟動第一個任務(wù)等。以下主要針對關(guān)鍵模塊的移植實現(xiàn)做詳細(xì)的分析與說明。
堆棧的初始化是嵌入式操作系統(tǒng)移植的關(guān)鍵,是針對硬件結(jié)構(gòu)以及堆棧保存特點進(jìn)行的設(shè)置。堆棧初始化函數(shù)主要作用是初始化任務(wù)的堆棧結(jié)構(gòu),定義堆棧的上下文內(nèi)容,將所有的寄存器值保存到堆棧中,使其看起來像剛剛發(fā)生過中斷一樣。堆棧保存格式如圖1所示。
圖1 任務(wù)堆棧結(jié)構(gòu)
在堆棧的結(jié)構(gòu)中,第一個入棧的是任務(wù)函數(shù)的起始地址,SP保存的是任務(wù)堆棧棧頂,然后預(yù)留一定空間給寄存器R12~R1,R0則保存?zhèn)鬟f給任務(wù)的參數(shù),最后設(shè)置CPSR和ul UsingFPU標(biāo)志位。
在創(chuàng)建任務(wù)之后將進(jìn)行任務(wù)調(diào)度,首先配置MPU,然后設(shè)置并啟動系統(tǒng)的時鐘節(jié)拍,初始化臨界區(qū)嵌套次數(shù)為0,最后啟動優(yōu)先級最高的就緒任務(wù)。具體程序如下:
FreeRTOS-MPU操作系統(tǒng)在任務(wù)調(diào)度器啟動時默認(rèn)配置了5個區(qū)域,配置的流程圖如圖2所示,配置完成后內(nèi)存區(qū)域分布如表1所列。
圖2 MPU默認(rèn)配置流程圖
在任務(wù)創(chuàng)建時,x Task CreateRestricted()會調(diào)用vPortStore Task MPUSettings()對 TCB的結(jié)構(gòu)體成員x MPU_SETTINGS x MPUSettings進(jìn)行初始化,初始化的結(jié)果根據(jù)創(chuàng)建任務(wù)時提供的參數(shù)不同而不同。如果創(chuàng)建任務(wù)時定義了區(qū)域,那么此函數(shù)的作用是初始化如下3個區(qū)域:區(qū)域4是任務(wù)堆棧區(qū)、5和6是用戶自定義區(qū)域。這3個區(qū)域只能被當(dāng)前任務(wù)訪問,見表2。
表1 默認(rèn)配置的MPU區(qū)域
表2 任務(wù)堆棧和用戶自定義區(qū)域
如果創(chuàng)建任務(wù)時沒有定義區(qū)域,那么任務(wù)的MPU配置見表3,區(qū)域4是整個RAM區(qū),區(qū)域5是用戶堆棧區(qū),區(qū)域6無效。
表3 無自定義區(qū)時MPU配置
此上下文的保存是按照進(jìn)入ISR中斷來編寫的,入棧順序是返回地址、用戶模式下的LR、R13-R0、SPSR,然后根據(jù)ulFPUContextConst的值確定任務(wù)是否維護(hù)FPU上下文。由于在初始化堆棧時默認(rèn)不使用FPU,所以無需保存FPU上下文,最后把新的任務(wù)棧頂賦值給任務(wù)TCB結(jié)構(gòu)體的第一個成員。保存任務(wù)上下文核心代碼如下:
根據(jù)TCB中任務(wù)的MPU設(shè)置來設(shè)置內(nèi)存區(qū)域4、5和6,然后判斷FPU標(biāo)志位,由于沒有保存FPU上下文,所以不需要恢復(fù),再次把SPSR、R0-R14出棧,最后修正LR的值,程序返回?;謴?fù)任務(wù)上下文流程圖如圖3所示。
圖3 恢復(fù)任務(wù)上下文流程圖
任務(wù)代碼略——編者注。
首先把CPU工作模式變?yōu)楣芾砟J?,然后修?fù)之前在pxPortInitialiseStack函數(shù)中入棧的寄存器值,程序自動跳到第一個任務(wù)去執(zhí)行。
由于本文移植的是FreeRTOS-MPU操作系統(tǒng),要想驗證是否移植成功,需要進(jìn)行兩方面的測試:首先測試任務(wù)之間能否正確地調(diào)度與切換,然后測試MPU能否實現(xiàn)對地址空間的保護(hù)。硬件測試平臺選用的是Keil公司生產(chǎn)的MCBTMS570開發(fā)板。
程序運行的結(jié)果是兩個LED燈不斷的閃爍,時間間隔是500 ms,因此任務(wù)能正常調(diào)度。
在main函數(shù)中用x TaskCreateRestricted()創(chuàng)建兩個用戶模式下的任務(wù),這兩個任務(wù)各定義一個region,在任務(wù)函數(shù)中分別訪問內(nèi)核數(shù)據(jù)、內(nèi)核代碼、另一個任務(wù)自定義的region和另一個任務(wù)堆棧。
實驗結(jié)果表明MPU可阻止應(yīng)用程序破壞操作系統(tǒng)使用的代碼和數(shù)據(jù)、阻止一個任務(wù)訪問其他任務(wù)的數(shù)據(jù)區(qū)、阻止用戶模式任務(wù)訪問系統(tǒng)外設(shè)、阻止任務(wù)訪問未定義區(qū)域。由此可見,用戶模式下的任務(wù)僅僅只能訪問它們自己的堆棧和用戶自定義的內(nèi)存區(qū)域。
綜合上述兩個測試,表明FreeRTOS-MPU操作系統(tǒng)移植成功。
FreeRTOS-MPU操作系統(tǒng)利用內(nèi)部的內(nèi)存保護(hù)模塊能有效地保護(hù)內(nèi)核代碼和數(shù)據(jù),實現(xiàn)任務(wù)之間的隔離與保護(hù),提高了系統(tǒng)可靠性,因此本移植可以應(yīng)用在對可靠性要求高的行業(yè)(如航天領(lǐng)域等)。
編者注:本文為期刊縮略版,全文見本刊網(wǎng)站www.mesnet.com.cn。
[1]程勝,蔡銘.航天高可靠嵌入式實時操作系統(tǒng)原理與技術(shù)[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權(quán)威指南[M].宋巖,譯.北京:北京航空航天大學(xué)出版社,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.