3. BootROM与引导加载程序

Android 设备从上电到内核启动,并不是一条“直接跳转”的路径,而是一条由多级引导程序接力完成的信任链与初始化链。每一级引导程序都只完成有限职责:初始化最关键的硬件、验证下一级镜像、传递启动参数,最终把控制权交给 Linux 内核。理解这条链路,是排查“卡在开机 Logo”“反复重启”“进入 Fastboot 但无法启动系统”等问题的前提。

核心结论:BootROM 是芯片内固化的第一段代码,SPL 负责最小化 DDR 初始化,U-Boot/LK/ABL 负责更完整的平台初始化与镜像加载,最终由它们引导 boot.img 中的内核与 ramdisk。

一、引导链的整体结构与信任关系

典型 Android 设备的启动链可以抽象为:BootROM → SPL(或 Preloader)→ 主引导程序(U-Boot / LK / ABL)→ boot.img(kernel + ramdisk)→ init。不同芯片平台命名不同,但职责分层基本一致。BootROM 位于 SoC 内部,不可修改;SPL 通常位于 eMMC/UFS 的固定分区;主引导程序则可能支持 Fastboot、Recovery、AVB 校验等高级功能。

Android 引导链:从 BootROM 到 init BootROM SoC 固化代码 加载 SPL / 校验签名 SPL / Preloader DDR 初始化 加载主引导程序 U-Boot / LK / ABL 平台初始化、Fastboot AVB 校验、加载 boot.img boot.img kernel + ramdisk 启动参数传递 init 用户空间 第一阶段 关键交接点 1. BootROM 只信任烧录在 OTP/eFuse 中的公钥哈希,签名不匹配则直接进入 EDL/下载模式。 2. SPL 完成 DDR 训练后,把主引导程序搬到 RAM 执行,自身通常不再返回。 常见卡点 DDR 参数错误 → 卡 SPL AVB 校验失败 → 红字警告 可干预点 Fastboot / Recovery bootloader 解锁与刷写 调试手段 串口日志 / pstore fastboot getvar all

二、各阶段功能与流程详解

BootROM 阶段:上电复位后,CPU 从芯片内部固化的 ROM 开始执行。BootROM 会读取启动模式引脚(如 eMMC、UFS、USB、SD 卡),从对应介质加载第一级引导程序。它通常只做最基础的时钟与存储控制器初始化,并验证 SPL 的签名。若验证失败,设备会进入芯片厂商的下载模式(如 Qualcomm 的 EDL、MTK 的 BROM 模式)。

SPL / Preloader 阶段:SPL 的首要任务是初始化 DDR 内存,因为后续引导程序体积较大,必须运行在 RAM 中。它还会初始化串口、PMIC 等基础外设,然后从存储中读取主引导程序并跳转执行。SPL 通常非常小,且与具体芯片和内存颗粒强相关,因此 DDR 参数错误是“卡在 SPL”的常见原因。

主引导程序阶段(U-Boot / LK / ABL):这是功能最丰富的一级。U-Boot 常见于开发板和部分手机;LK(Little Kernel)多见于高通早期平台;ABL(Android Bootloader)是高通现代平台使用的引导程序。它们负责:初始化显示、USB、按键等;实现 Fastboot 协议;执行 AVB 校验;根据分区表加载 boot.img、dtbo、vendor_boot 等镜像;向内核传递 cmdline、设备树等参数。

内核与 init 阶段:主引导程序将控制权交给内核后,内核解压并挂载 ramdisk,执行其中的 init 程序。init 会解析 init.rc,挂载分区、启动服务,最终进入 Android 用户空间。至此,引导加载程序的使命结束。

三、典型平台命名与分区对照

阶段 高通平台 MTK 平台 通用/开源 主要职责
第一级 BootROM (PBL) BootROM BootROM 固化加载、签名校验
第二级 XBL (SPL) Preloader SPL DDR 初始化、加载下一级
第三级 ABL LK U-Boot Fastboot、AVB、加载 boot.img
第四级 boot.img boot.img boot.img kernel + ramdisk

四、实操:查看引导阶段日志与参数

在调试时,串口日志是最直接的观察手段。以下命令可用于查看当前引导程序版本、槽位和启动状态:

# 进入 fastboot 模式后查看引导程序信息
fastboot getvar all

# 典型输出片段
(bootloader) version-bootloader: ABL-1.2.3
(bootloader) current-slot: a
(bootloader) slot-successful:a: yes
(bootloader) unlocked: yes
(bootloader) avb-verity-mode: enforcing

若设备支持 pstore,还可以在内核启动后读取上一次引导的日志:

adb shell ls /sys/fs/pstore/
adb shell cat /sys/fs/pstore/console-ramoops-0 | head -n 50
提示:BootROM 阶段通常没有可读日志,只能通过 USB 枚举状态或芯片厂商工具判断。SPL 之后一般才有串口输出,因此“串口无输出”往往意味着问题在 BootROM 或 SPL。

五、常见误区与复盘

  • 误区一:把 BootROM 当作可刷写分区。BootROM 固化在 SoC 内部,不随系统升级变化,也不能通过 fastboot 刷写。
  • 误区二:认为解锁 bootloader 就等于关闭 AVB。解锁只是允许刷写,AVB 校验模式仍可能为 enforcing,需要额外处理 vbmeta。
  • 误区三:忽略 A/B 槽位。当前槽位启动失败时,引导程序可能自动回退到另一槽位,导致“刷了却没生效”。
  • 误区四:DDR 参数与硬件不匹配。更换内存颗粒后未更新 SPL 中的 DDR 配置,会表现为卡在 SPL 或随机重启。
排障顺序建议:先确认串口是否有 BootROM/SPL 输出,再确认主引导程序是否进入 Fastboot,最后检查 AVB 与槽位状态。不要一上来就重刷完整包,否则容易掩盖真正的失败阶段。

总结来看,BootROM、SPL、U-Boot/LK/ABL 构成了 Android 启动链的前半程。它们逐级验证、逐级初始化、逐级传递控制权,任何一级失败都会导致设备无法进入内核。掌握每一级的职责边界与常见故障特征,才能在面对“卡 Logo”“无限重启”“Fastboot 异常”时快速定位问题所在。