MPU内存保护单元

3.2k words

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种基本操作:(使能、清空、禁止、无效化)。

image-20250715090857174

数据缓存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是它的“行为指南”(如何读写)。两者协作但职责分离。

2023-07-02
  • 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、缓冲