MT6761 TEE镜像构建全解析:ATF与MicroTrust编译流程详解

📅 2026/7/17 21:26:45
MT6761 TEE镜像构建全解析:ATF与MicroTrust编译流程详解
三份Makefile 文件对应解析先梳理3个对应关系atf_teeid.img_intermediates/ATF/bin/ →build_atf_image.mk 编译BL31 ATF中间产物microtrust_teeid.img_intermediates/MICROTRUST/bin/ →microtrust_config.mk 编译BL32 MicroTrust中间产物tee_teeid.img_intermediates/ →build_tee_image.mk 最终合并输出tee.img平台信息MT6761(项目k61v1硬件内核MT8766)、my_secure_osteeid、TARGET_BUILD_VARIANTeng(debug版本)一、ATF编译产物BL31对应build_atf_image.mk路径obj/ETC/atf_teeid.img_intermediates/ATF/bin/逐个文件和Makefile规则一一绑定1.img_hdr_atf.cfg对应Makefile规则$(ATF_TEMP_CFG_FILE) echo LOAD_MODE 0 $ echo NAME atf $ echo LOAD_ADDR 0xFFFFFFFF $作用mkimage工具的配置脚本mtk_mkimage_tool读取这个cfg在镜像头部生成MTK GFH固件头GFH内部字段镜像名称atf、加载模式、默认加载地址。2.sram_atf.img对应Makefile$(ATF_SRAM_IMAGE_NAME)源码编译输出原始bl31.bin执行dd截取前半段SRAM运行部分DRAM_EXTENSION_SUPPORTyesATF拆分为SRAM段 DRAM段sram_atf.img BL31 SRAM原始裸二进制无对齐、无签名、无GFH头3.mt6761_atf_debug_pad.txt对应 $(ATF_TEMP_PADDING_FILE)shell脚本生成的全0填充文件逻辑回顾Makefile计算【镜像长度 GFH头大小 RSA签名尾部长度】对4KB取余不足4KB对齐的字节生成一段zero填充文件后缀.txt只是ALPS命名习惯实质是二进制空数据。4.mt6761_atf_debug_pad.img对应$(ATF_PADDING_IMAGE_NAME) cat sram_atf.img pad.txt xxx_pad.img原始ATF二进制 零填充文件完成4KB对齐仍然没有RSA签名、没有GFH头。5.mt6761_atf_debug_signed.img对应 $(ATF_SIGNED_IMAGE_NAME)执行 TRUSTZONE_SIGN_TOOL(sign-image_v2) 输出产物输入mt6761_atf_debug_pad.img动作使用OEM私钥进行RSA-OAEP签名签名数据追加到文件末尾产物状态4KB对齐已经携带RSA签名 还没有GFH头部6.mkimg_sram_atf.img对应$(ATF_SRAM_MKIMAGE_NAME) mtk_mkimage $ img_hdr_atf.cfg mkimg_sram_atf.img工具行为在已经签名的signed.img最前端插入GFH头部此时文件完整结构[GFH头][原始ATF SRAM二进制][0填充][RSA签名尾部]7.mt6761_atf.img对应 ATF_COMP_IMAGE_NAME atf_teeid.img当前项目DRAM_EXTENSION_SUPPORT开启但截图内没有dram相关镜像原因eng调试配置下DRAM段暂时未启用最终成品直接使用sram完整镜像作为mt6761_atf.img这个文件就是BL31 ATF完整成品镜像带GFH头RSA签名后续供给build_tee_image.mk作为输入之一。再次证明了MTK使用的ATF是在ARM基础之上MTK自己架构二、MicroTrust编译产物BL32microtrust_config.mk路径obj/ETC/microtrust_teeid.img_intermediates/MICROTRUST/bin/由于tee os是闭源没法查看对应编译过程的.o文件一一对应Makefile规则1.img_hdr_microtrust.cfg对应echo LOAD_MODE 0 $ echo NAME tee $ echo LOAD_ADDR $(my_dram_size) $关键点NAME tee区分ATF的NAMEatfGFH头标记镜像类型为TEE同时写入TEE在DRAM中的专属加载地址。2.mt6761_microtrust_release_raw.img对应 MICROTRUST_RAW_IMAGE_NAME原始来源闭源二进制 teei.raw 所有编译完成的TA可信应用链接打包状态TEE内核内置TA完整二进制 无对齐 无签名 无GFH3.mt6761_microtrust_release_pad.txt零字节填充文件满足4KB对齐约束和ATF流程逻辑完全一致。4.mt6761_microtrust_release_pad.imgcat raw.img pad.txt原始TEE镜像0填充完成4KB对齐依旧未签名。5.mt6761_microtrust_release_signed.imgsign-image_v2签名输出输入pad对齐镜像尾部追加OEM RSA签名。状态对齐 携带RSA签名 缺少GFH固件头。6. mt6761_microtrust.img对应 MICROTRUST_COMP_IMAGE_NAME执行mtk_mkimage在signed.img头部插入GFH头最终BL32成品镜像[GFH头][TEE内核TA][零填充][RSA签名]三、最终tee.img合并输出build_tee_image.mk路径obj/ETC/tee_teeid.img_intermediates/build_tee_image.mk核心规则$(BUILT_TRUSTZONE_TARGET_$(my_secure_os)): $(ATF_COMP_IMAGE_NAME) $(MICROTRUST_COMP_IMAGE_NAME) cat $^ $1.combined.img二进制直接拼接产物拼接顺序mt6761_atf.imgBL31 ATF完整镜像 mt6761_microtrust.imgBL32 TEE完整镜像计算大小131KB 1945KB 2076KB截图显示2075KB少量对齐空隙差异完全吻合。2.tee_teeid.imgAndroid构建系统BUILD_PREBUILT产生的硬链接/复制副本内容和combined.img 100%完全一致对外输出名称 tee_teeid.img整机固件打包脚本会提取此文件命名为tee.img烧录进分区tee_a/tee_b。四、完整编译数据流【阶段1 build_atf_image.mk】 TF-A源码编译 → bl31.bin → dd截取 → sram_atf.img(raw BL31) ↓ 追加zero填充 → mt6761_atf_debug_pad.img4KB对齐 ↓ sign-image_v2 RSA签名 → mt6761_atf_debug_signed.img带签名无GFH ↓ mtk_mkimage img_hdr_atf.cfg 插入GFH头 ↓ mt6761_atf.img 【BL31 成品镜像】 【阶段2 microtrust_config.mk】 闭源teei.raw 编译全部TA → mt6761_microtrust_release_raw.img(raw BL32) ↓ zero填充对齐 → pad.img ↓ RSA签名 → signed.img ↓ mtk_mkimage img_hdr_microtrust.cfg 插入GFH头 ↓ mt6761_microtrust.img 【BL32 成品镜像】 【阶段3 build_tee_image.mk】 cat mt6761_atf.img mt6761_microtrust.img → combined.img ↓ 复制生成 tee_teeid.img ↓ 固件打包 → tee.img烧录tee分区五、最终tee.img二进制布局tee.img tee_teeid.img combined.img ┌─────────────────────────────────────────────────┐ │ mt6761_atf.img (BL31 ATF) │ │ ├─ GFH头NAMEatf,来自img_hdr_atf.cfg │ │ ├─ sram_atf.img 原始BL31二进制 │ │ ├─ 0x00零填充对齐区域 │ │ └─ RSA 2048签名尾部 │ ├─────────────────────────────────────────────────┤ │ mt6761_microtrust.img (BL32 MicroTrust TEE) │ │ ├─ GFH头NAMEtee,来自img_hdr_microtrust.cfg │ │ ├─ teei.raw 所有内置TA二进制 │ │ ├─ 0x00零填充对齐区域 │ │ └─ RSA 2048签名尾部 │ └─────────────────────────────────────────────────┘关键特性BL31、BL32各自独立拥有一套GFH头部 独立RSA签名Preloader加载整块tee.img的时候会先校验整块镜像完整性ATF启动运行之后内部还会再次分别校验BL31、BL32各自独立签名双层安全校验。