0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MPU抽象層設(shè)計(jì)與使用方法

冬至子 ? 來(lái)源:半畝方塘8067 ? 作者:半畝方塘8067 ? 2023-09-06 15:43 ? 次閱讀

內(nèi)存保護(hù)單元
內(nèi)存保護(hù)單元是一個(gè)可編程的設(shè)備,用來(lái)指定一塊特定內(nèi)存區(qū)域的訪問(wèn)權(quán)限,比如讀,寫(xiě),和從該區(qū)域執(zhí)行代碼的權(quán)限。內(nèi)存保護(hù)單元可以增加系統(tǒng)的健壯性,預(yù)防一些黑客的攻擊。ARMV7-M和ARMV8-M都提供了內(nèi)存保護(hù)單元,簡(jiǎn)稱MPU(Memory Protection Unit)。RISC-V也提供了相似的功能,簡(jiǎn)稱PMP(Physical Memory Protection)。

項(xiàng)目進(jìn)展
目前對(duì)ARMV7-M和ARMV8-M架構(gòu)實(shí)現(xiàn)了初步的支持。框架通用的代碼在components/mp目錄下,硬件相關(guān)的代碼存放在libcpu,并提供了兩個(gè)簡(jiǎn)單的例程。

功能簡(jiǎn)介
RT-Thread操作系統(tǒng)的任務(wù)和內(nèi)核使用同一個(gè)地址空間,全部運(yùn)行在特權(quán)級(jí)。所有代碼默認(rèn)對(duì)任何內(nèi)存都有讀,寫(xiě),和執(zhí)行的權(quán)限。使用MPU框架可以給特定的內(nèi)存區(qū)域設(shè)置更低的權(quán)限,如只讀權(quán)限。MPU框架可以被用來(lái)實(shí)現(xiàn)以下的功能:

把關(guān)鍵數(shù)據(jù)或代碼設(shè)置成只讀,防止它們被破壞
任務(wù)隔離,設(shè)定特定地址只能由特定的任務(wù)訪問(wèn)

檢測(cè)棧溢出
把數(shù)據(jù)區(qū)域設(shè)置為不可執(zhí)行,防止棧溢出攻擊

使用方法

Menuconfig配置
通過(guò)menuconfig進(jìn)入RT-Thread Components->Memory Protection配置相關(guān)選項(xiàng)

RT_USING_MEM_PROTECTION:開(kāi)啟MPU抽象層
RT_USING_HW_STACK_GUARD:使用MPU檢測(cè)棧溢出。具體實(shí)現(xiàn)原理是在任務(wù)棧頂和棧底各設(shè)置一個(gè)MPU區(qū)域,權(quán)限設(shè)置為不可訪問(wèn)。如果發(fā)生棧溢出,代碼訪問(wèn)了MPU保護(hù)的地址,會(huì)觸發(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ù)可以通過(guò)rt_mem_protection_add_region函數(shù)配置的內(nèi)存區(qū)域數(shù)量

內(nèi)存區(qū)域配置
MPU抽象層提供了以下的API來(lái)配置任務(wù)對(duì)內(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可通過(guò)以下宏來(lái)定義,使用這樣定義的代碼在任何處理器架構(gòu)下都是通用的:

RT_MEM_REGION_P_RW_U_RW:可讀寫(xiě)
RT_MEM_REGION_P_RO_U_RO: 只讀
RT_MEM_REGION_P_NA_U_NA:不可訪問(wèn)
RT_MEM_REGION_P_RWX_U_RWX:可讀寫(xiě),執(zhí)行
RT_MEM_REGION_P_RX_U_RX:只讀,可執(zhí)行
通常程序需要定義一塊內(nèi)存區(qū)域只能由一個(gè)特定的任務(wù)訪問(wèn)。允許訪問(wèn)該內(nèi)存區(qū)域的任務(wù)可以調(diào)用以下函數(shù)實(shí)現(xiàn)這個(gè)功能:

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)存訪問(wèn),都要遵守這些區(qū)域的配置??梢杂霉潭ǖ腗PU區(qū)域,把代碼段配置為只讀,可執(zhí)行,把數(shù)據(jù)段配置成可讀寫(xiě),不可執(zhí)行。

另外必須確保配置的MPU區(qū)域數(shù)量滿足以下的關(guān)系:

如果開(kāi)啟了RT_USING_HW_STACK_GUARD:NUM_STATIC_REGIONS + NUM_CONFIGURABLE_REGIONS + NUM_EXCLUSIVE_REGIONS + 2 <= NUM_MEM_REGIONS
如果沒(méi)有開(kāi)啟RT_USING_HW_STACK_GUARD:NUM_STATIC_REGIONS + NUM_CONFIGURABLE_REGIONS + NUM_EXCLUSIVE_REGIONS <= NUM_MEM_REGIONS
異常檢測(cè)
程序可以注冊(cè)鉤子函數(shù),用來(lái)檢測(cè)內(nèi)存異常:

rt_err_t rt_hw_mp_exception_set_hook(rt_hw_mp_exception_hook_t hook)
hook函數(shù)會(huì)在發(fā)生內(nèi)存異常時(shí)被調(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ù)處理器機(jī)構(gòu)定義,對(duì)于ARM架構(gòu),提供以下用來(lái)診斷內(nèi)存異常的信息

typedef struct {
rt_thread_t thread; /* 觸發(fā)異常的線程 */
void addr; / 發(fā)生異常的地址 /
rt_mem_region_t region; /
地址對(duì)應(yīng)的內(nèi)存區(qū)域 /
rt_uint8_t mmfsr; /
MemManage Status寄存器的值 */
} rt_mem_exception_info_t;

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM處理器
    +關(guān)注

    關(guān)注

    6

    文章

    360

    瀏覽量

    41515
  • MPU
    MPU
    +關(guān)注

    關(guān)注

    0

    文章

    333

    瀏覽量

    48606
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1239

    瀏覽量

    39430
  • 內(nèi)存保護(hù)單元

    關(guān)注

    0

    文章

    6

    瀏覽量

    1578
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    硬件抽象的設(shè)置

    我在進(jìn)行PCI板的開(kāi)發(fā)時(shí)經(jīng)常能夠遇到硬件抽象這個(gè)概念,不知道這個(gè)硬件抽象是在PCI板上設(shè)置還是在軟件中設(shè)置的,用什么軟件設(shè)置
    發(fā)表于 07-21 12:06

    嵌入式操作系統(tǒng)的通用硬件抽象設(shè)計(jì)

    引言為了便于操作系統(tǒng)在不同硬件結(jié)構(gòu)上進(jìn)行移植,美國(guó)微軟公司首先提出了將底層與硬件相關(guān)的部分單獨(dú)設(shè)計(jì)成硬件抽象美國(guó)微軟公司提出了將操作系統(tǒng)底層與硬件相關(guān)的部分單獨(dú)設(shè)計(jì)成硬件抽象HAL
    發(fā)表于 12-07 10:30

    如何使用抽象設(shè)計(jì)可移植代碼?

    可移植代碼有什么重要性如何使用抽象設(shè)計(jì)可移植代碼求一種可移植軟件的設(shè)計(jì)方案
    發(fā)表于 04-26 06:57

    STM32Cube硬件抽象

      STM32Cubemx是一個(gè)便捷,方便管理的軟件平臺(tái)。極大的優(yōu)化了開(kāi)發(fā)的過(guò)程,盡管很多人對(duì)此不適應(yīng)。它包括了ST產(chǎn)品的每個(gè)系列除了STM8。平臺(tái)包括了STM32Cube硬件抽象(一個(gè)STM32
    發(fā)表于 08-03 07:45

    芯片設(shè)計(jì)中的不同抽象

    在了解Verilog語(yǔ)言的更多細(xì)節(jié)之前,我們最好先了解一下芯片設(shè)計(jì)中的不同抽象
    發(fā)表于 11-10 08:05

    嵌入式系統(tǒng)硬件抽象的設(shè)計(jì)思想簡(jiǎn)析

    嵌入式系統(tǒng)硬件抽象(HAL & BSP)的設(shè)計(jì)思想1 前言1.1 層次化思想1.2 模塊化思想1.3 對(duì)象化思想2 板級(jí)支持包(BSP)3 嵌入式系統(tǒng)硬件抽象的原理3.1 硬件
    發(fā)表于 02-11 07:49

    一文解讀RT-Thread MPU抽象的相關(guān)知識(shí)

    一、介紹MAL(MPU Abstract Layer),即mpu抽象。是RT-Thread自主研發(fā)的,支持安全的內(nèi)存訪問(wèn)。用戶代碼可以任意的訪問(wèn)任務(wù)、外地的內(nèi)存(內(nèi)存任務(wù)的訪問(wèn)權(quán)限、
    發(fā)表于 04-28 13:01

    將BLE抽象添加到新項(xiàng)目的正確方法是什么,應(yīng)該從哪里下載抽象?

    將BLE抽象添加到新項(xiàng)目的正確方法是什么,應(yīng)該從哪里下載抽象
    發(fā)表于 04-11 07:06

    求分享SDK軟件組件和抽象文檔

    SDK 軟件組件和抽象文檔
    發(fā)表于 04-21 07:18

    嵌入式操作系統(tǒng)的通用硬件抽象設(shè)計(jì)

    摘要 基于嵌入式操作系統(tǒng)硬件抽象層理論,設(shè)計(jì)一種用于嵌入式操作系統(tǒng)內(nèi)核開(kāi)發(fā)的通用硬件抽象平臺(tái)。通用硬件抽象能夠?yàn)榍度胧讲僮飨到y(tǒng)內(nèi)核的設(shè)計(jì)
    發(fā)表于 03-29 15:16 ?1178次閱讀
    嵌入式操作系統(tǒng)的通用硬件<b class='flag-5'>抽象</b><b class='flag-5'>層</b>設(shè)計(jì)

    電機(jī)控制硬件抽象(HAL)

    硬件抽象( Hardware Abstraction Layer,HAL)為更高層(例如:應(yīng)用程序框架和客戶應(yīng)用程序等等)提供基于API函數(shù)的服務(wù),允許更高層獨(dú)立于實(shí)際的硬件細(xì)節(jié)執(zhí)行面向硬件的操作。本文檔提供了硬件抽象
    發(fā)表于 03-21 16:38 ?3次下載

    芯片設(shè)計(jì)抽象及其設(shè)計(jì)風(fēng)格

    在了解Verilog語(yǔ)言的更多細(xì)節(jié)之前,我們最好先了解一下芯片設(shè)計(jì)中的不同抽象
    發(fā)表于 11-05 15:51 ?12次下載
    芯片設(shè)計(jì)<b class='flag-5'>抽象</b><b class='flag-5'>層</b>及其設(shè)計(jì)風(fēng)格

    STM32 硬件抽象(Hardware Abstraction la

    STM32 硬件抽象(Hardware Abstraction la
    發(fā)表于 12-09 12:06 ?1次下載
    STM32 硬件<b class='flag-5'>抽象</b><b class='flag-5'>層</b>(Hardware Abstraction la

    電纜護(hù)保護(hù)器的使用方法

    電纜護(hù)保護(hù)器的使用方法 電纜護(hù)保護(hù)器是一種用于保護(hù)電力電纜護(hù)套的裝置。其主要作用是對(duì)電纜護(hù)進(jìn)行監(jiān)測(cè),當(dāng)電纜護(hù)層出現(xiàn)泄漏時(shí),能夠自動(dòng)切斷電力系統(tǒng),以保護(hù)設(shè)備和人身安全。 以下是電纜
    發(fā)表于 02-17 14:52 ?972次閱讀

    AUTOSAR架構(gòu)MCAL、服務(wù)、ECU抽象介紹

    1 微控制器抽象(MCAL) AUTOSAR CP的微控制器抽象(MCAL)是AUTOSAR軟件架構(gòu)中的一個(gè)重要組成部分,它提供了對(duì)底層硬件的
    的頭像 發(fā)表于 10-27 15:36 ?5554次閱讀