目錄
- 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