1. 启动链全景与工程地图
理解 Qualcomm Snapdragon 平台的启动过程,关键不是背下十几个镜像名字,而是建立一张“谁先运行、谁验证谁、谁把控制权交给谁”的工程地图。当设备出现黑屏、卡在高通 9008 端口、反复重启或卡在开机 Logo 时,这张地图决定了你该抓哪一段日志、该怀疑哪个镜像、该用哪种工具介入。本节先给出完整的阶段划分与镜像职责,再说明每个阶段的调试切入点。
一、启动阶段的整体划分
Snapdragon SoC 的启动是一条严格串行的信任链,前一阶段负责把后一阶段从存储或内存中取出、校验并跳转执行。按执行主体和运行环境,可划分为以下几个阶段:
- PBL(Primary Boot Loader):固化在 SoC 内部 Boot ROM 中,上电复位后最先执行。它初始化最基础的时钟与存储接口,从 eMMC/UFS 的固定分区读取 SBL,并用芯片内固化的公钥做签名校验。
- SBL(Secondary Boot Loader):运行在 SoC 内部 SRAM 上,负责初始化 DDR、配置更完整的时钟与电源,随后加载并校验 TZ(TrustZone)与 QSEE 相关镜像,再加载 ABL。
- TZ / QSEE / Hyp:安全世界与虚拟化层,先于普通世界建立,为后续 Android 提供安全执行环境与(在支持时)Hypervisor。
- ABL(Application Boot Loader,即 LK/XBL):基于 Little Kernel,负责显示开机画面、读取 bootloader 消息、进入 fastboot 或 recovery 模式,最终加载 boot 分区中的 Linux 内核与 ramdisk。
- Kernel + initramfs:Linux 内核启动,挂载根文件系统,执行 init。
- Android 用户态:init 解析 init.rc,启动 servicemanager、zygote、system_server,最终进入 Launcher。
需要特别注意的是,PBL 与 SBL 属于高通私有阶段,源码不公开,调试手段以高通工具和日志为主;从 ABL 开始才进入可修改、可编译的开源部分,这也是大多数工程问题的分界线。
二、各阶段镜像与存储位置
在典型的 UFS/eMMC 分区布局中,各镜像有相对固定的落点。PBL 不占用户可见分区,SBL 通常位于 sbl1 分区,TZ 相关镜像位于 tz、hyp、devcfg 等分区,ABL 位于 abl 分区,内核与 ramdisk 打包在 boot 分区,设备树与 dtbo 在 dtb/dtbo 分区,Android 系统在 system、vendor、product 等分区。理解这个映射关系,才能在刷机或排障时准确定位目标分区。
三、信任链与校验关系
整条链的核心是“逐级校验”。PBL 用芯片内固化的根公钥校验 SBL 的签名;SBL 校验 TZ、ABL 等后续镜像;ABL 校验 boot 分区;内核在启用 dm-verity 时校验 system/vendor 分区。任何一级校验失败,都会导致启动中止、进入 EDL 模式或触发回滚。工程上常见的“刷了非官方 boot 后无法开机”,本质就是 ABL 或 AVB 校验不通过。
因此,修改启动链中任意一环时,必须同步考虑签名与校验策略:要么使用高通签名工具重新签名,要么在开发设备上关闭 secure boot(通过 fastboot flashing unlock 与相应 fuse 配置)。这是新手最容易忽略、也最容易导致“变砖”的环节。
四、工程调试切入点
不同阶段的可观测手段差异很大,下面按阶段给出实用的排查入口:
| 阶段 | 可观测手段 | 典型故障现象 |
|---|---|---|
| PBL | 9008 EDL 端口、QFIL/QDL | 完全无反应,只能进 EDL |
| SBL | 串口 UART 日志 | DDR 初始化失败、卡在 SBL |
| TZ / QSEE | 串口日志、安全启动状态 | 校验失败后停机或重启 |
| ABL | fastboot、ABL 串口日志 | 无法进入 fastboot、boot 加载失败 |
| Kernel | dmesg、串口控制台 | kernel panic、驱动 probe 失败 |
| Android | logcat、init 日志、dumpsys | zygote 崩溃、服务反复重启 |
实际排障时,建议先判断“卡在哪一段”,再选择工具。例如设备能进 fastboot 但无法启动系统,问题基本在 boot 分区或 AVB;设备连 9008 都进不去,则要怀疑 PBL 之前的供电或 eMMC/UFS 硬件问题。
五、一个可复用的启动链检查清单
下面这份清单可直接用于日常开发与排障,按顺序逐项确认即可快速缩小问题范围:
- 设备上电后是否出现高通 9008 端口?出现则优先怀疑 PBL/SBL 阶段。
- 串口是否有 SBL 日志?无日志则检查 UART 接线与波特率(常见 115200)。
- SBL 是否报告 DDR 初始化成功?失败需检查 DDR 参数与硬件。
- TZ 校验是否通过?失败需确认镜像签名与 secure boot 状态。
- 能否进入 fastboot?不能则检查 ABL 分区与按键组合。
- fastboot 下
fastboot getvar all是否正常返回?异常则 ABL 或分区表有问题。 - 内核是否打印到 “Freeing unused kernel memory”?否则多为内核或 ramdisk 问题。
- init 是否启动 servicemanager 与 zygote?否则检查 init.rc 与 SELinux。
- logcat 是否出现 system_server 启动完成?否则定位具体服务崩溃。