在异构计算架构中,内存保护单元(MPU)扮演着硬件级安全守卫的角色。CMN-600AE作为Arm新一代相干网状网络控制器,其MPU模块采用分级安全设计,通过可编程寄存器组实现物理地址空间的动态划分。与传统的固定区域MPU不同,CMN-600AE支持多达32个可配置保护区域(Region 0-31),每个区域通过寄存器对独立控制:
这种设计允许系统在运行时动态调整内存保护策略,例如在汽车电子中,可根据不同ECU的安全等级实时重配置内存访问规则。寄存器组的位域设计体现了Arm架构的精妙之处:
c复制// 典型寄存器位域布局示例
typedef struct {
uint32_t base_addr : 20; // 基地址[31:12]
uint32_t ap : 4; // 访问权限控制
uint32_t br : 1; // 背景区域标识
uint32_t reserved : 7; // 保留位
} prbar_low_t;
以por_mpu_m2_prbar16为例,这个64位寄存器分为高低两个32位部分:
高位寄存器(Bits 63:32):
低位寄存器(Bits 31:0)关键字段:
关键限制:当某权限位被硬件强制设置为0时,尝试写入1将触发非法操作异常。这种设计防止了权限升级攻击。
por_mpu_m2_prlar16寄存器控制区域的终止边界和使能状态:
地址范围计算:
code复制有效基地址 = {prbar.region16_base_addr[47:32], prbar.region16_base_addr[31:12], 12'h000}
有效限地址 = {prlar.region16_limit_addr[47:32], prlar.region16_limit_addr[31:12], 12'hFFF}
区域大小必须满足:限地址 ≥ 基地址 + 4KB
关键控制位:
当总线事务到达MPU时,硬件按以下顺序校验:
mermaid复制graph TD
A[总线事务到达] --> B{地址匹配?}
B -->|Yes| C[检查AP权限位]
B -->|No| D[进入背景区域策略]
C --> E{权限满足?}
E -->|Yes| F[允许访问]
E -->|No| G[触发保护异常]
当访问未落在任何使能区域内时:
在汽车功能安全场景中,建议配置:
为安全敏感数据(如加密密钥)配置保护:
c复制// 设置基地址寄存器
write_reg(PRBAR16_HIGH, 0x00020000); // 基地址[47:32]
write_reg(PRBAR16_LOW,
(0x30000 << 12) | // 基地址[31:12]
(0b0101 << 2) | // 仅允许安全读写
(0 << 9)); // 非背景区域
// 设置限地址寄存器
write_reg(PRLAR16_HIGH, 0x00020000); // 限地址[47:32]
write_reg(PRLAR16_LOW,
(0x30FFF << 12) | // 限地址[31:12]
(1 << 0)); // 使能区域
这将创建一个从0x2000030000到0x200003FFFF的4KB安全区域。
为安全域与非安全域共享内存配置:
c复制write_reg(PRBAR17_LOW,
(0x40000 << 12) |
(0b1010 << 2) | // 安全写+非安全读
(0 << 9));
write_reg(PRLAR17_LOW,
(0x40FFF << 12) |
(1 << 0));
这种配置适用于安全域写入日志、非安全域读取的场景。
地址未对齐:
权限冲突:
区域重叠:
区域布局优化:
权限位组合:
动态重配置:
在汽车电子控制单元中,我们通过以下配置实现ASIL-D合规: