由浅入深讲解MPU的使用
2026/7/23 23:27:14 网站建设 项目流程

一、什么是MPU(Memory Protection Unit)

MPU,全称Memory Protection Unit(内存保护单元)

它的作用可以简单理解成:

CPU访问每一块内存之前,都要先问MPU:"我能不能访问?应该怎么访问?"

例如:

CPU准备读取

0x70000000

MPU首先检查:

有没有Region覆盖? ↓ 允许Read吗? ↓ 允许Write吗? ↓ 允许Execute吗? ↓ Cache属性是什么? ↓ Memory Type是什么? ↓ 全部满足 ↓ CPU真正访问Memory

如果违反规则,就会产生

Data Abort Prefetch Abort Permission Fault

二、为什么需要MPU

假设没有MPU:

CPU │ ├── Flash ├── SRAM ├── DMA Register ├── CAN Register ├── ADC Register └── BootROM

CPU任何代码都可以:

*(0xF0001000)=0;

甚至:

memcpy(0x0, ...)

直接把Boot覆盖。

危险。


MPU就是:

CPU MPU Flash RO Execute SRAM RW No Execute Peripheral Device DMA Buffer Non-cache BootROM Read Only

CPU必须满足规则才能访问。


三、MPU解决哪些问题

主要有五类。


第一类:访问权限

例如:

Flash

Read Execute 不能Write

SRAM

Read Write 不能Execute

DMA寄存器

Read Write 不能Execute

例如:

Flash: Attempt: *(flash)=1;

直接Fault。


第二类:防止程序跑飞

例如:

Stack Overflow

char buf[16]; memcpy(buf,data,1000);

覆盖了:

Task2 Task3 OS Heap

MPU:

Stack ↓ 下面放Guard Region ↓ No Access

一旦越界:

Data Abort

程序立刻知道Stack溢出了。

RTOS几乎都会这么做。


第三类:防止执行数据

例如:

SRAM里面:

char code[100];

如果攻击者把代码写进去:

Jump code

MPU:

SRAM XN Execute Never

CPU:

PC跳到SRAM ↓ Permission Fault

不能执行。

这个就是:

NX XN

第四类:Cache属性

这是你现在最常用的。

例如:

DMA Buffer CPU ↓ Cache ↓ Memory DMA ↓ Memory

DMA不会访问CPU Cache。

因此:

DMA Buffer通常:

Normal Non-cacheable

否则:

CPU看到的是Cache

DMA看到的是Memory

数据不一致。


例如:

CPU buffer=1; ↓ 只写Cache

DMA:

读Memory 还是0

错误。

所以:

DMA Buffer MPU Non-cacheable

或者:

Write Through Device

根据平台决定。


第五类:Memory Type

MPU还能告诉CPU:

这块Memory是什么。

例如:

Flash Normal
SRAM Normal
Peripheral Device
Debug Register Strongly Ordered

不同类型:

CPU优化方式不同。


四、MPU Region是什么

MPU不是一条一条地址设置。

而是:

Region

例如:

Region0 Flash 0x00000000 ~0x003FFFFF
Region1 SRAM 0x20000000 ~0x2003FFFF
Region2 Peripheral 0x40000000 ~0x4FFFFFFF

CPU访问:

0x20000100

MPU:

属于Region1 ↓ 按Region1属性访问

五、Cortex-R52+ MPU特点

与R5最大的区别之一就是Region定义方式。

Armv7-R(R5)

Base + Size

例如:

Base 0x20000000 Size 256KB

要求:

Base必须按Size对齐

限制较多。


Armv8-R(R52)

改成:

Base + Limit

例如:

Base 0x20000000 Limit 0x2003FFFF

更加灵活,不需要按Region大小对齐,也不允许Region之间重叠。Region最小64 Byte,最大可覆盖整个4GB地址空间。


六、MPU Region包含哪些属性

通常一块Region需要配置:

属性举例
Base Address0x20000000
Limit Address0x2003FFFF
ReadYes
WriteYes
ExecuteNo
ShareableYes
CacheableYes/No
Memory TypeNormal / Device
PrivilegePrivileged / User

七、一个完整例子

假设SoC如下:

Flash 0x00000000 2MB
SRAM 0x20000000 512KB
DMA Buffer 0x20100000 64KB
Peripheral 0x40000000

MPU配置:

Region地址属性
0FlashRO Execute Cacheable
1SRAMRW XN Cacheable
2DMA BufferRW XN Non-cacheable
3PeripheralRW Device XN

这样:

CPU执行:

Flash

可以。

CPU:

Write Flash

Fault。

CPU:

Execute SRAM

Fault。

DMA:

访问DMA Buffer

一致。


九、MPU与MMU有什么区别

MPUMMU
物理地址访问虚拟地址访问
无地址转换有地址转换
Region保护Page保护
无页表有页表
实时性高功能更丰富
Cortex-R/M常见Cortex-A常见

因此:

R52:

CPU ↓ MPU ↓ Physical Address

没有Virtual Address。


十、开发中的注意事项

最容易踩坑的是以下几点:

  1. DMA Buffer不要随意配置为Cacheable。如果必须Cacheable,就必须配合Cache Clean/Invalidate,否则CPU和DMA看到的数据可能不一致。
  2. 外设寄存器必须配置为Device Memory。不建议配置成Normal Memory,否则CPU可能发生乱序访问、预取或合并访问,导致寄存器操作异常。
  3. RAM建议配置为Execute Never(XN)。除非确实需要在RAM中执行代码(例如Bootloader复制代码到RAM执行)。
  4. Flash一般配置为Read Only + Executable。这样既能执行程序,又能防止误写。
  5. 利用MPU做安全防护。可以在栈底放置No Access保护区(Guard Region),快速发现栈溢出;也可以保护空指针地址(如0x0附近)以便尽早发现非法访问。社区和RTOS中也广泛采用这种做法。

十一、R52+相比R5在MPU上的重要变化

这是学习R52+最值得关注的一点:

Cortex-R5(Armv7-R)Cortex-R52+(Armv8-R)
Base + Size定义RegionBase + Limit定义Region
Region可以重叠Region不能重叠
Base需按Region大小对齐只需满足最小粒度要求,更灵活
最多16个Region(R5典型)EL1和EL2分别可拥有最多24个Region(实现相关)
无虚拟化支持支持EL2和虚拟化架构

这些变化使R52+更适合运行多OS、安全隔离和功能安全应用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询