3. BootROM与引导加载程序
Android 设备从上电到内核启动,并不是一条“直接跳转”的路径,而是一条由多级引导程序接力完成的信任链与初始化链。每一级引导程序都只完成有限职责:初始化最关键的硬件、验证下一级镜像、传递启动参数,最终把控制权交给 Linux 内核。理解这条链路,是排查“卡在开机 Logo”“反复重启”“进入 Fastboot 但无法启动系统”等问题的前提。
一、引导链的整体结构与信任关系
典型 Android 设备的启动链可以抽象为:BootROM → SPL(或 Preloader)→ 主引导程序(U-Boot / LK / ABL)→ boot.img(kernel + ramdisk)→ init。不同芯片平台命名不同,但职责分层基本一致。BootROM 位于 SoC 内部,不可修改;SPL 通常位于 eMMC/UFS 的固定分区;主引导程序则可能支持 Fastboot、Recovery、AVB 校验等高级功能。
二、各阶段功能与流程详解
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 当作可刷写分区。BootROM 固化在 SoC 内部,不随系统升级变化,也不能通过 fastboot 刷写。
- 误区二:认为解锁 bootloader 就等于关闭 AVB。解锁只是允许刷写,AVB 校验模式仍可能为 enforcing,需要额外处理 vbmeta。
- 误区三:忽略 A/B 槽位。当前槽位启动失败时,引导程序可能自动回退到另一槽位,导致“刷了却没生效”。
- 误区四:DDR 参数与硬件不匹配。更换内存颗粒后未更新 SPL 中的 DDR 配置,会表现为卡在 SPL 或随机重启。
总结来看,BootROM、SPL、U-Boot/LK/ABL 构成了 Android 启动链的前半程。它们逐级验证、逐级初始化、逐级传递控制权,任何一级失败都会导致设备无法进入内核。掌握每一级的职责边界与常见故障特征,才能在面对“卡 Logo”“无限重启”“Fastboot 异常”时快速定位问题所在。