Android 11引入了通用內核映像(GKI)的概念。為了輕鬆使用GKI引導任意設備,所有特定於供應商的信息都將從引導分區中分解出來,並重新放置到新的賣方引導分區中。在5.4 Linux內核上以Android 11啟動的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 */
};
引導加載程序支持
由於供應商引導分區包含先前存在於引導分區中的信息(例如閃存頁面大小,內核,虛擬磁盤加載地址,DTB本身),因此引導加載程序必須訪問引導分區和供應商引導分區,以獲取足夠的數據來完成引導。
引導加載程序必須在供應商ramdisk之後立即將通用ramdisk加載到內存中(CPIO,Gzip和lz4格式支持這種類型的串聯)。不要分頁對齊通用內存磁盤映像或在內存和供應商內存磁盤末尾之間引入任何其他空間。內核解壓縮後,它將連接的文件提取到initramfs
,這將導致文件結構是覆蓋在供應商ramdisk文件結構上的通用ramdisk。
由於通用ramdisk和供應商ramdisk會串聯在一起,因此它們必須採用相同的格式。 GKI引導映像使用lz4壓縮的通用ramdisk,因此符合GKI的設備必須使用lz4壓縮的供應商ramdisk。其配置如下所示。
建立支持
要實現設備的供應商啟動支持:
將
BOARD_BOOT_HEADER_VERSION
設置為3
。設置
BOARD_RAMDISK_USE_LZ4
到true
,如果你的設備是符合GKI,或者如果它以其他方式使用LZ4壓縮一般性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)
。