4. 启动流程第二阶段 (BL2)

好,咱们接着往下走。上一阶段我们把BL1塞进了SRAM,它完成了最基础的初始化。现在,BL1要干一件关键的事——把BL2从Flash里搬到SRAM上。

为什么是SRAM?因为这时候DDR还没初始化呢。SRAM是片上内存,上电就能用,但容量小得可怜。BL2的镜像通常也就几十到几百KB,刚好塞得下。

加载BL2镜像到SRAM

BL1从Flash的固定偏移地址读取BL2镜像。这个偏移量是芯片设计时就定死的,写在ROM里。我见过不少团队在项目初期改过这个偏移量,结果BL1和BL2的地址对不上,启动直接挂掉。嗯,这种坑踩一次就记住了。

加载过程其实不复杂:

  • BL1通过SPI或QSPI接口读取Flash
  • 将数据搬运到SRAM的指定地址
  • 校验镜像的完整性(通常是SHA256或RSA签名验证)
  • 跳转到BL2的入口地址

这里有个细节:签名验证必须在BL1里完成。因为BL1是信任根,它之后的所有镜像都要经过它验证。如果BL1不验BL2的签名,那整个信任链就断了。

核心原则:信任链的每一环都要验证下一环的完整性。BL1验证BL2,BL2验证TEE内核,环环相扣。

BL2的职责:外设初始化

BL2进到SRAM后,第一件事是初始化外设。说白了,就是让芯片的各个模块能正常工作。

我个人习惯把外设初始化分成两类:

  • 必要外设:时钟、电源管理、中断控制器、定时器。这些不初始化,系统根本跑不起来。
  • 功能外设:UART、GPIO、I2C、SPI等。这些看具体需求,但UART我建议一定要开——调试的时候你就知道有多重要了。

我在项目中遇到过一个问题:某款芯片的UART初始化顺序和文档写的不一样。文档说先配时钟再配引脚,但实际上得先拉高引脚电平再配时钟。折腾了两天才找到原因。所以啊,别完全相信文档,实测才是真理。

DDR训练:最磨人的一步

DDR训练,说白了就是让CPU和DDR内存条“对上话”。DDR的时序参数非常敏感,电压、温度、PCB走线长度都会影响。训练的目的就是找到最优的时序配置。

这个过程通常包括:

  1. 写电平校准:确保CPU写数据时,DDR能正确采样
  2. 读数据眼图训练:调整读数据的采样点,找到眼图张开最大的位置
  3. ZQ校准:调整输出驱动强度,匹配PCB阻抗

你想想看,DDR跑在1600MHz甚至更高频率,一个时钟周期才0.6纳秒。信号在PCB上走1英寸就要花0.15纳秒。稍微有点偏差,数据就全乱了。

避坑指南:我曾经在DDR训练上栽过跟头。某次项目,DDR训练在常温下没问题,但一进高低温箱就失败。后来发现是温度补偿参数没配好。建议大家在开发阶段就把高低温测试跑一遍,别等到量产才发现问题。

从Flash加载TEE内核镜像

DDR初始化完成后,BL2就有大内存可用了。这时候它要从Flash里把TEE内核镜像搬到DDR中。

加载流程大致如下:

  • BL2读取Flash中的TEE镜像分区
  • 验证镜像签名(使用BL1传递过来的公钥或证书链)
  • 解密镜像(如果镜像做了加密存储)
  • 将镜像解压到DDR的指定地址
  • 配置MMU和页表,为TEE内核准备好运行环境
  • 跳转到TEE内核入口

这里有个容易忽略的点:镜像的加载地址必须和链接地址一致。如果TEE内核编译时链接地址是0x80000000,但你把它加载到0x80001000,那肯定跑不起来。我见过有人把DDR地址算错了,结果TEE内核一启动就触发异常,查了两天才发现是地址偏移了4KB。

注意:TEE镜像的加载地址、链接地址、DDR的起始地址,这三者必须对齐。建议在项目初期就把内存布局图画清楚,贴在工位上。

知识体系总览

下面这张图把BL2阶段的核心流程串起来了。你可以看到,从BL1到BL2,再到TEE内核,每一步都有验证和初始化工作。

BL2阶段启动流程 BL1 (ROM) 加载BL2到SRAM 验证签名 BL2 (SRAM) 外设初始化 + DDR训练 验证+解密 TEE内核 DDR中运行 详细步骤分解 ① 加载BL2到SRAM 从Flash读取,校验完整性 ② 外设初始化 时钟、UART、中断控制器等 ③ DDR训练 写电平、读眼图、ZQ校准 ④ 加载TEE内核 验证→解密→解压→跳转 关键点提醒 • 信任链:BL1→BL2→TEE • 签名验证不可跳过 • DDR训练需覆盖高低温 • 加载地址必须对齐链接地址 • 实测优先于文档

总结一下

BL2阶段是整个安全启动里最“累”的一环。它既要初始化外设,又要做DDR训练,还得加载TEE内核。每一步出错都可能导致启动失败。

我个人觉得,DDR训练是最容易出问题的。它涉及硬件参数、PCB设计、温度特性,变量太多。建议大家在项目早期就搭建好DDR训练的测试环境,把各种边界条件都跑一遍。

好了,BL2阶段就讲到这里。下一阶段,TEE内核就要正式登场了。

一句话记住:BL2是承上启下的关键环节,它把系统从“最小可用”状态推进到“完整可用”状态。

可可精品资料库