OP-TEE启动流程深度解析:从BL2到Secure World的七步跃迁
1. 项目概述为什么OPTEE启动流程值得深挖到第二篇OPTEE启动流程不是一条平滑的直线而是一条布满状态切换、权限跃迁和安全边界校验的崎岖山路。我第一次完整跟踪从上电复位到optee_os进入main函数的过程时在U-Boot阶段卡了整整三天——不是因为代码看不懂而是因为调试信息全被屏蔽在Secure World里串口只吐出几行“D/TC: OP-TEE version 3.20.0”就再无下文。后来才明白所谓“启动流程二”本质上是在说当第一篇讲完BL2如何把OP-TEE镜像加载进内存后真正棘手的问题才刚刚开始——Secure Monitor如何接管异常向量EL3运行时如何在Normal World和Secure World之间做上下文切换ATFARM Trusted Firmware和OP-TEE OS之间那层薄如蝉翼又坚不可摧的接口协议到底靠什么维持不崩溃这些都不是文档里一句“调用smc指令”就能带过的。如果你正在Ubuntu 22.04环境下搭建OP-TEE开发环境用的是主流的QEMU虚拟平台或真实STM32MP157开发板那么你大概率已经跑通了make run看到终端里跳出optee_example_hello_world的输出。但只要你想改一行ATF的SVC处理逻辑或者想把OP-TEE的log级别从INFO提到DEBUG就会立刻撞上一堵墙串口日志断在bl31_entrypoint之后GDB连不上Secure World甚至readelf -l optee_os.elf都看不出哪个段被映射到了Secure RAM区域。这正是本篇要拆解的核心——不是教你怎么编译而是带你亲手拨开启动链中那段最不透明的“黑盒过渡区”。它适合三类人一是刚从Linux内核驱动开发转来做可信执行环境的工程师对MMU、异常向量表、banked寄存器有基础但没实战过安全世界切换二是高校做TEE方向毕设的学生手头只有STM32MP157A-DK2开发板和一份残缺的ST官方BSP包需要知道哪些配置项动不得、哪些日志开关必须打开三是嵌入式系统架构师正在评估OP-TEE是否能承载自研的安全密钥管理模块必须确认从U-Boot跳转到OP-TEE的整个过程是否存在时间不可控的延迟抖动。这篇笔记不讲理论推导只记录我在QEMUVersal平台和STM32MP157两套环境里用逻辑分析仪抓取reset信号、用JTAG单步跟踪EL3入口、修改ATF汇编代码强制dump寄存器值的真实操作路径。2. 启动链全景图与关键决策点解析2.1 四级启动链的物理分工与信任锚定OP-TEE的启动从来不是OP-TEE自己在启动而是整个ARMv8-A平台四级启动链协同完成的一次精密交棒。很多人误以为BL2加载完OP-TEE镜像就万事大吉其实此时OP-TEE连自己的栈都没初始化好。真正的启动链是这样的ROM Code固化在芯片内部这是整个信任根Root of Trust。它只做三件事校验下一阶段BL1签名通常用ECDSA-P256、将BL1拷贝到SRAM并跳转、锁定某些安全寄存器防止后续篡改。它的代码不可见、不可改是硬件厂商的黑盒。你在STM32MP157数据手册第12章看到的“BootROM behavior”就是它。BL1ARM Trusted Firmware第一阶段开源可读位于ATF源码plat/st/stm32mp1/bl1目录。它负责初始化极简的时钟、DDR控制器仅够加载BL2然后验证并加载BL2。关键点在于BL1运行在EL3但它不处理任何Secure World逻辑纯粹是个“安全搬运工”。BL2第二阶段Bootloader这才是启动流程一的主角。它完成完整的DDR初始化、时钟树配置、电源管理单元PMU设置并从eMMC或SPI Flash读取BL31ATF、BL32OP-TEE OS、BL33U-Boot三个镜像。注意BL2本身不跳转到任何镜像它只是把它们按地址布局好然后调用bl31_entrypoint把控制权交给ATF。BL31ARM Trusted Firmware运行时服务这就是“启动流程二”真正的核心。它常驻EL3是整个Secure World的监护人。它不直接运行OP-TEE而是为OP-TEE提供SMCSecure Monitor Call调用的入口、管理Secure Monitor的异常向量表、处理FIQ中断转发、维护Secure/Non-Secure内存视图通过TTBR1_EL3和TTBR0_EL3切换页表。你可以把它理解成一个微型的、只服务于安全世界的Hypervisor。提示很多初学者混淆BL31和OP-TEE OS的关系。记住一个铁律BL31永远不执行OP-TEE的C代码它只提供“舞台”和“导演”OP-TEE OS才是那个在Secure World舞台上表演的“演员”。所有smc #0指令最终都由BL31的smc_handler64函数拦截并分发。2.2 为什么选择ATF作为BL31对比其他方案的硬伤市面上存在多种EL3运行时实现ARM官方ATF、Linaro的TF-AATF的演进版、甚至有些厂商自研的Secure Monitor。我们团队在2022年做过横向对比测试最终锁定ATF 2.8版本对应OP-TEE 3.20原因很实际内存布局兼容性ATF定义了一套严格的内存分区规范plat/common/plat_common_def.h里的PLAT_ARM_TRUSTED_ROM_BASE等宏OP-TEE OS的链接脚本core/arch/arm/plat-stm32mp1/link.mk严格遵循这套规范。比如Secure SRAM起始地址必须是0x30000000大小固定为512KB这个值在ATF和OP-TEE两边必须完全一致否则BL31跳转时会触发SError异常。我们试过用某国产芯片的私有Secure Monitor结果因SRAM基址差了4KBOP-TEE的.data段直接覆盖了ATF的异常向量表系统在smc指令处硬重启。SMC调用协议标准化ATF实现了ARM SMC Calling ConventionDEN0028A定义了SMC_FAST_CALL和SMC_STD_CALL两种调用类型以及SIP_SVC、OPTEE_SVC等服务ID命名空间。OP-TEE OS的core/arch/arm/kernel/thread.c里所有smc调用都基于此协议。如果换用非标准SMC实现光是重写thread_smc_handler这一函数就要花掉一周时间调试寄存器保存/恢复逻辑。调试支持成熟度ATF内置LOG_LEVEL宏和console_printf配合QEMU的-d int,cpu_reset参数能清晰看到从bl31_entrypoint到plat_setup_pie再到el3_entrypoint的每一步。而某款商用Secure Monitor只提供二进制库调试时只能靠猜测寄存器值效率极低。注意Ubuntu 22.04的apt install optee-tools安装的是用户态工具链和启动流程无关。真正影响启动的是你编译ATF时传入的PLATstm32mp1和CROSS_COMPILEaarch64-linux-gnu-这两个变量。一旦交叉编译器路径错了生成的BL31.bin会因指令集不匹配在eret指令处崩溃现象是串口彻底静默。2.3 STM32MP157与QEMU启动路径的关键差异点虽然都走ATFOP-TEE路线但STM32MP157真实硬件和QEMU虚拟平台在启动细节上差异巨大这些差异恰恰是调试失败的高发区差异维度STM32MP157真实硬件QEMU Versal平台Reset向量位置BootROM硬编码跳转到0x00000000该地址映射到FSPI Flash的前4KBQEMU模拟ROM从0x00000000开始但实际BL1镜像需通过-bios参数指定Secure RAM初始化需手动在BL1中调用stm32mp1_ddr_init()初始化TZC-400内存防火墙否则OP-TEE无法访问Secure SRAMQEMU的virt机器模型默认禁用TZCSecure RAM即普通RAM无需额外配置时钟源依赖BL2必须先配置HSI高速内部时钟才能驱动FSPI控制器读取镜像若HSI校准值错误BL2会卡死在spi_flash_read循环里QEMU无真实时钟电路所有时钟初始化函数被空实现跳过即可调试接口JTAG连接ST-Link/V2需在OpenOCD配置中指定target stm32mp15x否则无法停在el3_entrypointQEMU支持-S -s参数GDB直接连接localhost:1234断点设置无阻碍我们在移植OP-TEE到新硬件时曾因忽略第一行“Reset向量位置”差异把BL1镜像烧写到eMMC的0扇区结果BootROM始终从FSPI Flash启动导致整个启动链失效。后来才发现STM32MP157的启动顺序是FSPI Flash → eMMC → SD Card且FSPI优先级最高根本不会读eMMC。3. 核心环节深度拆解从BL2跳转到OP-TEE OS的七步实操3.1 第一步BL2完成镜像加载后的内存布局快照BL2的使命在bl2_plat_handle_post_image_load函数返回时正式结束。此时内存状态必须满足严苛条件否则BL31启动即失败。我们以STM32MP157为例用readelf -l build/stm32mp1/release/bl31/bl31.elf和readelf -l out/arm-plat-stm32mp1/core/tee.elf提取关键段信息得到如下布局单位字节内存区域起始地址大小所属镜像关键属性Trusted ROM (BL1)0x00000000128KBBL1Execute-Only, SecureTrusted SRAM (BL2)0x30000000512KBBL2Read/Write, SecureBL31 (ATF)0x31000000256KBBL31Read/Write/Execute, SecureOP-TEE OS0x320000001MBBL32Read/Write/Execute, SecureU-Boot0x330000004MBBL33Read/Write/Execute, Non-Secure这个布局不是随意定的。0x32000000这个地址来自ATF的plat_stm32mp1_get_bl32_mem_params_node函数它硬编码了OP-TEE OS的加载地址。如果你在OP-TEE的conf.mk里修改了CFG_TZDRAM_START却忘了同步修改ATF的PLAT_STM32MP1_BL32_BASEBL2加载时就会把OP-TEE镜像写到错误位置BL31跳转后立即触发MMU Translation Fault。实操心得每次修改内存布局必须用hexdump -C build/stm32mp1/release/bl2/bl2.bin | head -20检查BL2镜像末尾是否包含正确的bl31_base和bl32_base地址。我们曾因Makefile中$(shell echo ...)命令未加引号导致地址字符串被截断浪费两天排查时间。3.2 第二步BL2调用bl31_entrypoint前的寄存器准备BL2跳转到BL31不是简单ldr x0, bl31_entrypoint; br x0而是一套精密的寄存器预置流程。查看plat/st/stm32mp1/platform.mk可知BL2通过arm_bl31_entrypoint函数进入BL31该函数要求以下寄存器必须就位x0: BL31镜像的物理加载地址0x31000000x1: BL32OP-TEE OS镜像的物理加载地址0x32000000x2: BL33U-Boot镜像的物理加载地址0x33000000x3: 一个指向bl31_params_t结构体的指针该结构体包含各镜像的入口地址、大小、运行时服务列表等元数据这个bl31_params_t结构体是整个启动链的“宪法”。它在BL2的load_image函数中动态构建其中image_info_t数组的image_type字段必须设为IMAGE_TYPE_BL32否则BL31会忽略OP-TEE镜像。我们曾因结构体初始化时image_info[1].image_type IMAGE_TYPE_BL33写错索引导致BL31启动后直接跳转到U-BootOP-TEE彻底消失。3.3 第三步BL31的el3_entrypoint执行流与异常向量表安装BL31的C入口函数是el3_entrypoint位于arch/aarch64/el3_entrypoint.c。它做的第一件事不是初始化硬件而是安装异常向量表。这段代码看似简单实则暗藏玄机// arch/aarch64/el3_entrypoint.c void el3_entrypoint(void) { // 1. 禁用所有中断避免在初始化过程中被打断 write_daifset(DAIFSET_ABT_BIT | DAIFSET_DBG_BIT); // 2. 设置当前异常级别为EL3确保后续操作在正确特权级 write_current_el(ARM64_EL3); // 3. 安装异常向量表 —— 关键 write_vbar_el3((uint64_t) __vectors_start); }__vectors_start指向arch/aarch64/cpu_vectors.S定义的向量表。这个表不是简单的跳转指令集合而是按异常类型分组的16字节对齐块。例如当Secure World发生同步异常如smc指令时CPU会自动跳转到__vectors_start 0x0200地址执行。而这个地址对应的汇编代码是// arch/aarch64/cpu_vectors.S vector_sync_sp0: // 保存x0-x3寄存器到栈因为smc调用会破坏它们 stp x0, x1, [sp, #-16]! stp x2, x3, [sp, #-16]! // 调用C函数处理同步异常 bl sync_exception_handler // 恢复寄存器 ldp x2, x3, [sp], #16 ldp x0, x1, [sp], #16 eret这里eret指令是整个流程的“临界点”。它会根据SPSR_EL3寄存器中的M字段Mode决定返回到哪个异常级别。如果M被错误设为0b0100EL2系统会崩溃正确值应为0b1100EL3或0b1000EL1。我们在调试时用JTAG读取SPSR_EL3发现其值为0x3c9二进制0b1111001001其中M[4:0]0b11001说明返回目标是EL1这解释了为何OP-TEE启动后无法响应U-Boot的smc调用——控制权根本没回到Secure World。3.4 第四步OP-TEE OS的_start汇编入口与栈初始化OP-TEE OS的启动入口不是C函数而是core/arch/arm/kernel/entry_aarch64.S中的_start标签。BL31通过smc指令触发SMC_OPTEE_ENTRY服务最终跳转到这里。_start做的第一件事是初始化栈_start: // 设置初始栈指针指向Secure SRAM顶部 ldr x0, CFG_TZDRAM_SIZE ldr x1, CFG_TZDRAM_START add x0, x0, x1 // x0 0x32000000 0x100000 0x32100000 mov sp, x0 // 栈顶在Secure SRAM末尾CFG_TZDRAM_SIZE定义在core/include/kernel/tz_dram.h默认为0x1000001MB。这个计算必须精确否则栈溢出会覆盖OP-TEE的.bss段。我们曾将CFG_TZDRAM_SIZE误设为0x200000导致栈指针sp指向0x32200000而该地址实际是U-Boot的代码区结果OP-TEE的printf函数一调用就覆盖U-Boot的全局变量系统随机崩溃。栈初始化后_start调用platform_setup位于core/arch/arm/plat-stm32mp1/platform.c这才是真正硬件初始化的起点。它会配置TZC-400内存防火墙将0x32000000-0x32100000标记为SecureGICv2中断控制器使能Secure Group 1中断CCI-400一致性互连确保多核Cache一致性。注意platform_setup中有一段关键代码tzmp1_security_setup()它调用stm32mp1_tzmp1_security_init()配置TrustZone控制器。如果此处配置错误OP-TEE的smc调用会触发SError而非预期的Synchronous Exception导致调试器无法捕获异常点。3.5 第五步main_init_c函数中的三大初始化支柱当汇编代码执行完bl main_init_c后C世界正式开启。core/arch/arm/kernel/init.c中的main_init_c是OP-TEE OS的“心脏起搏器”它按严格顺序执行三大初始化init_runtime()初始化ARMv8-A运行时环境。它调用init_vfp()启用VFP浮点协处理器尽管OP-TEE极少用浮点并设置CPACR_EL1寄存器允许Secure World访问协处理器。如果跳过此步后续任何使用vadd.f32等指令的代码都会触发Undefined Instruction异常。init_ta_ram()分配TATrusted Application运行时内存池。它从CFG_TA_RAM_START默认0x32100000开始划出CFG_TA_RAM_SIZE默认0x100000大小的区域。这个区域必须与前面的栈空间不重叠。计算公式为TA_RAM_START TZDRAM_START TZDRAM_SIZE - TA_RAM_SIZE。我们曾因TA_RAM_SIZE设得过大导致TA内存池与栈空间碰撞malloc返回NULLhello_world示例直接退出。init_primary_helper()启动主核Primary CPU的线程调度器。它创建第一个线程thread_core_init()该线程的入口是thread_main()最终调用tee_entry_std()处理标准SMC调用。此时OP-TEE OS才算真正“活”过来能响应U-Boot的smc请求。这三步的顺序不能颠倒。init_ta_ram()必须在init_runtime()之后因为TA内存池的分配依赖于VFP状态init_primary_helper()必须在init_ta_ram()之后因为线程堆栈需要从TA内存池中分配。3.6 第六步U-Boot发起首个SMC调用的完整握手过程U-Boot的OP-TEE支持通过drivers/tee/tee-optee.c实现。当U-Boot执行optee_probe()时会向OP-TEE发送一个OPTEE_SMC_CALLS_UID命令查询UID这是启动流程二的“成人礼”。整个握手过程如下U-Boot在EL1执行smc #0触发同步异常CPU跳转到BL31的vector_sync_sp0BL31的sync_exception_handler读取ESR_EL3寄存器解析出ISS字段确认这是SMC调用且SVC_ID 0x0OPTEE_SMC_CALLS_UIDBL31调用opteed_smc_handler位于plat/common/plat_opteed.c该函数检查调用来源是否为Non-Secure World通过GET_NS宏并验证x0-x3参数合法性opteed_smc_handler调用optee_smc_entry()将控制权移交OP-TEE OS的smc_entry()函数OP-TEE的smc_entry()解析x0中的func_id匹配到OPTEE_SMC_CALLS_UID构造返回值存入x0-x3OP-TEE执行eret返回BL31BL31再执行eret返回U-Boot。这个过程耗时约87个CPU周期QEMU实测但在真实STM32MP157上因Cache未命中和DDR延迟可能达2000周期。我们用逻辑分析仪抓取smc指令执行前后的CLK和nRESET信号确认整个过程无总线锁死。3.7 第七步启动成功验证与日志开关配置启动成功的黄金标准不是看到D/TC: OP-TEE version...而是U-Boot能成功调用optee_invoke_fn()并收到有效响应。在U-Boot shell中执行 optee invoke 0x0 0x0 0x0 0x0 OP-TEE invoked with args: 0x0 0x0 0x0 0x0 Return value: 0x0, 0x0, 0x0, 0x0如果返回值全为0说明SMC通道畅通。若返回0xffff0000则是OP-TEE未就绪若U-Boot卡死则是BL31和OP-TEE的SMC协议不匹配。要让OP-TEE打印详细日志必须在编译时开启CFG_WITH_STACK_CANARIESy启用栈保护避免日志缓冲区溢出CFG_TEE_CORE_LOG_LEVEL4设置日志级别为DEBUG0ERR, 1INFO, 4DEBUGCFG_CONSOLE_UARTy强制使用UART输出禁用CFG_CONSOLE_RPMB等加密输出。这些配置写在conf.mk中但必须确保make clean后再make all否则旧的目标文件会缓存旧配置。我们曾因忘记make clean导致CFG_TEE_CORE_LOG_LEVEL4不生效白白浪费半天看“静默启动”。4. 常见问题与硬核排查技巧实录4.1 串口日志在D/TC: OP-TEE version...后戛然而止的五大原因这是启动流程二中最常见的“假死”现象。表面看OP-TEE已启动实则卡在某个初始化环节。我们整理了真实案例中的五大原因及排查方法现象根本原因排查方法解决方案日志停在D/TC: OP-TEE version 3.20.0无后续D/TC: Initializedmain_init_c未执行完卡在init_runtime()的init_vfp()用JTAG连接停在main_init_c入口单步执行观察x0寄存器值是否为0x0VFP状态正常检查arch/arm64/cpu.c中init_vfp函数确认CPACR_EL1写入值是否为0x00f00000允许VFP访问日志停在D/TC: OP-TEE version...后出现E/TC:错误行init_ta_ram()分配失败malloc返回NULL在init_ta_ram()函数开头插入IMSG(TA RAM start: 0x%x, cfg-ta_ram_start)用JTAG读取x0值核对CFG_TA_RAM_START是否大于CFG_TZDRAM_START CFG_TZDRAM_SIZE修正conf.mk日志完全不出现仅U-Boot提示符BL31未正确跳转到OP-TEE仍在EL3空转用逻辑分析仪抓取smc指令执行时刻的IRQ和FIQ信号确认是否触发异常检查BL31的smc_handler64是否注册了OPTEE_SVC服务查看plat_opteed.c中opteed_setup函数日志出现D/TC: OP-TEE version...后立即重启eret指令触发SError因SPSR_EL3的M字段错误JTAG停在eret指令前读取SPSR_EL3检查M[4:0]是否为0b1000EL1修改arch/aarch64/el3_entrypoint.c中write_current_el(ARM64_EL3)后添加write_spsr_el3(0x3c9)硬编码修复日志显示D/TC: OP-TEE version...但U-Boot调用optee invoke超时OP-TEE的SMC入口未注册smc_entry()函数未被BL31调用在OP-TEE的smc_entry()函数首行插入__builtin_trap()用JTAG确认是否命中检查ATF的plat_opteed.c中opteed_setup是否调用register_smc_handler(OPTEE_SMC_FUNCID_CALLS_UID, ...)实操心得不要迷信串口日志。在STM32MP157上我们用ST-Link/V2的SWOSerial Wire Output功能将IMSG日志重定向到SWO引脚用逻辑分析仪解码速度比UART快10倍且不占用UART资源。4.2 Ubuntu 22.04环境下编译失败的典型陷阱Ubuntu 22.04默认使用GCC 11.3而OP-TEE 3.20要求GCC 9.3但不兼容GCC 12。我们遇到过三个致命陷阱-Werrorstringop-truncation警告升级为错误GCC 11.3默认开启此警告而OP-TEE的core/lib/libutils/isoc_stdlib.c中有strncpy调用未检查返回值。解决方案在make命令后添加CFLAGS-Wno-errorstringop-truncation。Python 3.10的distutils模块废弃OP-TEE的scripts/mkgen.py依赖distutils.versionUbuntu 22.04的Python 3.10已移除该模块。解决方案临时降级Pythonsudo apt install python3.9 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1。QEMU 6.2的-machine virt,gic-version3不兼容Ubuntu 22.04仓库的QEMU 6.2不支持GICv3而OP-TEE 3.20默认启用。解决方案从源码编译QEMU 7.2或在qemu_run.sh中将gic-version3改为gic-version2。4.3 STM32MP157开发板启动卡死的硬件级排查清单当开发板完全无反应串口无输出、LED不闪烁必须进行硬件级排查检查FSPI Flash焊接用万用表测量FSPI的CLK、IO0-IO3引脚对地电阻正常值应为10kΩ以上。若某引脚电阻为0Ω说明Flash芯片短路需返修。验证32.768kHz晶振用示波器探头接触OSC32_IN引脚应看到清晰正弦波。若无波形检查晶振负载电容12pF是否虚焊。测量VDDCORE电压STM32MP157的VDDCORE必须稳定在0.8V±5%用万用表直流档测量VDDCORE测试点。若电压低于0.75V检查PMICSTPMIC1的VDDCORE_EN引脚电平是否为高。确认BOOT_MODE引脚BOOT_MODE[1:0]必须为0b10FSPI模式用万用表测BOOT0和BOOT1引脚对地电压应分别为3.3V和0V。我们曾因BOOT1引脚虚焊导致电压为1.2VBootROM误判为SD卡模式反复尝试从SD卡启动失败耗时一天定位。4.4 U-Boot启动流程中OP-TEE相关配置的隐藏开关U-Boot的OP-TEE支持不是开箱即用需手动开启多个配置项CONFIG_TEEy启用TEE子系统框架CONFIG_OPTEEy启用OP-TEE特定驱动CONFIG_CMD_TEEy启用optee命令行命令CONFIG_ARM64_SECURE_MONITORy告知U-Boot存在Secure Monitor避免在enable_caches时误操作Secure内存。这些配置在configs/stm32mp15_basic_defconfig中但CONFIG_OPTEE默认为n。必须手动修改为y否则drivers/tee/tee-optee.c不会编译进U-Boot镜像。注意CONFIG_OPTEE开启后U-Boot会在board/st/stm32mp1/stm32mp1.c的board_init_f函数中调用optee_init()该函数会读取设备树中/firmware/optee节点。如果设备树中缺少此节点U-Boot会打印OP-TEE device tree node not found并跳过初始化。务必在设备树中添加firmware { optee { compatible linaro,optee-tz; method smc; }; };4.5 启动时间超标问题的量化分析与优化路径OP-TEE启动时间在STM32MP157上实测为327ms从上电到D/TC: Initialized超出实时系统要求的200ms。我们用ARM CoreSight追踪各阶段耗时阶段耗时(ms)优化手段预期收益BL1执行12优化DDR初始化序列跳过冗余校准-3msBL2加载镜像185启用FSPI Quad模式时钟从40MHz升至80MHz-65msBL31初始化47移除console_init()中冗余的UART波特率检测-8msOP-TEEmain_init_c83禁用CFG_WITH_USER_TA减少TA内存池扫描-22ms最终优化后启动时间降至232ms满足工业控制场景需求。关键洞察是BL2的镜像加载占总时间56%是最大瓶颈而硬件加速Quad模式带来的收益远超软件优化。5. 启动流程二的延伸思考从启动到可信应用的落地鸿沟把OP-TEE启动起来只是万里长征第一步。我们团队在交付某金融POS终端项目时发现启动成功和业务可用之间隔着三道鸿沟第一道是安全启动链完整性。客户要求从BootROM到OP-TEE OS每一级镜像都必须带RSA-2048签名且签名密钥由HSM硬件安全模块生成。这要求BL2必须集成mbedtls的RSA验签函数而默认ATF不包含此功能。我们不得不在plat/st/stm32mp1/bl2/platform_setup.c中注入验签逻辑并
上一篇/下一篇内容由系统自动关联
返回资讯列表 →