Google 致力于为黑人社区推动种族平等。查看具体举措

供应商启动分区

Android 11 引入了通用内核映像 (GKI) 的概念。为了能够使用 GKI 轻松启动任意设备,所有供应商专用信息都已从启动分区分离出来并转移到新的供应商启动分区中。搭载 Android 11 且运行 5.4 版 Linux 内核的 ARM64 设备必须支持供应商启动分区和更新后的启动分区格式,才能通过使用 GKI 进行的测试。

分区结构

供应商启动分区采用虚拟 A/B 分区形式的 A/B 分区结构,并受到 Android 启动时验证功能的保护。该分区由一个头文件、供应商 ramdisk 和设备树 blob (DTB) 组成。

部分 页数
供应商启动头文件(n 页) n = (2108 + page_size - 1) / page_size
供应商 ramdisk(o 页) o = (vendor_ramdisk_size + page_size - 1) / page_size
DTB(p 页) p = (dtb_size + page_size - 1) / page_size

如需详细了解供应商 ramdisk 以及如何处理内核模块,请参阅内核模块支持

供应商启动头文件

供应商启动分区头文件的内容主要由从启动映像头文件转移过来的数据组成。此外,它还包含有关供应商 ramdisk 的信息。

struct vendor_boot_img_hdr
{
#define VENDOR_BOOT_MAGIC_SIZE 8
    uint8_t magic[VENDOR_BOOT_MAGIC_SIZE];
    uint32_t header_version;
    uint32_t page_size;           /* flash page size we assume */

    uint32_t kernel_addr;         /* physical load addr */
    uint32_t ramdisk_addr;        /* physical load addr */

    uint32_t vendor_ramdisk_size; /* size in bytes */

#define VENDOR_BOOT_ARGS_SIZE 2048
    uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE];

    uint32_t tags_addr;           /* physical addr for kernel tags */

#define VENDOR_BOOT_NAME_SIZE 16
    uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
    uint32_t header_size;         /* size of vendor boot image header in
                                   * bytes */
    uint32_t dtb_size;            /* size of dtb image */
    uint64_t dtb_addr;            /* physical load address */

};

引导加载程序支持

由于供应商启动分区包含以前存在于启动分区中的信息(例如闪存页面大小、内核、ramdisk 加载地址、DTB 本身),因此引导加载程序必须访问启动和供应商启动这两个分区才能获得足以完成启动的数据。

引导加载程序必须将通用 ramdisk 紧跟在供应商 ramdisk 之后加载到内存中(CPIO、Gzip 和 lz4 格式均支持这种串联)。请勿对齐通用 ramdisk 映像的页面,也不要在内存中通用 ramdisk 映像与供应商 ramdisk 末尾之间引入任何其他空间。内核解压缩后,它会将串联的文件提取到 initramfs 中,这样做所得到的文件结构是通用 ramdisk 叠加在供应商 ramdisk 之上的文件结构。

由于通用 ramdisk 和供应商 ramdisk 已串联,它们必须具有相同的格式。GKI 启动映像使用经 lz4 压缩的通用 ramdisk,因此符合 GKI 要求的设备必须使用经 lz4 压缩的供应商 ramdisk。此配置如下所示。

构建支持

如需针对某款设备实现供应商启动支持,请执行以下操作:

  • BOARD_BOOT_HEADER_VERSION 设为 3

  • 如果您的设备符合 GKI 要求或者使用经 lz4 压缩的通用 ramdisk,请将 BOARD_RAMDISK_USE_LZ4 设为 true

  • 根据供应商 ramdisk 必须加载的内核模块,将 BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE 设为适合您设备的大小。

  • 更新 AB_OTA_PARTITIONS 以包含 vendor_boot 和设备上的 OTA 分区的任何供应商专用列表。

  • 将您的设备 fstab 复制到 vendor_boot 分区(而不是 boot 分区)的 /first_stage_ramdisk 中。例如,$(LOCAL_PATH)/fstab.hardware:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)