在 Android/Linux 嵌入式系统中,从“按下电源键”到“Bootloader 开始执行”之间,还有一段由硬件固化和芯片厂商写死的底层启动流程。这段流程通常被称为 BootROM (或 PBL - Primary Boot Loader) 阶段。

⚡️ 完整的冷启动链路(Cold Boot Chain)

1. 电源上电与 PMIC 初始化 (Hardware Level)

  • 触发源:按下 Power Key、插入充电器、RTC 闹钟或看门狗复位。

  • PMIC 工作:电源管理芯片(PMIC)首先被唤醒,它负责按严格的时序给 SoC 的各个模块上电(Core → Memory → Peripheral)。

  • 时钟稳定:等待晶体振荡器(Crystal Oscillator)和 PLL 锁相环输出稳定的时钟信号。

  • CPU 复位释放:当电压和时钟都稳定后,PMIC 向 SoC 发出 RESET_N 信号解除复位,CPU 开始取指执行。

2. BootROM / PBL (Silicon Level) —— 真正的“第一行代码”

  • 存储位置:固化在 SoC 内部的 Mask ROM 中,出厂后不可修改。

  • 核心职责

    • 最小化硬件初始化:仅初始化 SRAM、UART(调试串口)、eMMC/UFS 控制器或 SPI Flash 控制器。

    • 安全根信任 (Root of Trust):读取 eFuse 中的公钥哈希,验证下一级 Bootloader(SPL/ABL)的数字签名。这是 Secure Boot 链的起点

    • 加载下一级镜像:从预定义的存储介质(如 eMMC 的 boot partition)将 SPL/X-Loader 加载到内部 SRAM 中。

    • Fallback 机制:如果校验失败或找不到有效镜像,自动进入 USB Download Mode / EDL Mode,等待主机端工具(如 QFIL, fastboot)刷机救砖。

  • 关键点:BootROM 的代码是芯片厂商(Qualcomm/MediaTek/Samsung)写的,手机厂商无法修改。

3. SPL / X-Loader / TPL (Early Bootloader Stage)

  • 为什么需要这一层? 因为 BootROM 只能访问有限的 SRAM(通常几百 KB),而完整的 U-Boot/ABL 有数 MB,且需要 DDR 内存才能运行。SPL 的作用就是初始化 DDR

  • 核心职责

    • 初始化 DDR PHY 和控制器(训练 Timing 参数)。

    • 初始化必要的总线(如 PCIe, USB 3.0)。

    • 将完整的 Bootloader(U-Boot/ABL)从 eMMC/UFS 加载到 DDR 中。

    • 继续验证下一级镜像的签名(Secure Boot Chain 的第二环)。

  • 存储位置:通常位于 eMMC/UFS 的专用 Boot Partition 或独立的 NOR Flash 中。

4. 完整 Bootloader (U-Boot / ABL / LK)

  • 这才是我们通常所说的 "Bootloader"

  • 核心职责

    • 设备树 (DTB) 加载:根据板型 ID 选择正确的 DTB。

    • 内核参数传递:组装 bootargs(如 androidboot.hardware=xxx, init=/init)。

    • AVB/dm-verity 验证:验证 Kernel 和 Vendor Boot 镜像的完整性。

    • 显示 Logo:初始化 Display Controller,显示开机 Logo。

    • 模式判断:检查按键组合,决定进入 Normal Boot、Recovery、Fastboot 还是 Charge Only 模式。

    • 跳转 Kernel:关闭缓存/MMU,跳转到 Kernel 入口地址。

  • 平台差异

    • Qualcomm: 使用 ABL (Android Boot Loader),基于 EDK2/UEFI 框架。

    • MediaTek: 使用 LK (Little Kernel) 或其自研的 Preloader + LK 两阶段。

    • Rockchip/Allwinner: 传统 U-Boot

💡 总结

电源上电 → PMIC 时序上电 → BootROM (PBL) → SPL/X-Loader (DDR Init) → U-Boot/ABL → Linux Kernel → init → Zygote

所以严格来说:

  • 最初始的启动点 = 电源上电(硬件物理事件)

  • 第一条执行的指令 = BootROM 中的固化代码

  • 我们常说的 Bootloader = 启动链中的第 3~4 环,而非第一环

理解这个分层结构,对于分析变砖救机、Secure Boot 漏洞、启动速度优化、OTA 更新等问题至关重要。

文章作者: 嘿手大叔
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 i·Space
学习记录 Android Linux
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝