內(nèi)存保護(hù)單元
內(nèi)存保護(hù)單元是一個可編程的設(shè)備,用來指定一塊特定內(nèi)存區(qū)域的訪問權(quán)限,比如讀,寫,和從該區(qū)域執(zhí)行代碼的權(quán)限。內(nèi)存保護(hù)單元可以增加系統(tǒng)的健壯性,預(yù)防一些黑客的攻擊。ARMV7-M和ARMV8-M都提供了內(nèi)存保護(hù)單元,簡稱MPU(Memory Protection Unit)。RISC-V也提供了相似的功能,簡稱PMP(Physical Memory Protection)。
項目進(jìn)展
目前對ARMV7-M和ARMV8-M架構(gòu)實現(xiàn)了初步的支持。框架通用的代碼在components/mp目錄下,硬件相關(guān)的代碼存放在libcpu,并提供了兩個簡單的例程。
功能簡介
RT-Thread操作系統(tǒng)的任務(wù)和內(nèi)核使用同一個地址空間,全部運行在特權(quán)級。所有代碼默認(rèn)對任何內(nèi)存都有讀,寫,和執(zhí)行的權(quán)限。使用MPU框架可以給特定的內(nèi)存區(qū)域設(shè)置更低的權(quán)限,如只讀權(quán)限。MPU框架可以被用來實現(xiàn)以下的功能:
把關(guān)鍵數(shù)據(jù)或代碼設(shè)置成只讀,防止它們被破壞
任務(wù)隔離,設(shè)定特定地址只能由特定的任務(wù)訪問
檢測棧溢出
把數(shù)據(jù)區(qū)域設(shè)置為不可執(zhí)行,防止棧溢出攻擊
使用方法
Menuconfig配置
通過menuconfig進(jìn)入RT-Thread Components->Memory Protection配置相關(guān)選項
RT_USING_MEM_PROTECTION:開啟MPU抽象層
RT_USING_HW_STACK_GUARD:使用MPU檢測棧溢出。具體實現(xiàn)原理是在任務(wù)棧頂和棧底各設(shè)置一個MPU區(qū)域,權(quán)限設(shè)置為不可訪問。如果發(fā)生棧溢出,代碼訪問了MPU保護(hù)的地址,會觸發(fā)異常
NUM_MEM_REGIONS:硬件支持的MPU區(qū)域數(shù)量
NUM_EXCLUSIVE_REGIONS:使用rt_mem_protection_add_exclusive_region函數(shù)配置的內(nèi)存區(qū)域數(shù)量
NUM_CONFIGURABLE_REGIONS:各任務(wù)可以通過rt_mem_protection_add_region函數(shù)配置的內(nèi)存區(qū)域數(shù)量
內(nèi)存區(qū)域配置
MPU抽象層提供了以下的API來配置任務(wù)對內(nèi)存區(qū)域的權(quán)限:
rt_err_t rt_mem_protection_add_region(rt_thread_t thread, rt_mem_region_t *region):添加內(nèi)存區(qū)域
rt_err_t rt_mem_protection_delete_region(rt_thread_t thread, rt_mem_region_t *region):刪除內(nèi)存區(qū)域
rt_err_t rt_mem_protection_update_region(rt_thread_t thread, rt_mem_region_t *region):更新內(nèi)存區(qū)域配置
內(nèi)存區(qū)域的特性由rt_mem_region_t結(jié)構(gòu)體定義:
typedef struct {
void start; / 起始地址 /
rt_size_t size; / 區(qū)域大小 /
rt_mem_attr_t attr; / 區(qū)域特性 */
} rt_mem_region_t;
其中attr可通過以下宏來定義,使用這樣定義的代碼在任何處理器架構(gòu)下都是通用的:
RT_MEM_REGION_P_RW_U_RW:可讀寫
RT_MEM_REGION_P_RO_U_RO: 只讀
RT_MEM_REGION_P_NA_U_NA:不可訪問
RT_MEM_REGION_P_RWX_U_RWX:可讀寫,執(zhí)行
RT_MEM_REGION_P_RX_U_RX:只讀,可執(zhí)行
通常程序需要定義一塊內(nèi)存區(qū)域只能由一個特定的任務(wù)訪問。允許訪問該內(nèi)存區(qū)域的任務(wù)可以調(diào)用以下函數(shù)實現(xiàn)這個功能:
rt_err_t rt_mem_protection_add_exclusive_region(void *start, rt_size_t size):添加內(nèi)存區(qū)域
rt_err_t rt_mem_protection_delete_exclusive_region(void *start, rt_size_t size):刪除內(nèi)存區(qū)域
初始化
使用MPU抽象層之前需要在board.h文件定義固定的MPU區(qū)域數(shù)量:
#define NUM_STATIC_REGIONS 2
在board.c文件定義固定的MPU區(qū)域特性:
rt_mem_region_t static_regions[NUM_STATIC_REGIONS] = {
/* Flash region, read only */
{
.start = (void )STM32_FLASH_START_ADRESS,
.size = (rt_size_t)STM32_FLASH_SIZE,
.attr = RT_MEM_REGION_P_RX_U_RX,
},
/ SRAM regin, no execute */
{
.start = (void *)STM32_SRAM_START_ADDRESS,
.size = (rt_size_t)STM32_SRAM_SIZE,
.attr = RT_MEM_REGION_P_RW_U_RW,
},
};
任何代碼進(jìn)行內(nèi)存訪問,都要遵守這些區(qū)域的配置。可以用固定的MPU區(qū)域,把代碼段配置為只讀,可執(zhí)行,把數(shù)據(jù)段配置成可讀寫,不可執(zhí)行。
另外必須確保配置的MPU區(qū)域數(shù)量滿足以下的關(guān)系:
如果開啟了RT_USING_HW_STACK_GUARD:NUM_STATIC_REGIONS + NUM_CONFIGURABLE_REGIONS + NUM_EXCLUSIVE_REGIONS + 2 <= NUM_MEM_REGIONS
如果沒有開啟RT_USING_HW_STACK_GUARD:NUM_STATIC_REGIONS + NUM_CONFIGURABLE_REGIONS + NUM_EXCLUSIVE_REGIONS <= NUM_MEM_REGIONS
異常檢測
程序可以注冊鉤子函數(shù),用來檢測內(nèi)存異常:
rt_err_t rt_hw_mp_exception_set_hook(rt_hw_mp_exception_hook_t hook)
hook函數(shù)會在發(fā)生內(nèi)存異常時被調(diào)用。函數(shù)聲明如下:
typedef void (*rt_hw_mp_exception_hook_t)(rt_mem_exception_info_t *)
rt_mem_exception_info_t結(jié)構(gòu)體根據(jù)處理器機構(gòu)定義,對于ARM架構(gòu),提供以下用來診斷內(nèi)存異常的信息:
typedef struct {
rt_thread_t thread; /* 觸發(fā)異常的線程 */
void addr; / 發(fā)生異常的地址 /
rt_mem_region_t region; / 地址對應(yīng)的內(nèi)存區(qū)域 /
rt_uint8_t mmfsr; / MemManage Status寄存器的值 */
} rt_mem_exception_info_t;
-
ARM處理器
+關(guān)注
關(guān)注
6文章
361瀏覽量
41942 -
MPU
+關(guān)注
關(guān)注
0文章
375瀏覽量
48958 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1305瀏覽量
40391 -
內(nèi)存保護(hù)單元
+關(guān)注
關(guān)注
0文章
6瀏覽量
1625
發(fā)布評論請先 登錄
相關(guān)推薦
硬件抽象層的設(shè)置
嵌入式操作系統(tǒng)的通用硬件抽象層設(shè)計
STM32Cube硬件抽象層
嵌入式系統(tǒng)硬件抽象層的設(shè)計思想簡析
一文解讀RT-Thread MPU抽象層的相關(guān)知識
嵌入式操作系統(tǒng)的通用硬件抽象層設(shè)計
![嵌入式操作系統(tǒng)的通用硬件<b class='flag-5'>抽象</b><b class='flag-5'>層</b>設(shè)計](https://file1.elecfans.com//web2/M00/A4/AC/wKgZomUMNTuAAhU2AAAH7hJX9JI562.gif)
電機控制硬件抽象層(HAL)
芯片設(shè)計抽象層及其設(shè)計風(fēng)格
![芯片設(shè)計<b class='flag-5'>抽象</b><b class='flag-5'>層</b>及其設(shè)計風(fēng)格](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論