引导加载程序概览

引导加载程序是供应商专有的映像,负责在设备上启动内核。引导加载程序会监护设备状态,负责初始化可信执行环境 (TEE) 以及绑定其信任根。引导加载程序还会在将执行工作移到内核之前先验证 bootrecovery 分区的完整性。

引导加载程序流程示例

下面是引导加载程序流程的示例:

  1. 加载并初始化内存。

  2. 根据启动时验证流程验证设备。

  3. 根据启动时验证流程验证启动分区,包括 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 值来提供熵。

  • 启动时验证。借助启动时验证,引导加载程序可以确保所有已执行代码均来自可信来源。

  • 启动配置。 启动配置在 Android 12 及更高版本中可用,是一种将配置详细信息从 build 和引导加载程序传递至操作系统的机制。 在 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 而非内核命令行。