Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Partisi Boot Vendor

Android 11 memperkenalkan konsep Generic Kernel Image (GKI). Untuk mengaktifkan dengan mudah boot perangkat sewenang-wenang dengan GKI, Android 11 perangkat dapat menggunakan booting header image versi 3. Pada versi 3, semua informasi vendor tertentu adalah faktor keluar dari boot partisi dan pindah ke yang baru vendor_boot partisi. Sebuah ARM64 perangkat launching dengan Android 11 pada 5,4 kernel Linux harus mendukung vendor_boot partisi dan memperbarui boot Format partisi untuk lulus pengujian dengan GKI.

Android 12 perangkat dapat menggunakan booting header image versi 4, yang mendukung termasuk beberapa ramdisks vendor di vendor_boot partisi. Beberapa fragmen ramdisk vendor digabungkan satu demi satu di bagian ramdisk vendor. Tabel ramdisk vendor digunakan untuk menjelaskan tata letak bagian ramdisk vendor dan metadata setiap fragmen ramdisk vendor.

Struktur partisi

Partisi boot vendor A/B dengan virtual A/B dan dilindungi oleh Android Verified Boot.

Versi 3

Partisi terdiri dari header, ramdisk vendor, dan device tree blob (DTB).

Bagian Jumlah halaman
Header boot vendor (n halaman) n = (2112 + page_size - 1) / page_size
Ramdisk vendor (halaman) o = (vendor_ramdisk_size + page_size - 1) / page_size
DTB (halaman) p = (dtb_size + page_size - 1) / page_size

Versi 4

Partisi terdiri dari header, bagian ramdisk vendor (terdiri dari semua fragmen ramdisk vendor, digabungkan), device tree blob (DTB), dan tabel ramdisk vendor.

Bagian Jumlah halaman
Header boot vendor (n halaman) n = (2128 + page_size - 1) / page_size
Fragmen ramdisk vendor (halaman) o = (vendor_ramdisk_size + page_size - 1) / page_size
DTB (halaman) p = (dtb_size + page_size - 1) / page_size
Tabel ramdisk vendor (halaman q) q = (vendor_ramdisk_table_size + page_size - 1) / page_size
Bootconfig (r halaman) r = (bootconfig_size + page_size - 1) / page_size

Header boot vendor

Isi header partisi penjual booting terutama terdiri dari data yang telah direlokasi ada dari sundulan boot image . Ini juga berisi informasi tentang ramdisk vendor.

Versi 3

struct vendor_boot_img_hdr_v3
{
#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 */

};

Versi 4

struct vendor_boot_img_hdr_v4
{
#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 */

    uint32_t vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk table */
    uint32_t vendor_ramdisk_table_entry_num; /* number of entries in the vendor ramdisk table */
    uint32_t vendor_ramdisk_table_entry_size; /* size in bytes for a vendor ramdisk table entry */
    uint32_t bootconfig_size; /* size in bytes for the bootconfig section */
};

#define VENDOR_RAMDISK_TYPE_NONE 0
#define VENDOR_RAMDISK_TYPE_PLATFORM 1
#define VENDOR_RAMDISK_TYPE_RECOVERY 2
#define VENDOR_RAMDISK_TYPE_DLKM 3

struct vendor_ramdisk_table_entry_v4
{
    uint32_t ramdisk_size; /* size in bytes for the ramdisk image */
    uint32_t ramdisk_offset; /* offset to the ramdisk image in vendor ramdisk section */
    uint32_t ramdisk_type; /* type of the ramdisk */
#define VENDOR_RAMDISK_NAME_SIZE 32
    uint8_t ramdisk_name[VENDOR_RAMDISK_NAME_SIZE]; /* asciiz ramdisk name */

#define VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE 16
    // Hardware identifiers describing the board, soc or platform which this
    // ramdisk is intended to be loaded on.
    uint32_t board_id[VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE];
};
  • vendor_ramdisk_size adalah ukuran total semua fragmen penjual ramdisk.
  • ramdisk_type menunjukkan jenis ramdisk, nilai yang mungkin adalah:
    • VENDOR_RAMDISK_TYPE_NONE menunjukkan nilai yang tidak ditentukan.
    • VENDOR_RAMDISK_TYPE_PLATFORM ramdisks berisi potongan platform tertentu. Bootloader harus selalu memuat ini ke dalam memori.
    • VENDOR_RAMDISK_TYPE_RECOVERY ramdisks mengandung sumber daya pemulihan. Bootloader harus memuat ini ke dalam memori saat boot ke pemulihan.
    • VENDOR_RAMDISK_TYPE_DLKM ramdisks mengandung modul kernel yang dinamis.
  • ramdisk_name adalah nama unik ramdisk.
  • board_id adalah vektor vendor didefinisikan pengenal hardware.

Dukungan bootloader

Karena partisi boot vendor berisi informasi (seperti ukuran halaman flash, kernel, alamat pemuatan ramdisk, DTB itu sendiri) yang sebelumnya ada di partisi boot, bootloader harus mengakses partisi boot dan boot vendor agar memiliki data yang cukup untuk menyelesaikan booting .

Bootloader harus memuat ramdisk generik ke dalam memori segera setelah vendor ramdisk (yang cpio, Gzip, dan format LZ4 mendukung jenis Rangkaian). Jangan menyelaraskan halaman gambar ramdisk generik atau memasukkan ruang lain antara itu dan ujung ramdisk vendor di memori. Setelah decompress kernel, itu ekstrak file bersambung menjadi initramfs , yang hasil dalam struktur file yang ramdisk overlay generik pada struktur penjual ramdisk berkas.

Karena ramdisk generik dan ramdisk vendor digabungkan, keduanya harus dalam format yang sama. Gambar boot GKI menggunakan ramdisk generik yang dikompresi lz4, jadi perangkat yang sesuai dengan GKI harus menggunakan ramdisk vendor yang dikompresi lz4. Konfigurasi untuk ini ditunjukkan di bawah ini.

Persyaratan bootloader untuk mendukung bootconfig dijelaskan pada Pelaksana Bootconfig halaman.

Beberapa ramdisk vendor (versi 4)

Dengan booting header image versi 4, bootloader dapat memilih subset atau semua ramdisks vendor untuk beban sebagai initramfs selama waktu boot. Tabel ramdisk vendor berisi metadata dari setiap ramdisk, dan dapat membantu bootloader dalam memutuskan ramdisk mana yang akan dimuat. Bootloader dapat memutuskan urutan untuk memuat ramdisk vendor yang dipilih, selama ramdisk generik dimuat terakhir.

Sebagai contoh, bootloader dapat menghilangkan ramdisks pemuatan vendor jenis VENDOR_RAMDISK_TYPE_RECOVERY selama boot normal sumber daya melestarikan, sehingga hanya penjual ramdisks jenis VENDOR_RAMDISK_TYPE_PLATFORM dan VENDOR_RAMDISK_TYPE_DLKM dimuat ke memori. Di sisi lain, penjual ramdisks jenis VENDOR_RAMDISK_TYPE_PLATFORM , VENDOR_RAMDISK_TYPE_RECOVERY dan VENDOR_RAMDISK_TYPE_DLKM dimuat ke memori ketika booting ke mode recovery.

Atau, bootloader dapat mengabaikan tabel ramdisk vendor dan memuat seluruh bagian ramdisk vendor. Ini memiliki efek yang sama seperti halnya memuat semua fragmen penjual ramdisk di vendor_boot partisi.

Membangun dukungan

Untuk menerapkan dukungan boot vendor untuk perangkat:

  • Set BOARD_BOOT_HEADER_VERSION ke 3 atau lebih besar.

  • Set BOARD_RAMDISK_USE_LZ4 untuk true jika perangkat Anda GKI-compliant, atau jika sebaliknya menggunakan ramdisk generik LZ4-terkompresi.

  • Set BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE ke ukuran yang sesuai untuk perangkat Anda, mengingat modul kernel yang harus pergi pada vendor ramdisk.

  • Perbarui AB_OTA_PARTITIONS untuk memasukkan vendor_boot dan setiap daftar khusus vendor partisi OTA pada perangkat.

  • Salin perangkat fstab ke /first_stage_ramdisk di vendor_boot partisi, bukan boot partisi. Sebagai contoh, $(LOCAL_PATH)/fstab.hardware:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM) .

Untuk menyertakan beberapa ramdisks penjual di vendor_boot :

  • Set BOARD_BOOT_HEADER_VERSION ke 4 .
  • Set BOARD_VENDOR_RAMDISK_FRAGMENTS ke daftar nama ramdisk fragmen penjual logis untuk dimasukkan dalam vendor_boot .

  • Untuk menambahkan prebuilt penjual ramdisk, set BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).PREBUILT ke path file prebuilt.

  • Untuk menambahkan DLKM penjual ramdisk, set BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).KERNEL_MODULE_DIRS ke daftar direktori modul kernel untuk dimasukkan.

  • Set BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).MKBOOTIMG_ARGS ke mkbootimg argumen. Ini adalah --board_id[0-15] dan --ramdisk_type argumen untuk fragmen penjual ramdisk. Untuk DLKM penjual ramdisk, default --ramdisk_type akan DLKM jika tidak ditentukan lain.

Untuk membangun sumber daya pemulihan sebagai standalone recovery ramdisk di vendor_boot :

  • Set BOARD_BOOT_HEADER_VERSION ke 4 .
  • Set BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT untuk true .
  • Set BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT untuk true .
  • Ini menambahkan fragmen penjual ramdisk yang ramdisk_name adalah recovery dan ramdisk_type adalah VENDOR_RAMDISK_TYPE_RECOVERY . Ramdisk kemudian berisi semua file recovery, yang adalah file dipasang di bawah $(TARGET_RECOVERY_ROOT_OUT) .

mkbootimg argumen

Argumen Keterangan
--ramdisk_type Jenis ramdisk, dapat menjadi salah satu NONE , PLATFORM , RECOVERY atau DLKM .
--board_id[0-15] Tentukan board_id vektor, default ke 0 .

Berikut ini adalah contoh konfigurasi:

BOARD_KERNEL_MODULE_DIRS := foo bar baz
BOARD_BOOT_HEADER_VERSION := 4
BOARD_VENDOR_RAMDISK_FRAGMENTS := dlkm_foobar
BOARD_VENDOR_RAMDISK_FRAGMENT.dlkm_foobar.KERNEL_MODULE_DIRS := foo bar
BOARD_VENDOR_RAMDISK_FRAGMENT.dlkm_foobar.MKBOOTIMG_ARGS := --board_id0 0xF00BA5 --board_id1 0xC0FFEE

Yang dihasilkan vendor_boot akan berisi dua fragmen penjual ramdisk. Yang pertama adalah "default" ramdisk, yang berisi DLKM direktori baz dan seluruh file dalam $(TARGET_VENDOR_RAMDISK_OUT) . Yang kedua adalah dlkm_foobar ramdisk, yang berisi direktori DLKM foo dan bar , dan --ramdisk_type default untuk DLKM .