《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 一種提高μC/OS-II操作系統(tǒng)安全性與穩(wěn)定性方法
一種提高μC/OS-II操作系統(tǒng)安全性與穩(wěn)定性方法
摘要: 如果用戶任務運行在“用戶級+PSP”狀態(tài)下,,而調(diào)用操作系統(tǒng)函數(shù)時運行在“特權級+MSP”狀態(tài)下,再配合MPU的使用,,可以使系統(tǒng)的安全性與穩(wěn)定性得到很大的提高,。
Abstract:
Key words :

 引言

μC/OS-II是基于優(yōu)先級的可剝奪型內(nèi)核,,實時性較強,但不區(qū)分用戶空間和系統(tǒng)空間,,使得系統(tǒng)的安全性變差,。而μC/OS-II官網(wǎng)提供的基于Cortex-M3內(nèi)核移植的μC/OS-II操作系統(tǒng),一直運行在特權級下,,用戶程序也可以訪問操作系統(tǒng)的變量和常量,,導致系統(tǒng)的安全性與穩(wěn)定性變得更差。

1 開發(fā)壞境與Cortex-M3內(nèi)核簡介

使用IAR 5.30開發(fā)環(huán)境,,移植μC/OS-II 2.86到Cortex-M3內(nèi)核上,,選用配置了MPU的LPC1786" title="LPC1786">LPC1786處理器作為硬件實驗平臺。

Cortex-M3處理器支持:兩種工作模式,,線程模式和處理模式,;兩種訪問等級,特權級和用戶級,;兩個堆棧指針,,主堆棧指針(MSP)和進程堆棧指針(PSP)。異常處理工作在“處理模式+特權級+MSP”下,;線程模式下,,訪問等級與堆棧指針可以相互搭配使用;但是在用戶級下,,對特殊功能寄存器和系統(tǒng)控制空間(SCS)的大部分寄存器的訪問是禁止的,。

如果處理器(如LPC1700系列、LM3S系列等)配置有MPU,,可通過設定內(nèi)存的訪問權限大幅度地提高系統(tǒng)的安全性,。

2 μC/OS-II內(nèi)核簡介

μC/OS-II操作系統(tǒng)憑借其源代碼公開、結(jié)構(gòu)小巧,、內(nèi)核可剝奪,、實時性高等諸多特性而得到廣泛的應用,并且μC/OS-II絕大部分代碼是用C語言編寫的,,便于移植到各種內(nèi)核上,。它提供了諸如任務調(diào)度、任務管理,、時間管理,、內(nèi)存管理,、中斷管理,以及任務間的同步與通信等實時內(nèi)核的基本功能,,而沒有提供輸入輸出管理,、文件系統(tǒng)、圖形用戶接口及網(wǎng)絡組件之類的額外服務,。但由于μC/OS-II具有較好的可移植性和開源性,,用戶可以根據(jù)實際應用添加所需要的服務,而且系統(tǒng)移植只需修改文件OS_CPU_C.C,、OS_CPU.H,、OS_CPU_A.ASM。

3 μC/OS-II操作系統(tǒng)移植的改進

如果用戶任務運行在“用戶級+PSP”狀態(tài)下,,而調(diào)用操作系統(tǒng)函數(shù)時運行在“特權級+MSP”狀態(tài)下,,再配合MPU的使用,可以使系統(tǒng)的安全性與穩(wěn)定性得到很大的提高,。

3.1 設置系統(tǒng)寄存器

系統(tǒng)任務(統(tǒng)計任務,、空閑任務等)只使用主堆棧指針MSP,并且一直運行在特權級下,;而用戶任務則使用PSP,、MSP兩個堆棧。在系統(tǒng)初始化時,,設置MPU的相關寄存器,,把內(nèi)存分為特權級與用戶級兩個區(qū),如圖1所示,。PSP分配在用戶區(qū),,MSP、系統(tǒng)變量與常量分配在特權區(qū),,以提高系統(tǒng)的安全性,。

3.2 修改系統(tǒng)函數(shù)

為了任務首次運行時,可以進入相應的訪問等級和使用相應的堆棧指針,,在任務創(chuàng)建時,,加入工作狀態(tài)參數(shù)mode。在ucos_ii.h中定義訪問等級與堆棧選擇的常量:

3.2.1 修改任務控制塊OS_TCB

在任務控制塊中加入MSP指針,,形式如下:

3.2.2 修改任務創(chuàng)建函數(shù)

在任務創(chuàng)建函數(shù)的參數(shù)中加入mode參數(shù),,形式如下:

對OSTaskCreateExt()函數(shù)做的修改同上。

3.2.3 修改堆棧初始函數(shù)

在堆棧初始化時,,把mode值存儲在MSP底部,,以便任務第一次運行時進入相應的運行狀態(tài)(特權級還是用戶級,使用MSP還是PSP)。系統(tǒng)任務的mode是OS_Mode_PRIVILEGE | OS_Mode_MSP,,任務創(chuàng)建時PSP為0;而用戶任務為OS_Mode_USER | OS_Mode_PSP,。

堆棧初始函數(shù)的參數(shù)中加入mode參數(shù),,形式如下:

OS_TCBInit()函數(shù)把堆棧初始化得到的堆棧指針存入OS_TCB中。

3.3 修改OS_CPU_A.ASM文件中的函數(shù)

在OS_CPU_A.ASM文件中,,只需修改函數(shù)PendSV_Handler(PendSV服務例程),,任務切換是由它來完成的。
PendSV服務例程的流程如圖2所示,。


3.4 系統(tǒng)函數(shù)的使用

系統(tǒng)函數(shù)都是在“特權級+MSP”狀態(tài)下執(zhí)行的,,因此,在用戶任務調(diào)用系統(tǒng)函數(shù)前,,應先切換到“特權級+MSP”狀態(tài),,系統(tǒng)函數(shù)執(zhí)行完畢后再切換到“用戶級+PSP”狀態(tài)。具體代碼如下,。




在特權級下通過置位CONTRO[0]來進入用戶級,,而用戶級下是不能直接修改CONTROL[0]回到特權級的,必須通過一個異常,,在異常例程中修改CONTROL[0],,才能在返回到線程模式后拿到特權級。通常的方法是使用軟中斷SVC,。

因此,,從“用戶級+PSP”狀態(tài)下切換到“特權級+MSP”狀態(tài)的實現(xiàn)方法是:在用戶級下執(zhí)行SVC指令,在SVC異常服務函數(shù)中清零CONTROL[0]位,,再返回到線程模式下清零CONTROL[1]位切換到MSP,;而從“特權級+MSP”狀態(tài)下切換到“用戶級+PSP”狀態(tài)下,只需置位CONTROL[0]與CONTROL[1],。

4 系統(tǒng)測試

在基于第二代Correx-M3" title="Correx-M3">Correx-M3內(nèi)核的LPC1786處理器的語音識別系統(tǒng)上,,對修改后的操作系統(tǒng)進行測試。具體測試過程為:首先創(chuàng)建3個信號量0,、1,、2(計數(shù)器初始值都為0);ADC按10 kHz的頻率對語音信號采樣,,采樣200點(也就是一幀數(shù)據(jù))后發(fā)送信號量0(發(fā)生中斷級切換),;任務0(優(yōu)先級0)請求信號量0,并對語音信號預處理并檢測語音信號的起始端與結(jié)束端,;當任務0檢測到起始端后,,每處理完一幀數(shù)據(jù)都發(fā)送信號量1(產(chǎn)生任務級切換),直到檢測到結(jié)束端,任務1(優(yōu)先級1)請求道信號量1后對真正的語言信號進行特征提??;當任務0檢測到語音信號結(jié)束端時發(fā)送信號量2,任務2(優(yōu)先級2)獲得信號量2后利用DWT算法對語音信號進行識別并顯示到LCD屏上,。
測試結(jié)果表明,,改進后的系統(tǒng)抗干擾能力、穩(wěn)定性和安全性均大大增強,,并且系統(tǒng)連續(xù)穩(wěn)定地運行很長時間,,沒有出現(xiàn)任何問題,可見系統(tǒng)移植成功,。

結(jié)語

改進后的系統(tǒng),,內(nèi)存的使用沒有增加,只是增加了很小的系統(tǒng)開銷,;但配合MPU使用,,使系統(tǒng)的安全性和穩(wěn)定性得到了很大的提高。該方法可廣泛應用于對系統(tǒng)安全性與穩(wěn)定性要求比較高的場合,。

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權禁止轉(zhuǎn)載。