Partisi booting vendor

Android 11 memperkenalkan konsep Kernel Generik Gambar (GKI). Untuk memungkinkan {i>booting<i} perangkat arbitrer dengan GKI, 11 perangkat dapat menggunakan header image booting versi 3. Di beberapa versi 3, semua informasi khusus vendor akan dikecualikan dari boot partisi dan dipindahkan ke partisi vendor_boot yang baru. Perangkat ARM64 peluncuran dengan Android 11 pada kernel Linux 5.4 harus mendukung partisi vendor_boot dan format partisi boot yang diperbarui untuk lulus pengujian dengan GKI.

Perangkat Android 12 dapat menggunakan header image booting versi 4, yang mendukung penyertaan beberapa ramdisk vendor di vendor_boot partisi. Beberapa fragmen ramdisk vendor digabungkan satu per satu di bagian ramdisk vendor. Tabel {i>ramdisk<i} vendor digunakan untuk menggambarkan tata letak bagian ramdisk vendor dan metadata dari setiap ramdisk vendor fragmen.

Struktur partisi

Partisi booting vendor di-A/B-ed dengan A/B virtual dan dilindungi oleh Android Booting Terverifikasi.

Versi 3

Partisi ini terdiri dari header, ramdisk vendor, dan blob hierarki perangkat (DTB).

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

Versi 4

Partisi terdiri dari {i>header<i}, bagian vendor {i>ramdisk<i} (terdiri dari semua fragmen ramdisk vendor, yang disambungkan), blob hierarki perangkat (DTB), dan tabel ramdisk vendor ini.

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

Header booting vendor

Isi header partisi booting vendor sebagian besar terdiri dari data yang telah dipindahkan ke sana dari header image booting. Ini juga berisi informasi tentang {i>ramdisk<i} 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 ramdisk vendor.
  • ramdisk_type menunjukkan jenis ramdisk, kemungkinan nilainya adalah:
    • VENDOR_RAMDISK_TYPE_NONE menunjukkan nilai tidak ditentukan.
    • Ramdisk VENDOR_RAMDISK_TYPE_PLATFORM berisi bit khusus platform. Bootloader harus selalu memuat data ini ke dalam memori.
    • VENDOR_RAMDISK_TYPE_RECOVERY ramdisk berisi resource pemulihan. Tujuan {i>bootloader<i} harus memuatnya ke memori saat melakukan {i>booting<i} ke pemulihan.
    • Ramdisk VENDOR_RAMDISK_TYPE_DLKM berisi kernel dinamis yang dapat dimuat modul.
  • ramdisk_name adalah nama unik dari ramdisk.
  • board_id adalah vektor ID hardware yang ditentukan vendor.

Dukungan bootloader

Karena partisi {i>booting<i} vendor berisi informasi (seperti ukuran halaman {i>flash<i}, {i>kernel<i}, alamat beban ramdisk, DTB itu sendiri) yang sebelumnya ada di partisi {i>booting<i}, {i>bootloader<i} harus mengakses proses {i>booting<i} dan vendor partisi memiliki cukup data untuk menyelesaikan {i>booting<i}.

Bootloader harus segera memuat ramdisk generik ke memori vendor ramdisk (format CPIO, Gzip, dan lz4 mendukung jenis penyambungan). Jangan menyelaraskan gambar ramdisk generik atau memperkenalkan ruang lain di antara keduanya dan akhir {i>ramdisk<i} vendor dalam memori. Setelah mendekompresi, kernel akan mengekstrak file gabungan menjadi initramfs, yang menghasilkan struktur file berupa {i> ramdisk<i} generik yang ditempatkan di dari vendor struktur file {i>ramdisk<i}.

Karena ramdisk generik dan ramdisk vendor bersambung, mereka harus ada format yang sama. Boot image GKI menggunakan ramdisk generik yang dikompresi yang sesuai dengan GKI harus menggunakan ramdisk vendor yang dikompresi lz4. Tujuan untuk ini ditampilkan di bawah ini.

Persyaratan bootloader untuk mendukung bootconfig dijelaskan di Terapkan Konfigurasi Booting.

RAMdisk beberapa vendor (versi 4)

Dengan header image booting versi 4, bootloader dapat memilih subset atau semua ramdisk vendor untuk dimuat sebagai initramfs selama waktu booting. Tujuan tabel ramdisk vendor yang berisi metadata dari setiap ramdisk, dan dapat membantu {i>bootloader<i} dalam memutuskan {i>ramdisk<i} mana yang akan dimuat. {i>Bootloader<i} dapat memutuskan untuk memuat ramdisk vendor yang dipilih, selama ramdisk generik dimuat terakhir.

Misalnya, bootloader dapat menghilangkan pemuatan ramdisk vendor jenis VENDOR_RAMDISK_TYPE_RECOVERY selama booting normal untuk menghemat resource, jadi hanya ramdisk vendor jenis VENDOR_RAMDISK_TYPE_PLATFORM dan VENDOR_RAMDISK_TYPE_DLKM dimuat ke dalam memori. Di sisi lain, vendor ramdisk jenis VENDOR_RAMDISK_TYPE_PLATFORM, VENDOR_RAMDISK_TYPE_RECOVERY dan VENDOR_RAMDISK_TYPE_DLKM dimuat ke dalam memori saat melakukan booting ke pemulihan mode.

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

Dukungan build

Untuk menerapkan dukungan booting vendor bagi perangkat:

  • Tetapkan BOARD_BOOT_HEADER_VERSION ke 3 atau yang lebih tinggi.

  • Tetapkan BOARD_RAMDISK_USE_LZ4 ke true jika perangkat Anda sesuai dengan GKI, atau jika sebaliknya menggunakan {i>ramdisk<i} generik yang dikompresi {i>lz4<i}.

  • Setel BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE ke ukuran yang sesuai untuk Anda perangkat, mengingat modul {i>kernel<i} yang harus ada pada {i>ramdisk<i} vendor.

  • Update AB_OTA_PARTITIONS untuk menyertakan vendor_boot dan vendor tertentu daftar partisi OTA di perangkat.

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

Untuk menyertakan beberapa ramdisk vendor di vendor_boot:

  • Setel BOARD_BOOT_HEADER_VERSION ke 4.
  • Setel BOARD_VENDOR_RAMDISK_FRAGMENTS ke daftar ramdisk vendor logis nama fragmen yang akan disertakan dalam vendor_boot.

  • Untuk menambahkan ramdisk vendor bawaan, atur BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).PREBUILT ke bawaan .

  • Untuk menambahkan ramdisk vendor DLKM, setel BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).KERNEL_MODULE_DIRS menjadi daftar direktori modul {i> kernel<i} yang akan disertakan.

  • Tetapkan BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).MKBOOTIMG_ARGS ke Argumen mkbootimg. Berikut adalah --board_id[0-15] dan --ramdisk_type argumen untuk fragmen ramdisk vendor. Untuk ramdisk vendor DLKM, --ramdisk_type default adalah DLKM jika tidak ditentukan sebaliknya.

Untuk mem-build resource pemulihan sebagai ramdisk recovery mandiri di vendor_boot:

  • Setel BOARD_BOOT_HEADER_VERSION ke 4.
  • Setel BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT ke true.
  • Setel BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT ke true.
  • Ini menambahkan fragmen ramdisk vendor yang ramdisk_name-nya adalah recovery dan ramdisk_type adalah VENDOR_RAMDISK_TYPE_RECOVERY. Ramdisk kemudian berisi semua file pemulihan, yang merupakan file yang diinstal di $(TARGET_RECOVERY_ROOT_OUT).

Argumen mkbootimg

Argumen Deskripsi
--ramdisk_type Jenis ramdisk, dapat berupa NONE, PLATFORM, RECOVERY atau DLKM.
--board_id[0-15] Tentukan vektor board_id, default-nya adalah 0.

Berikut 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

vendor_boot yang dihasilkan akan berisi dua fragmen ramdisk vendor. Tujuan yang pertama adalah "default" ramdisk, yang berisi direktori DLKM baz dan file lainnya di $(TARGET_VENDOR_RAMDISK_OUT). Yang kedua adalah Ramdisk dlkm_foobar, yang berisi direktori DLKM foo dan bar, dan --ramdisk_type ditetapkan secara default ke DLKM.