内存保护单元(MPU),是一个可以提供内存保护功能的计算机硬件单元,一般都集成在CPU内。MPU是内存管理单元(MMU)的简化版本,仅提供内存保护的支持,常常在低功耗处理器中使用,不需要诸如虚拟内存管理等功能。[1]
MPU允许处于特权模式的程序定义内存区间,分配内存访问权限以及每个区间的属性,不同的处理器能够支持的内存分区都不一样,Cortex-M7系列可以拥有8个或16个内存分区,对于S32G来说,可以支持16个内存分区。
Cortex-M7的MPU
基于Cortex-M7的MCU存储接口如下图所示[2]:
配置/操作MPU时我们都是基于分区(region)设置,每一个region都可以分配不同的访问规则,存储类型以及它们的属性决定了访问这个分区的行为。
分区时常常会碰到分区地址有交叉的情况,此时分区属性将由分区号更高的设定所决定,例如,如果MPU可以设置16个分区,那么分区号为15的分区属性会是这段地址最终的属性。
Cortex-M7拥有统一的MPU存储映射表,也就是说,执行访问和数据访问有同样的分区设定。
除了上述提到Cortex-M7有8个或16个分区,还有一个可选的后台分区(background region),后台分区有着和默认存储映射表相同的访问属性,但是仅能被特权模式下的软件所访问。[3]
如果程序尝试访问一段被MPU禁止访问的区域,处理器会抛出MemManage故障(会被捕捉到异常),在运行操作系统的环境中,这样的行为最终可能引发运行终止。OS执行时,内核可以根据需要运行的任务动态地更新MPU分区设定。
类型和属性
如上所说,分区的类型和属性决定了访问的行为。
类型有两种:Normal和Device/Strongly-Ordered。
对于Normal类型的分区,处理器为了运行效率可能会重排事务(transaction),或者进行预测读操作。而对于Device/Strongly-Ordered类型的分区,处理器必须保持对设备或者强顺序存储按照代码顺序执行事务。
当然,对于Device和Strongly-Ordered两个细分分区类型,它们对于执行顺序也有不一样的地方,外部存储可以缓存期望写入device的数据,但是不允许对写入Strong-Ordered存储数据的缓存。
除此之外,还有两种属性:是否可共享(shareable),是否不允许执行(execute never/XN)。
当设置了Shareable属性时,存储系统会提供不同bus master的数据同步机制,例如,拥有DMA控制器的处理器。
Strongly-Ordered分区一定是Shareable的。
如果多个bus master可以访问一块儿不可共享的区域,那么软件必须保证不同总线间的数据一致性。
如果设置了XN属性,那么处理器会阻止对于这个区域的指令访问,否则抛出异常。
更详细的属性介绍可参考RASR寄存器(如上图)说明,我们目前先关注XN, AP, TEX, C(Cacheable), B, S(Shareable)。
根据TEX, C, B, S的值不同组合,控制了对应存储空间的属性,组合详情参考Arm Cortex-M7 Devices Generic User Guide r1p2。
而对于Cortex-M7的分区,一般有如此设定:
使用MPU
MPU寄存器需要在使用前设置并使能,一般在系统启动之后,应用初始化阶段时完成。
配置操作一般分为三步:
-
选择分区
-
对选择的分区设置属性
-
对其他分区重复上述两个操作
-
使能MPU
如果希望在访问无权限访问分区时能抛出内存管理故障的异常,需要在使能MPU之前设置SHCSR寄存器。
分区大小
分区大小的设置只能是2的次幂,最小为32B,然后可以设置为64B, 128B,1KB, 1MB等等,最大为4GB。
参考
-
^Memory protection unit https://handwiki.org/wiki/Memory_protection_unit#:~:text=A%20memory%20protection%20unit%20%28MPU%29%2C%20is%20a%20computer,of%20memory%20management%20unit%28MMU%29%20providing%20only%20memory%20protectionsupport
-
^How to Configure the Memory Protection Unit (MPU) Tech Brief https://ww1.microchip.com/downloads/en/DeviceDoc/90003179A.pdf
-
^Optional Memory Protection Unit https://developer.arm.com/documentation/dui0646/c/Cortex-M7-Peripherals/Optional-Memory-Protection-Unit?lang=en
原文始发于微信公众号(车载嵌入式软件开发):[Classic AUTOSAR学习]以S32G为例,基于Cortex-M7的内存保护单元(MPU)