ARM Cortex-R52 内核详解(五)——内存保护单元(MPU)模块详解

📅 发布时间:2026/7/9 0:32:04 👁️ 浏览次数:
ARM Cortex-R52 内核详解(五)——内存保护单元(MPU)模块详解
目录一、MPU是什么为什么需要MPU二、Cortex-R52 MPU核心特性三、Cortex-R52 MPU核心概念1. 基础概念2. 核心配置项说明四、Cortex-R52 MPU核心寄存器五、MPU标准配置步骤六、典型使用场景实例实例1RTOS任务栈溢出保护通用场景和Cortex-M7逻辑一致实例2TrustZone安全固件区域保护R52特有实例3外设寄存器区域保护七、常见问题与注意事项八、小结参考资料一、MPU是什么为什么需要MPUMPU全称Memory Protection Unit内存保护单元是Cortex-R52内核内置的硬件模块和Cortex-M7的MPU定位一致不需要MMU虚拟内存就能实现内存访问权限隔离适合裸机/RTOS硬实时场景对比MMU没有地址转换延迟满足车规、工业级硬实时需求。为什么要使用MPU在功能安全要求越来越高的今天MPU可以解决以下核心问题检测RTOS任务栈溢出溢出后访问非法区域自动触发异常提前发现问题避免踩坏其他任务内存实现任务之间的内存隔离禁止任务越权访问其他任务的私有数据提升系统稳定性实现TrustZone安全隔离安全世界的内存/外设只有安全代码可以访问非安全访问直接触发错误满足ISO 26262 ASIL-D功能安全要求禁止数据区域执行代码防止缓冲区溢出攻击提升信息安全性每个区域独立配置缓存属性优化Flash/RAM/外设的访问性能比全局配置更灵活对比Cortex-M7的MPUCortex-R52的MPU支持更多区域、原生TrustZone安全隔离、更细的配置粒度完全满足复杂域控制器的需求。二、Cortex-R52 MPU核心特性特性Cortex-R52 MPUCortex-M7 MPU差异说明最大支持内存区域数量最多32个独立区域最多8~16个R52多一倍满足复杂系统多分区需求TrustZone安全隔离安全/非安全独立MPU配置硬件强制隔离无原生安全隔离R52原生满足功能安全隔离要求安全属性配置每个区域可单独配置安全/非安全属性无非安全访问安全区域自动触发SecureFault内存缓存属性配置每个区域独立配置缓存类型写回/写通/无缓存/设备每个区域仅能配置是否缓存R52配置更灵活性能优化更方便执行禁止XN每个区域独立配置可执行/不可执行支持规则一致防止数据区域执行恶意代码子区域划分每个区域支持8个子区域可任意禁用支持规则一致方便处理重叠内存空间重叠区域优先级编号越大优先级越高高编号覆盖低编号规则一致和Cortex-M7完全相同Cortex-R52 MPU核心特性总结不需要虚拟内存硬件直接做权限检查访问非法地址自动触发MemManage Fault延迟极低原生支持安全域隔离非安全代码无法修改安全MPU配置无法访问安全内存硬件防篡改满足功能安全要求所有错误都能硬件检测不需要软件轮询可追溯错误地址三、Cortex-R52 MPU核心概念1. 基础概念内存区域MPU将整个4GB地址空间划分为多个连续的独立区域每个区域单独配置属性R52编号范围0~31默认背景区域地址没有匹配到任何配置区域时使用默认背景区域的权限开启MPU后默认背景仅允许特权访问用户访问未匹配地址直接触发错误和Cortex-M7规则一致区域对齐要求N字节大小的区域基地址必须是N的整数倍否则配置不生效这是最常见的踩坑点2. 核心配置项说明配置项说明R52特有差异区域基地址/大小基地址是区域起始地址大小必须是2的幂次最小支持32字节最大支持4GB规则和Cortex-M7一致最大支持的区域数量更多访问权限AP分特权模式/用户模式分别配置权限每个模式可配置为无访问/只读/读写共8种组合规则和Cortex-M7一致额外增加安全访问权限控制执行禁止XN置1表示该区域禁止取指执行一般数据区域栈/堆/全局变量都要配置为XN规则和Cortex-M7一致每个安全域独立配置内存类型/缓存属性强序Strongly-ordered用于核心寄存器访问严格按顺序设备Device用于外设寄存器禁止缓存普通Normal用于Flash/RAM可配置为无缓存/写通/写回Cortex-M7仅支持简单缓存开关R52每个区域可独立配置完整内存属性更灵活安全属性配置该区域是安全区域还是非安全区域安全区域只有安全世界可以访问非安全访问直接触发SecureFaultR52特有Cortex-M7无该配置是TrustZone隔离的核心四、Cortex-R52 MPU核心寄存器Cortex-R52 MPU寄存器全部映射在SCB系统控制块地址空间安全世界和非安全世界各有一套独立的寄存器非安全世界不能修改安全MPU寄存器硬件强制隔离核心寄存器如下寄存器地址功能说明R52差异MPU_TYPEMPU类型寄存器0xE000ED90只读读取MPU支持的区域数量Cortex-R52读取到的值为32和Cortex-M7功能一致仅数值不同MPU_CTRLMPU控制寄存器0xE000ED94控制MPU开启/关闭、默认背景权限额外增加安全MPU使能位R52特有MPU_RBAR区域基地址寄存器0xE000ED9C存储配置区域的编号、基地址支持32个区域编号位比Cortex-M7多1位MPU_RASR区域属性大小寄存器0xE000EDA0存储配置区域的大小、访问权限、XN、内存属性、安全属性额外增加安全属性位R52特有五、MPU标准配置步骤配置流程和Cortex-M7大体一致仅增加安全配置的特殊要求关闭MPU修改配置前先清零MPU_CTRL的BIT0关闭MPU避免配置过程中触发异常⚠️ R52特有注意安全MPU配置需要在安全世界操作非安全MPU配置在非安全世界不能交叉修改逐个配置内存区域每个区域依次写入MPU_RBAR基地址编号和MPU_RASR所有属性写入后立即生效⚠️ 核心注意必须满足基地址对齐要求N字节大小的区域基地址必须N字节对齐不对齐会导致配置错误确认重叠区域优先级重叠区域优先级规则为编号越大优先级越高需要优先保护的区域一定要配置更大的编号才能覆盖低优先级大区域的属性开启MPU配置完所有区域后写MPU_CTRL开启MPU配置生效一般开启默认背景特权访问置位BIT1六、典型使用场景实例实例1RTOS任务栈溢出保护通用场景和Cortex-M7逻辑一致给每个任务栈分配独立MPU区域在栈结束后划分一个32字节的保护区配置保护区为用户不可访问任务溢出访问保护区就会自动触发MemManage Fault提前检测栈溢出// 配置非安全任务栈溢出保护区基地址0x82004000大小32字节用户不可访问 MPU-RBAR (0x82004000 MPU_RBAR_ADDR_Msk) | (10 MPU_RBAR_REGION_Pos); MPU-RASR (0x04 MPU_RASR_SIZE_Pos) | // 大小2^(41)32字节 (0b001 MPU_RASR_AP_Pos) | // AP配置特权读写用户无访问 MPU_RASR_XN_Msk | // 数据区域禁止执行 MPU_RASR_ATTR_NORMAL_NOCACHE | // 保护区不缓存 MPU_RASR_NS_Msk; // 非安全区域实例2TrustZone安全固件区域保护R52特有将安全固件存储区域配置为安全只读区域非安全世界不能读写防止非安全篡改固件// 配置安全固件区域基地址0x00000000大小1MB安全只读 MPU-RBAR (0x00000000 MPU_RBAR_ADDR_Msk) | (0 MPU_RBAR_REGION_Pos); MPU-RASR (0x11 MPU_RASR_SIZE_Pos) | // 大小2^(171)1MB (0b010 MPU_RASR_AP_Pos) | // AP配置特权只读用户无访问 0 | // 代码区域允许执行 MPU_RASR_ATTR_NORMAL_WRITEBACK | // Flash配置为写回缓存提升访问性能 0; // 安全区域NS位清0实例3外设寄存器区域保护安全看门狗寄存器仅允许安全世界访问配置为安全设备类型禁止非安全访问// 配置安全看门狗寄存器区域基地址0x40100000大小4KB安全设备类型 MPU-RBAR (0x40100000 MPU_RBAR_ADDR_Msk) | (1 MPU_RBAR_REGION_Pos); MPU-RASR (0x09 MPU_RASR_SIZE_Pos) | // 大小2^(101)4KB (0b011 MPU_RASR_AP_Pos) | // AP配置特权读写用户无访问 MPU_RASR_XN_Msk | // 寄存器区域禁止执行 MPU_RASR_ATTR_DEVICE | // 外设寄存器配置为设备类型禁止缓存 0; // 安全区域七、常见问题与注意事项问题原因解决方法配置完MPU立即触发HardFault/MemManageFault90%是基地址没有按区域大小对齐N字节大小的区域基地址必须是N的整数倍修改对齐后重新配置用户程序启动就触发错误忘记开启默认背景区域特权访问置位MPU_CTRL的BIT1允许特权访问未配置的地址区域非安全访问安全区域不触发错误安全MPU未开启或者区域安全属性配置错误开启安全MPU确认区域安全属性位为0安全外设寄存器不工作读取值不对外设区域配置为Normal缓存CPU读缓存而不是实际寄存器所有外设寄存器必须配置为Device/Strongly-ordered类型禁止缓存保护区域属性不生效重叠区域优先级配置错误保护区域编号比大区域小记住编号越大优先级越高保护区域一定要配置更大的编号开启MPU后内核性能下降明显缓存属性配置错误Flash/RAM全部配置为不缓存Flash/RAM配置为Write-Back缓存开启缓存后性能提升3~5倍非安全修改MPU会影响安全世界吗不会R52设计就是安全和非安全MPU完全独立硬件隔离非安全只能修改自己的MPU配置不影响安全八、小结Cortex-R52的MPU在Cortex-M7 MPU的基础上增加了原生TrustZone安全隔离、更多区域、更灵活的缓存配置完全满足车规、工业等高可靠硬实时场景的功能安全要求正确配置MPU可以提前检测内存错误、实现权限隔离、避免难定位的内存踩坏问题开发阶段只要牢记对齐规则、优先级规则、缓存配置规则、安全隔离规则就能快速上手。参考资料ARM® Cortex®-R52 Generic User GuideARM官方ARMv8-R Architecture Reference ManualARM官方ARM TrustZone for Cortex-R Programming GuideARM官方Texas Instruments AM62x Cortex-R52 MPU Programming GuideTI官方