MPU內存保護單元
概述
MPU,即內存保護單元,可以設置不同存儲區域的存儲器訪問特性(用戶級、特權訪問、全訪問)和存儲器屬性(如可緩存、可緩沖、可共享),對存儲器(主要是內存和外設)提供保護,從而提高系統可靠性。
- 存儲器訪問特性
| 權限類型 | 特權模式(內核) | 用戶任務 | 典型用途 |
|---|---|---|---|
| 特權只讀(PRIV_RO) | 可讀 | 不可訪問 (觸發故障) | 保護只讀內核代碼/常量 |
| 特權讀寫(PRIV_RW) | 可讀寫 | 不可訪問 (觸發故障) | 內核數據結構、關鍵寄存器 |
| 全訪問(FULL_ACCESS) | 可讀寫 | 可讀寫 | 用戶堆棧、共享內存 |
- 存儲器屬性
| 存儲器屬性 | 硬件行為 | 數據一致性 | 典型用途 |
|---|---|---|---|
| 可緩存 | 讀寫經過Cache | 需軟件維護(Clean/Invalidate) | 單核私有高性能數據 |
| 可緩沖 | 寫入通過Write Buffer異步完成 | 可能導致順序重排 | 低速外設寄存器 |
| 可共享 | 允許多主設備訪問 | 硬件強制同步或禁用緩存 | DMA緩沖區、多核共享內存 |
-
作用
-
阻止用戶應用程序破壞操作系統使用的數據;
-
阻止一個任務訪問其他任務的數據區,從而隔離任務;
-
把關鍵數據區域設置為只讀從根本上解決被破切的可能;
-
檢測意外的存儲訪問,如堆棧溢出、數組越界等;
-
將SRAM或RAM空間定義為不可執行,防止注入攻擊;
-
STM32的MPU保護單元配置
在STM32H743(Cortex-M7內核)中,MPU可配置保護16個內存保護區域,每個區域最小要求256字節,且每一個區域還可配置為8個子域(大小一樣)。
一、MPU控制模式
MPU(Memory Protection Unit)控制模式決定了在默認狀態或異常處理期間MPU的行為及其對內存訪問的影響。
| 控制模式 | 背景區域行為 | 異常期間MPU狀態 | 安全性 | 典型用途 |
|---|---|---|---|---|
| NOT USED | 無,所有內存開放 | 無效 | 無 | 調試/無保護需求 |
| BR禁訪+MPU異常禁用 | 不可訪問 | 禁用 | 中 | 通用RTOS |
| BR禁訪+MPU異常啟用 | 不可訪問 | 啟用 | 高 | 高安全固件 |
| BR特權+MPU異常禁用 | 僅特權訪問 | 禁用 | 中-高 | 特權分離系統(如Linux內核空間) |
| BR特權+MPU異常啟用 | 僅特權訪問 | 啟用 | 最高 | 安全認證產品(ISO 26262 ASIL-D) |
二、三種內存類型
- Normal memory:CPU以最高效的方式加載和存儲字節、半字和字,CPU對于這種內存區的加載或存儲不一定要按照程序代碼的順序執行;
- Device memory:加載和存儲要嚴格按照次序進行,碩確保寄存器按照正確順序執行;
- Strongly ordered memory:程序完全按照代碼順序執行,CPU會等待當前加載存儲執行完畢后才執行下一條指令,導致性能下降。
| 內存類型 | 適用對象 | 性能 |
|---|---|---|
| Normal memory | ROM、FLASH、SRAM | 高 |
| Device memory | 外設 | 中 |
| Strongly ordered memory | 強序 | 低 |
三、Cache介紹
Cache(高級緩存)是提升STM32性能的關鍵一步。M7內核芯片做了一級Cache支持,Cache分為數據緩存D-Cache和指令緩存I-Cache。
Cache支持4種基本操作:(使能、清空、禁止、無效化)。
數據緩存D-Cache是解決CPU加速訪問SRAM,MPU能夠指定區域的Cache策略
1、Cache寫操作
-
寫命中(Cache hit):CPU要寫的SRAM區數據在Cache中已經開辟了對應的區域;
處理方式 說明 write through 直接寫到內存并并同時放到cache里面,內存和cache同步更新 write back 數據更新時只寫入cache,只有數據替換時被修改的cache數據才寫到內存 -
寫不命中(Cache Miss):Cache里面沒有開辟對應的區域;
處理方式 說明 write allocate 把要寫的數據載入到cache,對cache寫后更新到內存 no write allocate 直接寫入內存
2、Cache讀操作
-
讀命中(Cache hit):CPU要讀取的SRAM區數據在Cache中已經加載好;
處理方式 說明 Cache read 直接從cache中讀出數據即可(不能保證數據一致性) -
讀不命中(Cache Miss):Cache里面沒有需要讀的數據;
處理方式 說明 read through 直接從內存中讀出,不用cache read allocate 把數據從內存加載到cache,再從cache讀取
2、數據一致性解決
-
設置共享屬性
Cache相當于沒有開啟。
-
軟件維護
操作 函數 說明 clean清空 SCB_CleanDCache() 當Cache已變化,內存沒有更新時,DMA搬運之前進行此操作,將Cache同步到內存 invalidata無效化 SCB_InvalidataDCache() 當SRAM數據已變化,Cache未更新時,DMA搬運數據后,將SRAM數據同步到Cache中
二、區域設置
| 配置項 | 說明 |
|---|---|
| MPU Region | 參數類型:Enable/Disable,是否啟用區域MPU區域保護 |
| MPU Region Base Address | 定義Region 0的起始地址(地址必須按區域大小對齊) |
| MPU Region Size | 設置Region 0覆蓋的內存大小。 |
| MPU TEX field level | 擴展內存類型(用于細化內存屬性和緩存策略) |
| MPU Shareability Permission | 參數類型:Enable/Disable,是否共享 |
| MPU Cacheable Permissionn | 參數類型:Enable/Disable,是否緩存 |
| MPU Bufferable Permissionn | 參數類型:Enable/Disable,是否緩沖 |
| MPU Instruction Access | 參數類型:Enable/Disable,是否使能從該區域執行指令。 |
| MPU Access Permission | 見下表 |
TEX是內存的“身份證”,告訴硬件它屬于哪一類(普通RAM、設備寄存器還是特殊內存),而C/B是它的“行為指南”(如何讀寫)。兩者協作但職責分離。
-
MPU設置內存的訪問權限(MPU Access Permission)
參數 執行(x) 讀(R) 寫(W) 典型用途 ALL ACCESS NOT PERMITTED? ? ? 內存隔離/非法訪問檢測 Privileged READS? ?? ? 只讀配置表(僅內核可訪問) Privileged READS + Unprivileged READS? ?? ? 全局只讀數據 Privileged READ/WRITE? ?? ?? 內核數據結構 / 外設寄存器 Privileged READ/WRITE + Unprivileged READS? ?? ? 安全日志(用戶只讀,內核可寫) ALL ACCESS PERMITTED?? ?? ?? 完全開放區域(調試/啟動階段)
三、建議配(MPU_TEX_LEVEL0)(注意考慮數據一致性問題)
| 設備 | 基地址 | 區域大小 | 指令訪問 | 訪問權限 | 共享、Cache、緩沖 |
|---|---|---|---|---|---|
| DTCM | 0x2000 0000 | 128K | 允許 | 全訪問 | 不共享、cache、緩沖 |
| AXI SRAM | 0x2400 0000 | 512K | 允許 | 全訪問 | 不共享、cache、緩沖 |
| SRAM1~3 | 0x3000 0000 | 512K | 允許 | 全訪問 | 不共享、cache、緩沖 |
| SRAM4 | 0x3800 0000 | 64K | 允許 | 全訪問 | 不共享、cache、緩沖 |
| FMC | 0x6000 0000 | 64M | 允許 | 全訪問 | 不共享、不cache、不緩沖 |
| SDRAM | OxC000 0000 | 64M | 允許 | 全訪問 | 不共享、cache、緩沖 |
| NAND | 0x8000 0000 | 256M | 不允許 | 全訪問 | 不共享、不cache、不緩沖 |
| SPI FLASH | 0x9000 0000 | 8M | 允許 | 全訪問 | 不共享、cache、緩沖 |

浙公網安備 33010602011771號