Android 11では、Generic Kernel Image(GKI)の概念が導入されています。 GKIを使用して任意のデバイスを簡単に起動できるようにするために、すべてのベンダー固有の情報がブートパーティションから除外され、新しいベンダーのブートパーティションに再配置されます。 5.4Linuxカーネル上のAndroid11で起動するARM64デバイスは、GKIでのテストに合格するために、ベンダーのブートパーティションと更新されたブートパーティション形式をサポートする必要があります。
パーティション構造
ベンダーのブートパーティションは仮想A / BでA / Bされ、Android検証済みブートによって保護されます。パーティションは、ヘッダー、ベンダーのRAMディスク、およびデバイスツリーブロブ(DTB)で構成されます。
セクション | ページ数 |
---|---|
ベンダーブートヘッダー(nページ) | n = (2108 + page_size - 1) / page_size |
ベンダーのRAMディスク(oページ) | o = (vendor_ramdisk_size + page_size - 1) / page_size |
DTB(pページ) | p = (dtb_size + page_size - 1) / page_size |
ベンダーのRAMディスクとカーネルモジュールの処理の詳細については、カーネルモジュールのサポートを参照してください。
ベンダーブートヘッダー
ベンダーのブートパーティションヘッダーの内容は、主にブートイメージヘッダーからそこに再配置されたデータで構成されています。また、ベンダーのRAMディスクに関する情報も含まれています。
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 */
};
ブートローダーのサポート
ベンダーのブートパーティションには、以前はブートパーティションに存在していた情報(フラッシュページサイズ、カーネル、RAMディスクロードアドレス、DTB自体など)が含まれているため、ブートローダーは、ブートを完了するのに十分なデータを取得するために、ブートパーティションとベンダーブートパーティションの両方にアクセスする必要があります。 。
ブートローダーは、ベンダーのramdiskの直後に汎用ramdiskをメモリにロードする必要があります(CPIO、Gzip、およびlz4形式はこのタイプの連結をサポートします)。一般的なRAMディスクイメージのページを揃えたり、メモリ内のベンダーのRAMディスクの最後との間に他のスペースを導入したりしないでください。カーネルが解凍した後、連結されたファイルをinitramfs
に抽出します。これにより、ベンダーのramdiskファイル構造にオーバーレイされた汎用ramdiskであるファイル構造が生成されます。
汎用RAMディスクとベンダーRAMディスクは連結されるため、同じ形式である必要があります。 GKIブートイメージはlz4で圧縮された汎用RAMディスクを使用するため、GKIに準拠しているデバイスは、lz4で圧縮されたベンダーのRAMディスクを使用する必要があります。この構成を以下に示します。
ビルドサポート
デバイスのベンダーブートサポートを実装するには:
BOARD_BOOT_HEADER_VERSION
を3
設定します。デバイスがGKIに準拠している場合、またはlz4で圧縮された汎用RAMディスクを使用している場合は、
BOARD_RAMDISK_USE_LZ4
をtrue
設定しtrue
。ベンダーのRAMディスクに配置する必要のあるカーネルモジュールを考慮して、
BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE
をデバイスに適したサイズに設定します。AB_OTA_PARTITIONS
を更新して、vendor_boot
およびデバイス上のOTAパーティションのベンダー固有のリストを含めます。デバイスの
fstab
を、boot
パーティションではなくvendor_boot
パーティションの/first_stage_ramdisk
にコピーします。たとえば、$(LOCAL_PATH)/fstab.hardware:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)
です。