引导加载程序是供应商专有的映像,负责在设备上启动内核。引导加载程序会监护设备状态,负责初始化可信执行环境 (TEE) 以及绑定其信任根。引导加载程序还会在将执行工作移到内核之前先验证 boot
和 recovery
分区的完整性。
引导加载程序流程示例
下面是引导加载程序流程的示例:
加载并初始化内存。
根据启动时验证流程验证设备。
根据启动时验证流程验证启动分区,包括
boot
、dtbo
、init_boot
和recovery
。在执行此步骤的过程中,请检查启动映像头文件版本,并相应地解析该头文件。如果使用 A/B 更新,则确定要启动的当前槽位。
确定是否应启动恢复模式。如需了解详情,请参阅支持 OTA 更新。
加载启动映像,例如
boot.img
、vendor_boot.img
、init_boot.img
及其他专有供应商启动映像。这些启动映像包含内核和 ramdisk 映像。将内核作为可自行执行的压缩二进制文件加载到内存中。内核将自身解压缩并开始执行到内存中。
将 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 而非内核命令行。