在嵌入式系统安全设计中,内存保护单元(MPU)和信任区域控制器(TZC)构成了硬件级安全隔离的基础设施。作为ARM TrustZone技术的关键组件,TZC-400通过可编程的地址区域配置和过滤器单元实现了细粒度的访问控制机制。
TZC-400的核心功能架构包含三个主要部分:
关键设计要点:TZC-400采用分层校验机制,先通过过滤器单元确定访问源属性(安全状态、特权级别等),再根据目标区域的属性寄存器进行权限匹配。这种设计使得安全策略可以灵活适配不同应用场景。
这个只读寄存器反映了TZC-400的硬件实现配置:
c复制typedef struct {
uint32_t no_of_regions : 5; // 区域数量配置
uint32_t reserved1 : 3; // 保留位
uint32_t address_width : 6; // 地址总线宽度
uint32_t reserved2 : 10; // 保留位
uint32_t no_of_filters : 2; // 过滤器单元数量
uint32_t reserved3 : 6; // 保留位
} BUILD_CONFIG_REG;
典型配置示例:
address_width = 0b100111no_of_filters = 0b11no_of_regions = 0b01000控制安全违规事件的响应行为:
| 位域 | 名称 | 功能描述 |
|---|---|---|
| [1:0] | reaction_value | 00: 保持TZCINT低电平,返回OKAY响应 01: 保持TZCINT低电平,返回DECERR响应 10: 拉高TZCINT,返回OKAY响应 11: 拉高TZCINT,返回DECERR响应 |
实际应用建议:
管理过滤器单元的启用状态:
c复制// 典型操作流程
void enable_filter(uint32_t filter_id) {
GATE_KEEPER.OPEN_REQUEST |= (1 << filter_id); // 请求打开指定过滤器
while(!(GATE_KEEPER.OPEN_STATUS & (1 << filter_id))); // 等待确认
}
注意事项:
每个区域通过两组寄存器定义地址范围:
地址计算示例(40位地址空间):
math复制Region1\_Base = (REGION_BASE_HIGH_1 << 32) | REGION_BASE_LOW_1
Region1\_Top = (REGION_TOP_HIGH_1 << 32) | REGION_TOP_LOW_1
控制区域的安全访问策略:
| 位 | 名称 | 功能 |
|---|---|---|
| 31 | s_wr_en | 安全写使能 |
| 30 | s_rd_en | 安全读使能 |
| 3:0 | filter_en | 各过滤器单元的区域启用控制位 |
典型配置场景:
s_rd_en=1, s_wr_en=0, filter_en=0xFs_rd_en=0, s_wr_en=0, filter_en=0x1基于NSAID(Non-Secure Access ID)的精细控制:
c复制// 允许NSAID 0x2的非安全读访问
REGION_ID_ACCESS_1.NSAID_RD_EN |= (1 << 2);
// 允许NSAID 0x5的非安全写访问
REGION_ID_ACCESS_1.NSAID_WR_EN |= (1 << 5);
实时反映安全事件状态:
| 位域 | 描述 |
|---|---|
| status[3:0] | 各过滤器单元的中断状态 |
| overrun[3:0] | 中断清除后再次发生的违规事件 |
| overlap[3:0] | 区域重叠导致的访问冲突 |
每个过滤器单元对应一组寄存器:
调试技巧:
c复制void dump_violation(uint32_t filter_id) {
uint32_t offset = 0x20 + (0x10 * filter_id);
printf("Violation at 0x%lx, ID:0x%x, %s %s access\n",
((uint64_t)REG(offset+4) << 32) | REG(offset),
REG(offset+12),
REG(offset+8) & (1<<24) ? "Write" : "Read",
REG(offset+8) & (1<<21) ? "Non-Secure" : "Secure");
}
c复制// 配置安全引导区域(0x0000_0000 - 0x0003_FFFF)
REGION_BASE_LOW_1 = 0x00000000;
REGION_BASE_HIGH_1 = 0x0;
REGION_TOP_LOW_1 = 0x00040000;
REGION_TOP_HIGH_1 = 0x0;
REGION_ATTRIBUTES_1 = 0x8000000F; // 仅允许安全读
c复制// 共享内存区域(0x3000_0000 - 0x3001_FFFF)
REGION_ATTRIBUTES_2 = 0xC000000F; // 允许安全读写
REGION_ID_ACCESS_2 = 0x00010001; // 仅允许NSAID=0的非安全访问
c复制// 关键外设区域(0x4000_0000 - 0x4000_FFFF)
REGION_ATTRIBUTES_3 = 0x80000001; // 仅Filter0可访问
ACTION = 0x3; // 违规时触发中断并返回错误
区域重叠处理:
推测访问控制:
c复制SPECULATION_CTRL = 0x3; // 禁用所有推测访问
在安全敏感场景建议禁用推测执行
低延迟配置:
调试接口保护:
c复制GATE_KEEPER = 0x1; // 仅保留Filter0激活
生产环境应关闭调试用过滤器单元
在TZC-400的实际部署中,我们发现最常见的配置错误是区域地址未正确对齐。根据ARM建议,所有区域边界必须至少4KB对齐,否则会导致不可预测的行为。另一个易错点是忘记设置REGION_ATTRIBUTES的filter_en位,这会导致配置的区域实际上不参与访问控制。