目录
- 1. TrustZone基础概念
- 2. 世界切换机制
- 3. SMC调用实现
- 4. 实战练习

1. TrustZone基础概念
1.1 安全扩展架构
@startuml
rectangle "非安全世界(Non-secure)" as NS
rectangle "安全世界(Secure)" as SNS -[hidden]-> S
note right: 通过硬件隔离的并行执行环境
@enduml
1.2 关键组件
- SCR_EL3:安全配置寄存器(Secure Configuration Register)
- SMC:安全监控调用(Secure Monitor Call)指令
- TZASC:TrustZone地址空间控制器
2. 世界切换机制
2.1 状态切换流程
// 非安全世界触发切换
smc #0 // 产生异常,EL3接管// EL3处理程序示例
monitor_handler:mrs x0, scr_el3orr x0, x0, #(1 << 0) // 设置NS位msr scr_el3, x0eret
2.2 关键寄存器配置
寄存器 | 位域 | 功能描述 |
---|
SCR_EL3.NS | Bit 0 | 当前执行世界(0=安全,1=非安全) |
SCR_EL3.SMD | Bit 7 | 禁用SMC调用(调试用) |
DAIF | - | 中断屏蔽状态保存 |
3. SMC调用实现
3.1 调用规范
struct smc_args {uint64_t x0; uint64_t x1-x6; uint64_t x7;
};
3.2 完整调用流程
- 非安全世界准备参数并执行
SMC
指令 - 触发异常进入EL3
- 根据功能ID路由到安全世界服务
- 结果通过x0-x3返回
@startuml
participant NW as 非安全世界
participant EL3
participant SW as 安全世界NW -> EL3: SMC指令
EL3 -> SW: 参数验证+路由
SW --> EL3: 处理结果
EL3 --> NW: 返回结果
@enduml
4. 实战练习
4.1 实验:实现双世界通信
# 编译安全世界代码
secure.bin: secure.Saarch64-linux-gnu-gcc -mcpu=cortex-a72 -nostdlib -Tsecure.lds $< -o $@# 编译非安全世界代码
nonsecure.elf: nonsecure.caarch64-linux-gnu-gcc -O0 -g $< -o $@
4.2 调试技巧
# QEMU调试命令
(qemu) info registers scr_el3
(qemu) xp/1x 0x8000FF00 # 查看安全内存区域# GDB断点设置
(gdb) b *0x80010000 if $x0 == 0x1234