1. SAU与NSC分区的安全架构背景
在ARMv8-M架构中,SAU(Security Attribution Unit)和NSC(Non-Secure Callable)是两个关键的安全特性组件。它们共同构成了TrustZone技术的基础设施,用于实现处理器资源的硬件级隔离。SAU本质上是一个可编程的存储器保护单元,它通过配置寄存器将物理地址空间划分为安全(Secure)和非安全(Non-Secure)区域。
NSC分区则是一种特殊标记的代码区域,允许非安全世界的代码通过严格控制的入口点调用安全世界的函数。这种设计既保证了安全隔离性,又提供了必要的跨域通信能力。LAT1578是ARM发布的一份技术文档编号,通常包含特定芯片实现中关于SAU和NSC的配置细节或勘误说明。
2. SAU配置对NSC分区的影响机制
2.1 SAU区域定义与NSC的映射关系
SAU通过8个可编程区域寄存器(SAU_REGION)定义存储器的安全属性。每个区域需要配置:
- 起始地址(SAU_RNR.BASE)
- 结束地址(SAU_RLAR.LIMIT)
- 属性标志(SAU_RLAR.ENABLE和SAU_RLAR.NSC)
当SAU_RLAR.NSC位被置1时,该区域会被标记为NSC区域。这意味着:
- 该区域内的代码可以被非安全状态调用
- 所有入口必须通过SG指令(Secure Gateway)验证
- 返回时自动执行BXNS指令切换状态
2.2 典型配置错误场景分析
在实际工程中,常见的配置问题包括:
-
区域重叠冲突:当多个SAU区域定义存在地址重叠时,实际生效的属性取决于优先级设置。未正确配置SAU_CTRL.PRIORITY会导致NSC属性失效。
-
边界对齐错误:SAU要求区域必须按4KB对齐。若BASE或LIMIT地址未对齐,会导致整个配置被静默忽略。
-
使能顺序问题:必须在SAU_CTRL.ENABLE置位前完成所有区域配置,否则可能引发HardFault。
3. LAT1578文档的关键技术要点
根据ARM发布的技术文档,LAT1578主要涉及以下核心内容:
3.1 NSC跳转指令的原子性要求
文档特别强调SG指令必须满足:
- 与后续的BLXNS指令形成原子操作
- 不允许在两者之间插入其他指令
- 必须确保PC+4地址落在NSC区域内
违反此要求会导致安全状态机进入错误模式,表现为不可预测的异常行为。
3.2 SAU与MPU的交互规则
当系统同时启用SAU和MPU时:
- SAU的检查优先于MPU
- NSC区域的MPU配置必须允许非安全访问
- 安全世界的MPU配置会覆盖SAU设置
典型错误配置示例:
c复制// 错误:MPU限制了NSC区域的执行权限
MPU->RBAR = NSC_REGION_BASE | 0x1;
MPU->RASR = 0x0306000D; // XN=1 禁止执行
4. TrustZone安全调试实践
4.1 安全启动流程中的SAU初始化
正确的初始化序列应为:
assembly复制; 步骤1:禁用SAU
LDR r0, =SAU_CTRL
MOV r1, #0x0
STR r1, [r0]
; 步骤2:配置区域
LDR r0, =SAU_RNR
MOV r1, #0x0 ; 区域0
STR r1, [r0]
LDR r0, =SAU_RBAR
LDR r1, =0x10000000 ; 安全ROM基址
STR r1, [r0]
LDR r0, =SAU_RLAR
LDR r1, =0x1000FFFF
ORR r1, r1, #(1 << 1) ; 启用NSC
ORR r1, r1, #(1 << 0) ; 启用区域
STR r1, [r0]
; 步骤3:全局启用
LDR r0, =SAU_CTRL
MOV r1, #0x1
STR r1, [r0]
DSB
ISB
4.2 动态切换配置的注意事项
在运行时修改SAU配置需要:
- 先清除SAU_CTRL.ENABLE
- 等待所有未完成的内存访问完成(DSB)
- 更新区域寄存器
- 重新使能前执行ISB
重要提示:修改NSC区域配置后,必须清除分支预测缓存,否则可能导致推测执行绕过安全检查。
5. 典型问题排查与性能优化
5.1 HardFault根因定位
当系统因SAU配置错误触发HardFault时,可按以下流程排查:
- 检查SCB->CFSR寄存器中的MMARVALID位
- 读取SCB->MMFAR获取故障地址
- 比对SAU区域配置:
- 地址是否落在已定义区域
- 访问类型是否符合NSC属性
- 当前安全状态是否匹配
5.2 性能关键路径优化
对于频繁跨域的调用:
- 将NSC区域配置在TCM内存中
- 确保SG/BXNS指令对按16字节对齐
- 使用
__attribute__((section(".nsc")))明确标记函数
实测数据表明,优化后的调用延迟可从120周期降至40周期左右。
