在复杂SoC设计中,内存保护单元(MPU)是确保系统安全性的第一道防线。CMN-600AE作为Arm新一代Coherent Mesh Network互连架构,其MPU设计具有几个显著特点:支持最多18个独立可配置的内存保护区域、64位地址空间覆盖、硬件级安全域隔离。这些特性使其特别适合汽车电子、工业控制等需要ASIL-D/SIL3安全认证的场景。
MPU的每个保护区域由一对寄存器共同定义:
关键约束:所有MPU寄存器必须通过安全访问(secure access)进行配置,且必须在首次非配置访问前完成初始化。违反此时序要求会导致未定义行为。
以por_mpu_m5_prbar9为例,其64位寄存器分为高低两个部分:
高位字段(bits[63:32]):
markdown复制| 比特位 | 字段名 | 说明 | 类型 | 复位值 |
|----------|---------------------|--------------------------|------|--------|
| 63:48 | Reserved | 保留位 | RO | - |
| 47:32 | region9_base_addr | 基地址[47:32] | RW | 0x0 |
低位字段(bits[31:0]):
markdown复制| 比特位 | 字段名 | 说明 | 类型 | 复位值 |
|----------|---------------------|--------------------------|------|--------|
| 31:12 | region9_base_addr | 基地址[31:12] | RW | 0x0 |
| 11:10 | Reserved | 保留位 | RO | - |
| 9 | region9_br | 背景区域指示 | RW | 0b0 |
| 8:6 | Reserved | 保留位 | RO | - |
| 5:2 | region9_ap | 访问权限控制 | RW | 0b0000 |
| 1:0 | Reserved | 保留位 | RO | - |
访问权限位(AP)采用分层控制:
c复制ap[0]: NW (Non-secure Write) - 非安全域写权限
ap[1]: SW (Secure Write) - 安全域写权限
ap[2]: NR (Non-secure Read) - 非安全域读权限
ap[3]: SR (Secure Read) - 安全域读权限
对应por_mpu_m5_prlar9寄存器:
高位字段(bits[63:32]):
markdown复制| 比特位 | 字段名 | 说明 | 类型 | 复位值 |
|----------|---------------------|--------------------------|------|--------|
| 63:48 | Reserved | 保留位 | RO | - |
| 47:32 | region9_limit_addr | 限界地址[47:32] | RW | 0x0 |
低位字段(bits[31:0]):
markdown复制| 比特位 | 字段名 | 说明 | 类型 | 复位值 |
|----------|---------------------|--------------------------|------|--------|
| 31:12 | region9_limit_addr | 限界地址[31:12] | RW | 0x0 |
| 11:1 | Reserved | 保留位 | RO | - |
| 0 | region9_en | 区域使能位 | RW | 0b0 |
假设需要配置一个安全域专用区域:
c复制// 配置PRBAR9
write_reg(0x24A0, 0x00000000); // 低位[31:0]
write_reg(0x24A4, 0x80000000); // 高位[63:32]
// 配置PRLAR9
write_reg(0x24A8, 0x80100001); // 低位[31:0] + enable
write_reg(0x24AC, 0x00000000); // 高位[63:32]
// 设置访问权限(安全读写)
uint32_t prbar_low = read_reg(0x24A0);
prbar_low |= (0b1010 << 2); // 设置AP[3:0]=1010
write_reg(0x24A0, prbar_low);
配置一个安全/非安全域共享区域:
c复制// 配置PRBAR10
write_reg(0x24B0, 0xA0000000); // 低位[31:0]
write_reg(0x24B4, 0x00000000); // 高位[63:32]
// 配置PRLAR10
write_reg(0x24B8, 0xA0001001); // 低位[31:0] + enable
write_reg(0x24BC, 0x00000000); // 高位[63:32]
// 设置访问权限
uint32_t prbar_low = read_reg(0x24B0);
prbar_low |= (0b1101 << 2); // AP[3:0]=1101
write_reg(0x24B0, prbar_low);
时序约束:所有MPU寄存器必须在首次非配置访问前完成初始化。建议在系统启动的BL2阶段完成配置。
地址对齐:基地址和限界地址必须按区域大小对齐。例如1MB区域要求地址低20位为0。
权限冲突:避免设置非法权限组合,如"可写但不可读"。硬件可能不会立即报错但会导致不可预知行为。
区域重叠:当多个区域重叠时,实际生效的权限由编号最高的region决定。建议通过region_br位设置背景区域。
调试技巧:在早期开发阶段,可以:
在CMN-600AE的Mesh网络架构中,MPU配置会直接影响HN-F(Home Node)节点的访存行为。实际项目中我们曾遇到一个典型案例:当多个HN-F节点同时访问不同MPU区域时,未正确配置region_br位导致意外的访问穿透。这个问题的定位花费了大量时间,最终通过逻辑分析仪捕获AXI总线事务才得以解决。这也提醒我们,在复杂多核系统中,MPU配置必须考虑所有可能的访问路径。