1. ARM TF-A设备树架构解析
1.1 设备树在启动流程中的作用机制
在ARM Trusted Firmware-A(TF-A)的启动流程中,设备树扮演着硬件抽象层的关键角色。与传统的硬编码硬件参数不同,TF-A采用模块化的设备树配置方案,使得各启动阶段(BL1/BL2/BL31等)能够动态获取平台特定的配置信息。这种设计带来了三大核心优势:
- 硬件描述与代码解耦:通过单独的.dts文件维护硬件配置,修改硬件参数时无需重新编译固件
- 多阶段配置隔离:不同启动阶段可加载专属配置,例如BL2使用TB_FW_CONFIG,BL31使用SOC_FW_CONFIG
- 安全域配置分离:安全世界(TOS_FW_CONFIG)与非安全世界(NT_FW_CONFIG)使用独立的设备树
以TC平台为例,其设备树文件组织如下:
code复制plat/arm/board/tc/fdts/
├── tc.dts # 硬件通用配置(HW_CONFIG)
├── tc_fw_config.dts # 固件共享配置(FW_CONFIG)
├── tc_tb_fw_config.dts # 可信启动配置(TB_FW_CONFIG)
└── tc_spmc_manifest.dts # 安全分区管理配置(TOS_FW_CONFIG)
1.2 六类关键配置文件详解
TF-A定义了六类标准化的设备树配置文件,每类文件通过唯一的Image ID进行标识:
| 配置文件类型 | Image ID | 使用阶段 | TC平台示例文件 | 核心功能描述 |
|---|---|---|---|---|
| FW_CONFIG | 31 | 全阶段 | tc_fw_config.dts | 定义DTB注册表、内存映射等跨阶段参数 |
| HW_CONFIG | 23 | BL2+OS | tc.dts | 描述CPU、外设等硬件拓扑信息 |
| TB_FW_CONFIG | 24 | BL1+BL2 | tc_tb_fw_config.dts | 配置可信启动参数和SP加载地址 |
| SOC_FW_CONFIG | 25 | BL31 | N/A | SoC特定固件配置(TC平台未使用) |
| TOS_FW_CONFIG | 26 | BL32 | tc_spmc_optee_sp_manifest.dts | 安全分区(SP)清单和资源分配 |
| NT_FW_CONFIG | 27 | BL33 | N/A | 非可信固件(U-Boot/kernel)配置 |
典型配置示例 - tc_fw_config.dts中的hw-config节点:
dts复制hw-config {
load-address = <0x0 0x83000000>; // 内核DTB加载地址
max-size = <0x8000>; // 最大允许尺寸32KB
id = <HW_CONFIG_ID>; // 对应Image ID 23
};
关键实践:在内存受限平台,需精确计算max-size值。建议通过
dtc -I dtb -O dts反编译DTB后,用sizeof()获取实际尺寸并预留20%余量。
1.3 平台集成实现要点
在TC平台的Makefile(platform.mk)中,设备树的编译通过以下逻辑实现:
makefile复制# 基础配置
FDT_SOURCES += ${TC_BASE}/fdts/${PLAT}_fw_config.dts \
${TC_BASE}/fdts/${PLAT}_tb_fw_co
