启动加载程序概览

启动加载程序是供应商专有的映像,负责在设备上启动内核。启动加载程序会保护设备状态,并负责初始化可信执行环境 (TEE) 并绑定其信任根。启动加载程序还会先验证 bootrecovery 分区的完整性,然后再将执行移交给内核。

启动加载程序流程示例

以下是启动加载程序流程示例

  1. 加载并初始化内存。

  2. 根据Verified Boot 流程验证设备。

  3. 根据 Verified Boot 流程验证启动分区,包括 bootdtboinit_bootrecovery。在此步骤中,检查启动映像标头版本并相应地解析标头。

  4. 如果使用 A/B 更新,请确定要启动的当前槽位。

  5. 确定是否应启动恢复模式。如需了解详情,请参阅支持 OTA 更新

  6. 加载启动映像,例如 boot.imgvendor_boot.imginit_boot.img 和其他供应商专有的启动映像。这些启动映像包含内核和 ramdisk 映像。

    1. 将内核作为自解压可执行二进制文件加载到内存中。内核会自行解压并开始在内存中执行。

    2. 将 ramdisk 和 bootconfig 部分加载到内存中以创建 initramfs

其他与启动加载程序相关的功能

以下是您可以实现的其他与启动加载程序相关的功能列表

  • 设备树叠加层 (DTO)。设备树叠加层允许启动加载程序支持不同的硬件配置。DTO 会被编译成设备树 Blob (DTB),供启动加载程序使用。

  • 内核映像虚拟地址随机化。启动加载程序支持随机化加载内核映像的虚拟地址。要随机化地址,请在内核配置中将 RANDOMIZE_BASE 设置为 true。启动加载程序必须通过在 /chosen/kaslr-seed 设备树节点中传递随机 u64 值来提供熵。

  • Verified Boot。Verified Boot 允许启动加载程序确保所有执行的代码都来自可信来源。

  • Boot config。Boot config 在 Android 12 及更高版本中可用,是一种用于将配置详情从构建和启动加载程序传递到操作系统的机制。在 Android 12 之前,使用带有 androidboot 前缀的内核命令行参数。

  • 无线下载 (OTA) 更新。外场 Android 设备可以接收和安装系统、应用软件和时区规则的 OTA 更新。此功能对您的启动加载程序实现具有影响。如需 OTA 的一般信息,请参阅OTA 更新。如需启动加载程序特定的 OTA 实现详情,请参阅支持 OTA 更新

  • 版本绑定版本绑定将安全密钥绑定到操作系统和补丁程序级别版本。版本绑定可确保发现旧版本系统或 TEE 软件中存在漏洞的攻击者无法将设备回滚到易受攻击的版本,并使用使用较新版本创建的密钥。启动加载程序必须提供特定信息来支持版本绑定。如需了解详情,请参阅AVB 属性中的版本信息

内核命令行

从以下位置连接内核命令行

  • 启动加载程序命令行:由启动加载程序确定的一组静态和动态参数

  • 设备树:来自 chosen/bootargs 节点

  • defconfig:来自 CONFIG_CMDLINE

  • boot.img:来自命令行(有关偏移量和大小,请参阅system/core/mkbootimg/bootimg.h

从 Android 12 开始,对于我们需要传递到 Android 用户空间的 androidboot.* 参数,我们可以使用 bootconfig 而不是内核命令行。