12.3 安全内存区域划分
目录
- 12.3.1 安全内存的基本概念
- 12.3.2 TF-A内存布局设计
- 12.3.3 安全内存配置方法
- 硬件寄存器配置
- MMU页表配置
- 动态内存分配
- 12.3.4 安全与非安全世界共享内存
- 12.3.5 安全内存保护最佳实践
- 12.3.6 平台特定实现案例
- 案例1:Cortex-A76平台配置
- 案例2:动态测量扩展(DME)
- 12.3.7 常见问题排查
- 12.3.8 未来演进方向
12.3.1 安全内存的基本概念
在ARM TrustZone架构中,安全内存区域(Secure Memory Regions)是指仅能被安全世界(Secure World)访问的物理内存范围。TF-A通过以下机制实现安全内存隔离:
- 硬件级隔离:利用TrustZone的TZASC(TrustZone Address Space Controller)或TZMA(TrustZone Memory Adapter)硬件模块
- 软件级保护:通过MMU配置和内存属性设置(NS位管理)
- 运行时检查:在异常级别切换时进行访问权限验证
典型的安全内存用途包括:
- 安全监控程序(BL31)的代码和数据
- 可信操作系统(BL32)的运行空间
- 安全服务的关键数据结构
- 硬件加密密钥存储区
12.3.2 TF-A内存布局设计
TF-A采用静态划分与动态分配相结合的内存管理策略:
/* 典型的内存布局示例(AArch64) */
+-------------------------+ EL3
| BL31 (Secure Monitor) |
+-------------------------+
| BL32 (TEE OS) |
+-------------------------+
| Secure Shared Memory |
+-------------------------+ EL1/0
| Non-Secure World (BL33) |
+-------------------------+
| HW Reserved Areas |
+-------------------------+
关键配置参数(通常在平台定义文件中指定):
BL31_BASE = 0x04000000
BL31_LIMIT = 0x0403FFFF
BL32_BASE = 0x04040000
BL32_LIMIT = 0x0407FFFF
SHMEM_BASE = 0x04080000
SHMEM_LIMIT = 0x040FFFFF
12.3.3 安全内存配置方法
硬件寄存器配置
通过TZASC/TZMA控制器设置安全属性:
void configure_tzasc(void)
{// 设置region 0为安全区域mmio_write_32(TZASC_REGION_0_BASE, SECURE_REGION_BASE);mmio_write_32(TZASC_REGION_0_TOP, SECURE_REGION_END);mmio_write_32(TZASC_REGION_0_ATTR, TZASC_REGION_SECURE);
}
MMU页表配置
在TF-A的启动阶段设置内存属性:
void bl31_plat_arch_setup(void)
{mmap_add_region(BL31_BASE, BL31_BASE,BL31_LIMIT - BL31_BASE,MT_MEMORY | MT_RW | MT_SECURE);mmap_add_region(BL32_BASE, BL32_BASE,BL32_LIMIT - BL32_BASE,MT_MEMORY | MT_RW | MT_SECURE);
}
动态内存分配
使用TF-A提供的安全内存池:
void *secure_malloc(size_t size)
{return pool_alloc(&secure_pool, size);
}void secure_free(void *ptr)
{pool_free(&secure_pool, ptr);
}
12.3.4 安全与非安全世界共享内存
实现安全世界与非安全世界的通信需要特殊设计:
- 静态共享内存区域:
/* 在设备树中定义共享内存节点 */
reserved-memory {#address-cells = <2>;#size-cells = <2>;ranges;shmem: secure-shmem@50000000 {compatible = "arm,secure-shmem";reg = <0x0 0x50000000 0x0 0x100000>;no-map;};
};
- 动态缓冲区管理:
int register_shared_buffer(uintptr_t phys_addr, size_t size)
{return tsp_register_shared_memory(phys_addr, size);
}
- 访问控制策略:
- 设置NS=0的安全属性但标记为"Secure Accessible"
- 配置适当的MPU/MMU权限(RO/RW)
- 实现边界检查机制
12.3.5 安全内存保护最佳实践
-
深度防御策略:
- 硬件防火墙配置
- MMU二级保护
- 运行时访问检查
-
内存清零策略:
void secure_wipe(void *addr, size_t len)
{volatile uint8_t *p = (uint8_t *)addr;while (len--) {*p++ = 0;__asm__ volatile("dsb sy" ::: "memory");}
}
-
内存完整性保护:
- ECC内存保护
- 内存加密引擎使用
- 定期内存校验和检查
-
调试安全:
- 禁用安全内存的调试接口
- 实现安全内存的篡改检测
- 关键数据使用瞬态存储
12.3.6 平台特定实现案例
案例1:Cortex-A76平台配置
void plat_arm_security_setup(void)
{/* 配置TZPC */arm_configure_tzpc();/* 设置DDR安全区域 */tzc400_configure_region(0, 0x80000000, 0x10000000,TZC_REGION_S_RDWR, 0);/* 启用防火墙 */tzc400_set_action(TZC_ACTION_ERR);
}
案例2:动态测量扩展(DME)
void dme_measure_memory(uintptr_t base, size_t size)
{struct tpm_extend_cmd cmd = {.pcr_index = PCR_MEMORY,.digest = sha256_calculate(base, size)};tpm_extend(&cmd);
}
12.3.7 常见问题排查
-
安全违规错误:
- 现象:触发"Secure Fault"异常
- 排查步骤:
- 检查TZASC/TZMA配置
- 验证MMU页表属性
- 检查NS位的运行时状态
-
内存共享失败:
- 确保共享区域已正确标记为"Secure Accessible"
- 验证两个世界的物理地址映射一致
- 检查防火墙规则是否过于严格
-
性能问题:
- 使用
PMU
计数器分析内存访问延迟 - 检查TLB未命中率
- 评估安全检查带来的开销
- 使用
12.3.8 未来演进方向
-
ARMv9机密计算扩展:
- Realm Management Extension (RME) 引入更多内存状态
- Granule Protection Table (GPT) 实现更细粒度保护
-
物理内存加密:
- 使用ARM的PMSA(Physical Memory Encryption)
- 集成HUK(Hardware Unique Key)加密方案
-
动态安全内存:
- 基于运行时策略的内存区域调整
- 安全内存的热迁移支持