Android 11 memperkenalkan konsep Generic Kernel
Image (GKI). Untuk mengaktifkan booting perangkat arbitrer dengan GKI, perangkat
Android 11 dapat menggunakan header image booting versi 3. Di versi 3, semua informasi khusus vendor dikeluarkan dari partisi boot
dan dipindahkan ke partisi vendor_boot
yang baru. Perangkat ARM64
yang diluncurkan dengan Android 11 di 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 partisi
vendor_boot
. Beberapa fragmen ramdisk vendor digabungkan satu per 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 booting vendor di-A/B-kan dengan A/B virtual dan dilindungi oleh Android Verified Boot.
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 (halaman o) | 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 header, bagian ramdisk vendor (terdiri dari semua fragmen ramdisk vendor, yang digabungkan), blob hierarki perangkat (DTB), dan tabel ramdisk vendor.
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 (halaman q) | 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 terutama terdiri dari data yang telah dipindahkan ke sana dari header image booting. File 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 ramdisk vendor.ramdisk_type
menunjukkan jenis ramdisk, nilainya yang mungkin adalah:VENDOR_RAMDISK_TYPE_NONE
menunjukkan bahwa nilai tidak ditentukan.- Ramdisk
VENDOR_RAMDISK_TYPE_PLATFORM
berisi bit khusus platform. Bootloader harus selalu memuat ini ke dalam memori. VENDOR_RAMDISK_TYPE_RECOVERY
ramdisk berisi resource pemulihan. Bootloader harus memuat ini ke dalam memori saat melakukan booting ke pemulihan.- Ramdisk
VENDOR_RAMDISK_TYPE_DLKM
berisi modul kernel yang dapat dimuat secara dinamis.
ramdisk_name
adalah nama unik dari ramdisk.board_id
adalah vektor ID hardware yang ditentukan vendor.
Dukungan bootloader
Karena partisi booting vendor berisi informasi (seperti ukuran halaman flash, kernel, alamat pemuatan ramdisk, DTB itu sendiri) yang sebelumnya ada di partisi booting, bootloader harus mengakses partisi booting dan booting vendor agar memiliki cukup data untuk menyelesaikan booting.
Bootloader harus memuat ramdisk generik ke dalam memori segera setelah
ramdisk vendor (format CPIO, Gzip, dan lz4 mendukung jenis
penggabungan ini). Jangan menyelaraskan image ramdisk generik dengan paging atau memasukkan
ruang lain di antara image tersebut dan akhir ramdisk vendor dalam memori. Setelah
didekompresi, kernel akan mengekstrak file gabungan menjadi initramfs
,
yang menghasilkan struktur file berupa ramdisk umum yang ditempatkan pada
struktur file ramdisk vendor.
Karena ramdisk generik dan ramdisk vendor digabungkan, keduanya harus dalam format yang sama. Image booting GKI menggunakan ramdisk generik yang dikompresi lz4, sehingga perangkat yang mematuhi GKI harus menggunakan ramdisk vendor yang dikompresi lz4. Konfigurasi untuk hal ini ditunjukkan di bawah.
Persyaratan bootloader untuk mendukung bootconfig dijelaskan dalam Menerapkan Bootconfig.
Beberapa ramdisk vendor (versi 4)
Dengan header image booting versi 4, bootloader dapat memilih sebagian atau
semua ramdisk vendor untuk dimuat sebagai initramfs
selama waktu booting. Tabel
ramdisk vendor berisi metadata setiap ramdisk, dan dapat membantu
bootloader dalam menentukan ramdisk yang akan dimuat. Bootloader dapat memutuskan
urutan pemuatan 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, sehingga hanya
ramdisk vendor jenis VENDOR_RAMDISK_TYPE_PLATFORM
dan
VENDOR_RAMDISK_TYPE_DLKM
yang dimuat ke dalam memori. Di sisi lain, ramdisk
vendor jenis VENDOR_RAMDISK_TYPE_PLATFORM
, VENDOR_RAMDISK_TYPE_RECOVERY
dan VENDOR_RAMDISK_TYPE_DLKM
dimuat ke dalam memori saat melakukan booting ke mode
pemulihan.
Atau, bootloader dapat mengabaikan tabel ramdisk vendor dan memuat
seluruh bagian ramdisk vendor. Tindakan ini memiliki efek yang sama seperti memuat semua
fragmen ramdisk vendor di partisi vendor_boot
.
Dukungan build
Untuk menerapkan dukungan booting vendor bagi perangkat:
Tetapkan
BOARD_BOOT_HEADER_VERSION
ke3
atau lebih besar.Tetapkan
BOARD_RAMDISK_USE_LZ4
ketrue
jika perangkat Anda mematuhi GKI, atau jika perangkat menggunakan ramdisk generik yang dikompresi lz4.Setel
BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE
ke ukuran yang sesuai untuk perangkat Anda, dengan mempertimbangkan modul kernel yang harus ada pada ramdisk vendor.Update
AB_OTA_PARTITIONS
untuk menyertakanvendor_boot
dan daftar partisi OTA khusus vendor di perangkat.Salin
fstab
perangkat Anda ke/first_stage_ramdisk
di partisivendor_boot
, bukan partisiboot
. 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
ke4
. Tetapkan
BOARD_VENDOR_RAMDISK_FRAGMENTS
ke daftar nama fragmen ramdisk vendor logis yang akan disertakan dalamvendor_boot
.Untuk menambahkan ramdisk vendor bawaan, tetapkan
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).PREBUILT
ke jalur bawaan.Untuk menambahkan ramdisk vendor DLKM, setel
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).KERNEL_MODULE_DIRS
ke daftar direktori modul kernel yang akan disertakan.Tetapkan
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).MKBOOTIMG_ARGS
ke argumenmkbootimg
. Ini adalah argumen--board_id[0-15]
dan--ramdisk_type
untuk fragmen ramdisk vendor. Untuk ramdisk vendor DLKM,--ramdisk_type
default-nya adalahDLKM
jika tidak ditentukan.
Untuk mem-build resource pemulihan sebagai ramdisk recovery
mandiri di vendor_boot
:
- Setel
BOARD_BOOT_HEADER_VERSION
ke4
. - Setel
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
ketrue
. - Setel
BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT
ketrue
. - Tindakan ini akan menambahkan fragmen ramdisk vendor yang
ramdisk_name
-nya adalahrecovery
danramdisk_type
adalahVENDOR_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 , defaultnya 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. Yang
pertama adalah ramdisk "default", 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
.