国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

帶內(nèi)存保護(hù)的FreeRTOS在TMS570上的移植※

2015-07-03 03:33:50胡麗輝張建泉李楠席隆
關(guān)鍵詞:堆棧任務(wù)調(diào)度內(nèi)核

胡麗輝,張建泉,李楠,席隆

(1.中國(guó)科學(xué)院空間應(yīng)用工程與技術(shù)中心,北京100094;2.中國(guó)科學(xué)院大學(xué))

引 言

本文以不帶內(nèi)存保護(hù)的嵌入式實(shí)時(shí)操作系統(tǒng)FreeRTOS為研究對(duì)象,在TMS570處理器平臺(tái)上移植了帶內(nèi)存保護(hù)功能的操作系統(tǒng)FreeRTOS-MPU,不僅可以保護(hù)RTOS內(nèi)核代碼不被任務(wù)破壞并防止內(nèi)核數(shù)據(jù)崩潰,也可以保護(hù)系統(tǒng)外設(shè)不被任務(wù)無(wú)意地修改,確保檢測(cè)出任務(wù)堆棧溢出[2],從而提高系統(tǒng)的可靠性。

1 FreeRTOS-MPU簡(jiǎn)介

1.1 FreeRTOS簡(jiǎn)介

FreeRTOS操作系統(tǒng)是一個(gè)開(kāi)源、輕型、簡(jiǎn)單、可移植、可裁減的免費(fèi)實(shí)時(shí)操作系統(tǒng),能夠很好地移植到各種體系結(jié)構(gòu)的微型處理器[3]。FreeRTOS僅僅包含了任務(wù)調(diào)度、任務(wù)管理、時(shí)間管理、內(nèi)存管理和任務(wù)間的通信和同步等基本功能[4],不提供輸入/輸出管理、文件系統(tǒng)、網(wǎng)絡(luò)等額外的服務(wù),用戶可根據(jù)需要自行實(shí)現(xiàn)。

1.2 MPU概覽

MPU(Memory Protection Unit,內(nèi)存保護(hù)單元)是Cortex-R4F內(nèi)核的一個(gè)組件,可以用來(lái)捕獲非法或者危險(xiǎn)的內(nèi)存訪問(wèn)。通過(guò)MPU可以設(shè)置保護(hù)區(qū)域的屬性和訪問(wèn)權(quán)限,當(dāng)處理器訪問(wèn)內(nèi)存的一個(gè)區(qū)域時(shí),MPU比較該區(qū)域的訪問(wèn)權(quán)限和當(dāng)時(shí)的處理器模式。如果請(qǐng)求符合區(qū)域訪問(wèn)標(biāo)準(zhǔn),則MPU允許內(nèi)核讀/寫主存;否則,MPU產(chǎn)生一個(gè)異常信號(hào)。

MPU在執(zhí)行其功能時(shí),是以region為單位的。一個(gè)region其實(shí)就是一段連續(xù)的地址,只是它們的位置和范圍都要滿足一些限制(對(duì)齊方式,最小容量等)。Cortex-R4的MPU共支持8個(gè)regions,還允許把每個(gè)region進(jìn)一步劃分成更小的子region。此外,還允許啟用一個(gè)背景region(即沒(méi)有MPU時(shí)的全部地址空間),不過(guò)它只能由特權(quán)級(jí)享用。在啟用MPU后,就不得再訪問(wèn)定義之外的地址區(qū)間,也不得訪問(wèn)未經(jīng)授權(quán)的region。否則,將以“訪問(wèn)違例”處理,觸發(fā)MPU錯(cuò)誤。MPU定義的regions可以相互交迭。如果某塊內(nèi)存落在多個(gè)region中,則訪問(wèn)屬性和權(quán)限將由編號(hào)最大的region來(lái)決定[5]。

MPU可以通過(guò)下列方法提高系統(tǒng)的可靠性[6]:

◆阻止應(yīng)用程序破壞操作系統(tǒng)使用的代碼和數(shù)據(jù);

◆阻止一個(gè)任務(wù)訪問(wèn)其他任務(wù)的數(shù)據(jù)區(qū),從而把任務(wù)隔開(kāi);

◆可以把關(guān)鍵數(shù)據(jù)區(qū)設(shè)置為只讀,從根本上消除了被破壞的可能;

◆檢測(cè)意外的存儲(chǔ)訪問(wèn),如堆棧溢出、數(shù)組越界等。

1.3 FreeRTOS-MPU簡(jiǎn)介

FreeRTOS-MPU操作系統(tǒng)是在FreeRTOS操作系統(tǒng)的基礎(chǔ)上加入內(nèi)存保護(hù)模塊而來(lái)的,其特點(diǎn)如下[2]:

①可以創(chuàng)建任務(wù)運(yùn)行在特權(quán)模式下或者用戶模式下,用戶模式下的任務(wù)只能訪問(wèn)它們自己的堆棧和最多3個(gè)用戶自定義的內(nèi)存區(qū)域,在任務(wù)被創(chuàng)建時(shí)用戶自定義的內(nèi)存區(qū)域被指定給任務(wù),但是在運(yùn)行時(shí)可以重新配置;

②用戶模式下的任務(wù)不能共享數(shù)據(jù)存儲(chǔ),但是用戶模式下的任務(wù)可以使用標(biāo)準(zhǔn)隊(duì)列和信號(hào)量機(jī)制來(lái)傳遞信息;

③特權(quán)模式下的任務(wù)可以自己進(jìn)入用戶模式,但是一旦進(jìn)入用戶模式,它就不能再回到特權(quán)模式;

④位于Flash區(qū)域的FreeRTOS API只有在進(jìn)入特權(quán)模式下才能訪問(wèn);

⑤位于RAM區(qū)域的RTOS內(nèi)核維護(hù)的數(shù)據(jù)只有在進(jìn)入特權(quán)模式下才能訪問(wèn);

⑥系統(tǒng)外設(shè)只有在處理器進(jìn)入特權(quán)模式下才能訪問(wèn),標(biāo)準(zhǔn)外設(shè)可以被任何代碼訪問(wèn),也可通過(guò)一個(gè)用戶自定義的內(nèi)存區(qū)域來(lái)顯式地保護(hù)。

與沒(méi)有內(nèi)存保護(hù)模塊的標(biāo)準(zhǔn)FreeRTOS操作系統(tǒng)相比,F(xiàn)reeRTOS-MPU可以用來(lái)保護(hù)RTOS內(nèi)核代碼不被任務(wù)破壞并防止內(nèi)核數(shù)據(jù)崩潰,也可以保護(hù)系統(tǒng)外設(shè)不被任務(wù)無(wú)意地修改,確保檢測(cè)出任務(wù)堆棧溢出,從而提高了軟件的可靠性。當(dāng)然,不足之處是引入內(nèi)存保護(hù)模塊后,操作系統(tǒng)運(yùn)行需要的RAM、ROM資源會(huì)增加,上下文切換時(shí)還需要進(jìn)行MPU相關(guān)的設(shè)置,因此任務(wù)切換時(shí)間增加。

2 TMS570硬件架構(gòu)簡(jiǎn)介

TMS570LS系列是TI公司推出的基于ARM Cortex-R4F處理器的鎖步雙內(nèi)核微處理器。本系統(tǒng)使用的TMS570LS20216最高運(yùn)行頻率達(dá)到160 MHz,配置2 MB帶ECC的內(nèi)置Flash和160 KB帶ECC的RAM,帶有TI核心安全策略,其可提供雙核鎖步CPU架構(gòu)、硬件PBIST、MPU和片上時(shí)鐘及電壓監(jiān)控等一些關(guān)鍵功能的安全特性來(lái)滿足汽車電子、鐵路和航天應(yīng)用的需求[7]。

3 FreeRTOS-MPU操作系統(tǒng)的移植過(guò)程

本移植針對(duì)TMS570LS系列芯片,使用的編譯軟件是Code Composer Studio v5.3.0,操作系統(tǒng)版本是 V7.4.0,由于FreeRTOS官方提供的demo中沒(méi)有在TMS570上實(shí)現(xiàn)MPU功能,因此本文移植主要參考的是針對(duì)ARM Cortex-M3實(shí)現(xiàn)的FreeRTOS-MPU,移植的主要內(nèi)容集中在3個(gè)文件: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)度器啟動(dòng)函數(shù)、設(shè)置默認(rèn)MPU函數(shù)等。portasm.asm文件主要實(shí)現(xiàn)內(nèi)核任務(wù)切換處理,包括上下文保存和恢復(fù)、啟動(dòng)第一個(gè)任務(wù)等。以下主要針對(duì)關(guān)鍵模塊的移植實(shí)現(xiàn)做詳細(xì)的分析與說(shuō)明。

3.1 堆棧初始化

堆棧的初始化是嵌入式操作系統(tǒng)移植的關(guān)鍵,是針對(duì)硬件結(jié)構(gòu)以及堆棧保存特點(diǎn)進(jìn)行的設(shè)置。堆棧初始化函數(shù)主要作用是初始化任務(wù)的堆棧結(jié)構(gòu),定義堆棧的上下文內(nèi)容,將所有的寄存器值保存到堆棧中,使其看起來(lái)像剛剛發(fā)生過(guò)中斷一樣。堆棧保存格式如圖1所示。

圖1 任務(wù)堆棧結(jié)構(gòu)

在堆棧的結(jié)構(gòu)中,第一個(gè)入棧的是任務(wù)函數(shù)的起始地址,SP保存的是任務(wù)堆棧棧頂,然后預(yù)留一定空間給寄存器R12~R1,R0則保存?zhèn)鬟f給任務(wù)的參數(shù),最后設(shè)置CPSR和ul UsingFPU標(biāo)志位。

3.2 任務(wù)調(diào)度器的啟動(dòng)

在創(chuàng)建任務(wù)之后將進(jìn)行任務(wù)調(diào)度,首先配置MPU,然后設(shè)置并啟動(dòng)系統(tǒng)的時(shí)鐘節(jié)拍,初始化臨界區(qū)嵌套次數(shù)為0,最后啟動(dòng)優(yōu)先級(jí)最高的就緒任務(wù)。具體程序如下:

3.3 設(shè)置默認(rèn)的MPU

FreeRTOS-MPU操作系統(tǒng)在任務(wù)調(diào)度器啟動(dòng)時(shí)默認(rèn)配置了5個(gè)區(qū)域,配置的流程圖如圖2所示,配置完成后內(nèi)存區(qū)域分布如表1所列。

圖2 MPU默認(rèn)配置流程圖

3.4 初始化TCB中xMPUSettings成員

在任務(wù)創(chuàng)建時(shí),x Task CreateRestricted()會(huì)調(diào)用vPortStore Task MPUSettings()對(duì) TCB的結(jié)構(gòu)體成員x MPU_SETTINGS x MPUSettings進(jìn)行初始化,初始化的結(jié)果根據(jù)創(chuàng)建任務(wù)時(shí)提供的參數(shù)不同而不同。如果創(chuàng)建任務(wù)時(shí)定義了區(qū)域,那么此函數(shù)的作用是初始化如下3個(gè)區(qū)域:區(qū)域4是任務(wù)堆棧區(qū)、5和6是用戶自定義區(qū)域。這3個(gè)區(qū)域只能被當(dāng)前任務(wù)訪問(wèn),見(jiàn)表2。

表1 默認(rèn)配置的MPU區(qū)域

表2 任務(wù)堆棧和用戶自定義區(qū)域

如果創(chuàng)建任務(wù)時(shí)沒(méi)有定義區(qū)域,那么任務(wù)的MPU配置見(jiàn)表3,區(qū)域4是整個(gè)RAM區(qū),區(qū)域5是用戶堆棧區(qū),區(qū)域6無(wú)效。

表3 無(wú)自定義區(qū)時(shí)MPU配置

3.5 保存任務(wù)上下文

此上下文的保存是按照進(jìn)入ISR中斷來(lái)編寫的,入棧順序是返回地址、用戶模式下的LR、R13-R0、SPSR,然后根據(jù)ulFPUContextConst的值確定任務(wù)是否維護(hù)FPU上下文。由于在初始化堆棧時(shí)默認(rèn)不使用FPU,所以無(wú)需保存FPU上下文,最后把新的任務(wù)棧頂賦值給任務(wù)TCB結(jié)構(gòu)體的第一個(gè)成員。保存任務(wù)上下文核心代碼如下:

3.6 恢復(fù)任務(wù)上下文

根據(jù)TCB中任務(wù)的MPU設(shè)置來(lái)設(shè)置內(nèi)存區(qū)域4、5和6,然后判斷FPU標(biāo)志位,由于沒(méi)有保存FPU上下文,所以不需要恢復(fù),再次把SPSR、R0-R14出棧,最后修正LR的值,程序返回。恢復(fù)任務(wù)上下文流程圖如圖3所示。

圖3 恢復(fù)任務(wù)上下文流程圖

任務(wù)代碼略——編者注。

3.7 啟動(dòng)第一個(gè)任務(wù)

首先把CPU工作模式變?yōu)楣芾砟J剑缓笮迯?fù)之前在pxPortInitialiseStack函數(shù)中入棧的寄存器值,程序自動(dòng)跳到第一個(gè)任務(wù)去執(zhí)行。

4 移植測(cè)試

由于本文移植的是FreeRTOS-MPU操作系統(tǒng),要想驗(yàn)證是否移植成功,需要進(jìn)行兩方面的測(cè)試:首先測(cè)試任務(wù)之間能否正確地調(diào)度與切換,然后測(cè)試MPU能否實(shí)現(xiàn)對(duì)地址空間的保護(hù)。硬件測(cè)試平臺(tái)選用的是Keil公司生產(chǎn)的MCBTMS570開(kāi)發(fā)板。

4.1 任務(wù)調(diào)度測(cè)試

程序運(yùn)行的結(jié)果是兩個(gè)LED燈不斷的閃爍,時(shí)間間隔是500 ms,因此任務(wù)能正常調(diào)度。

4.2 MPU測(cè)試

在main函數(shù)中用x TaskCreateRestricted()創(chuàng)建兩個(gè)用戶模式下的任務(wù),這兩個(gè)任務(wù)各定義一個(gè)region,在任務(wù)函數(shù)中分別訪問(wèn)內(nèi)核數(shù)據(jù)、內(nèi)核代碼、另一個(gè)任務(wù)自定義的region和另一個(gè)任務(wù)堆棧。

實(shí)驗(yàn)結(jié)果表明MPU可阻止應(yīng)用程序破壞操作系統(tǒng)使用的代碼和數(shù)據(jù)、阻止一個(gè)任務(wù)訪問(wèn)其他任務(wù)的數(shù)據(jù)區(qū)、阻止用戶模式任務(wù)訪問(wèn)系統(tǒng)外設(shè)、阻止任務(wù)訪問(wèn)未定義區(qū)域。由此可見(jiàn),用戶模式下的任務(wù)僅僅只能訪問(wèn)它們自己的堆棧和用戶自定義的內(nèi)存區(qū)域。

綜合上述兩個(gè)測(cè)試,表明FreeRTOS-MPU操作系統(tǒng)移植成功。

結(jié) 語(yǔ)

FreeRTOS-MPU操作系統(tǒng)利用內(nèi)部的內(nèi)存保護(hù)模塊能有效地保護(hù)內(nèi)核代碼和數(shù)據(jù),實(shí)現(xiàn)任務(wù)之間的隔離與保護(hù),提高了系統(tǒng)可靠性,因此本移植可以應(yīng)用在對(duì)可靠性要求高的行業(yè)(如航天領(lǐng)域等)。

編者注:本文為期刊縮略版,全文見(jiàn)本刊網(wǎng)站www.mesnet.com.cn。

[1]程勝,蔡銘.航天高可靠嵌入式實(shí)時(shí)操作系統(tǒng)原理與技術(shù)[M].北京:中國(guó)宇航出版社,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.

猜你喜歡
堆棧任務(wù)調(diào)度內(nèi)核
萬(wàn)物皆可IP的時(shí)代,我們當(dāng)夯實(shí)的IP內(nèi)核是什么?
強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
基于改進(jìn)NSGA-Ⅱ算法的協(xié)同制造任務(wù)調(diào)度研究
基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計(jì)
Linux內(nèi)核mmap保護(hù)機(jī)制研究
基于時(shí)間負(fù)載均衡蟻群算法的云任務(wù)調(diào)度優(yōu)化
嵌入式軟件堆棧溢出的動(dòng)態(tài)檢測(cè)方案設(shè)計(jì)*
基于堆棧自編碼降維的武器裝備體系效能預(yù)測(cè)
云計(jì)算環(huán)境中任務(wù)調(diào)度策略
云計(jì)算中基于進(jìn)化算法的任務(wù)調(diào)度策略
南郑县| 辉县市| 色达县| 施秉县| 渑池县| 甘南县| 渝北区| 松江区| 岚皋县| 临西县| 宜都市| 衢州市| 保靖县| 会东县| 姚安县| 西丰县| 石狮市| 年辖:市辖区| 乌兰浩特市| 都匀市| 华宁县| 余干县| 保康县| 莆田市| 仙桃市| 台州市| 武功县| 邵东县| 东至县| 巴青县| 邵武市| 曲水县| 宁阳县| 甘德县| 自治县| 白水县| 体育| 台湾省| 湾仔区| 华宁县| 雷波县|