
一、什么是MPUMemory Protection UnitMPU全称Memory Protection Unit内存保护单元。它的作用可以简单理解成CPU访问每一块内存之前都要先问MPU我能不能访问应该怎么访问例如CPU准备读取0x70000000MPU首先检查有没有Region覆盖 ↓ 允许Read吗 ↓ 允许Write吗 ↓ 允许Execute吗 ↓ Cache属性是什么 ↓ Memory Type是什么 ↓ 全部满足 ↓ CPU真正访问Memory如果违反规则就会产生Data Abort Prefetch Abort Permission Fault二、为什么需要MPU假设没有MPUCPU │ ├── Flash ├── SRAM ├── DMA Register ├── CAN Register ├── ADC Register └── BootROMCPU任何代码都可以*(0xF0001000)0;甚至memcpy(0x0, ...)直接把Boot覆盖。危险。MPU就是CPU MPU Flash RO Execute SRAM RW No Execute Peripheral Device DMA Buffer Non-cache BootROM Read OnlyCPU必须满足规则才能访问。三、MPU解决哪些问题主要有五类。第一类访问权限例如FlashRead Execute 不能WriteSRAMRead Write 不能ExecuteDMA寄存器Read Write 不能Execute例如Flash: Attempt: *(flash)1;直接Fault。第二类防止程序跑飞例如Stack Overflowchar buf[16]; memcpy(buf,data,1000);覆盖了Task2 Task3 OS HeapMPUStack ↓ 下面放Guard Region ↓ No Access一旦越界Data Abort程序立刻知道Stack溢出了。RTOS几乎都会这么做。第三类防止执行数据例如SRAM里面char code[100];如果攻击者把代码写进去Jump codeMPUSRAM XN Execute NeverCPUPC跳到SRAM ↓ Permission Fault不能执行。这个就是NX XN第四类Cache属性这是你现在最常用的。例如DMA Buffer CPU ↓ Cache ↓ Memory DMA ↓ MemoryDMA不会访问CPU Cache。因此DMA Buffer通常Normal Non-cacheable否则CPU看到的是CacheDMA看到的是Memory数据不一致。例如CPU buffer1; ↓ 只写CacheDMA读Memory 还是0错误。所以DMA Buffer MPU Non-cacheable或者Write Through Device根据平台决定。第五类Memory TypeMPU还能告诉CPU这块Memory是什么。例如Flash NormalSRAM NormalPeripheral DeviceDebug Register Strongly Ordered不同类型CPU优化方式不同。四、MPU Region是什么MPU不是一条一条地址设置。而是Region例如Region0 Flash 0x00000000 ~0x003FFFFFRegion1 SRAM 0x20000000 ~0x2003FFFFRegion2 Peripheral 0x40000000 ~0x4FFFFFFFCPU访问0x20000100MPU属于Region1 ↓ 按Region1属性访问五、Cortex-R52 MPU特点与R5最大的区别之一就是Region定义方式。Armv7-RR5Base Size例如Base 0x20000000 Size 256KB要求Base必须按Size对齐限制较多。Armv8-RR52改成Base Limit例如Base 0x20000000 Limit 0x2003FFFF更加灵活不需要按Region大小对齐也不允许Region之间重叠。Region最小64 Byte最大可覆盖整个4GB地址空间。六、MPU Region包含哪些属性通常一块Region需要配置属性举例Base Address0x20000000Limit Address0x2003FFFFReadYesWriteYesExecuteNoShareableYesCacheableYes/NoMemory TypeNormal / DevicePrivilegePrivileged / User七、一个完整例子假设SoC如下Flash 0x00000000 2MBSRAM 0x20000000 512KBDMA Buffer 0x20100000 64KBPeripheral 0x40000000MPU配置Region地址属性0FlashRO Execute Cacheable1SRAMRW XN Cacheable2DMA BufferRW XN Non-cacheable3PeripheralRW Device XN这样CPU执行Flash可以。CPUWrite FlashFault。CPUExecute SRAMFault。DMA访问DMA Buffer一致。九、MPU与MMU有什么区别MPUMMU物理地址访问虚拟地址访问无地址转换有地址转换Region保护Page保护无页表有页表实时性高功能更丰富Cortex-R/M常见Cortex-A常见因此R52CPU ↓ MPU ↓ Physical Address没有Virtual Address。十、开发中的注意事项最容易踩坑的是以下几点DMA Buffer不要随意配置为Cacheable。如果必须Cacheable就必须配合Cache Clean/Invalidate否则CPU和DMA看到的数据可能不一致。外设寄存器必须配置为Device Memory。不建议配置成Normal Memory否则CPU可能发生乱序访问、预取或合并访问导致寄存器操作异常。RAM建议配置为Execute NeverXN。除非确实需要在RAM中执行代码例如Bootloader复制代码到RAM执行。Flash一般配置为Read Only Executable。这样既能执行程序又能防止误写。利用MPU做安全防护。可以在栈底放置No Access保护区Guard Region快速发现栈溢出也可以保护空指针地址如0x0附近以便尽早发现非法访问。社区和RTOS中也广泛采用这种做法。十一、R52相比R5在MPU上的重要变化这是学习R52最值得关注的一点Cortex-R5Armv7-RCortex-R52Armv8-RBase Size定义RegionBase Limit定义RegionRegion可以重叠Region不能重叠Base需按Region大小对齐只需满足最小粒度要求更灵活最多16个RegionR5典型EL1和EL2分别可拥有最多24个Region实现相关无虚拟化支持支持EL2和虚拟化架构这些变化使R52更适合运行多OS、安全隔离和功能安全应用。