Header gambar booting

Android 9 memperkenalkan kolom versi di header image boot, yang memungkinkan update pada header sambil mempertahankan kompatibilitas mundur. Bootloader harus memeriksa kolom versi header dan mengurai header sebagaimana mestinya. Peluncuran perangkat dengan:

  • Android 13 dapat menggunakan header boot versi 3 atau 4. Untuk perangkat yang mendukung arsitektur Generic Kernel Image (GKI), versi 4 adalah image booting utama dan kolom os_version di header booting harus nol. Bootloader perangkat diharapkan mendapatkan informasi versi dari properti Booting Terverifikasi Android (AVB).
  • Android 12 dapat menggunakan header boot versi 3 atau 4. Untuk perangkat yang mendukung arsitektur Generic Kernel Image (GKI), versi 4 adalah image booting utama.
  • Android 11 dapat menggunakan header boot versi 3. Untuk perangkat yang mendukung arsitektur Generic Kernel Image (GKI), versi ini harus digunakan untuk image booting utama.
  • Android 10 harus menggunakan header boot versi 2.
  • Android 9 harus menggunakan header boot versi 1.
  • Android 8 dan yang lebih lama dianggap menggunakan header image boot versi 0.

Untuk semua perangkat yang menjalankan Android 9 atau yang lebih tinggi, Vendor Test Suite (VTS) memeriksa format image boot/recovery untuk memastikan bahwa header image booting menggunakan versi yang benar. Untuk melihat detail AOSP tentang semua header image booting dan booting vendor yang didukung, lihat system/tools/mkbootimg/include/bootimg/bootimg.h.

Mengimplementasikan pembuatan versi header image booting

Alat mkbootimg menerima argumen berikut.

Argumen Deskripsi
header_version Menetapkan versi header image booting. Image booting dengan versi header:
  • 1 atau 2 mendukung citra DTBO pemulihan atau gambar ACPIO pemulihan.
  • 3 tidak mendukung gambar pemulihan.
recovery_dtbo Digunakan untuk arsitektur yang menggunakan DTB. Menentukan jalur ke image DTBO pemulihan. Opsional untuk perangkat A/B, yang tidak memerlukan image pemulihan. Perangkat non-A/B yang menggunakan header_version:
  • 1 atau 2 dapat menentukan jalur ini atau menggunakan bagian recovery_acpio untuk menentukan jalur ke image ACPIO pemulihan.
  • 3 tidak dapat menentukan gambar DTBO pemulihan.
recovery_acpio Digunakan untuk arsitektur yang menggunakan ACPI, bukan DTB. Menentukan jalur ke image ACPIO pemulihan. Opsional untuk perangkat A/B, yang tidak memerlukan image pemulihan. Perangkat non-A/B yang menggunakan header_version:
  • 1 atau 2 dapat menentukan jalur ini atau menggunakan bagian recovery_dtbo untuk menentukan jalur ke image DTBO pemulihan.
  • 3 tidak dapat menentukan gambar ACPIO pemulihan.
dtb Jalur ke image DTB yang disertakan dalam image booting/pemulihan.
dtb_offset Saat ditambahkan ke argumen base, memberikan alamat pemuatan fisik untuk hierarki perangkat akhir. Misalnya, jika argumen base adalah 0x10000000 dan argumen dtb_offset adalah 0x01000000, dtb_addr_field di header image booting akan diisi sebagai 0x11000000.

BoardConfig.mk perangkat menggunakan BOARD_MKBOOTIMG_ARGS konfigurasi untuk menambahkan header version ke argumen khusus board lainnya dari mkbootimg. Contoh:

BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)

Sistem build Android menggunakan variabel BoardConfig BOARD_PREBUILT_DTBOIMAGE untuk menetapkan argumen recovery_dtbo dari alat mkbootimg selama pembuatan image pemulihan. Untuk mengetahui detail tentang perubahan Proyek Open Source Android (AOSP), tinjau daftar perubahan terkait untuk pembuatan versi header image boot.

Header gambar booting, versi 4

Android 12 menyediakan boot_signature di header image booting versi 4, yang dapat digunakan untuk memeriksa integritas kernel dan ramdisk. Pemeriksaan dilakukan di VtsSecurityAvbTest dan diperlukan untuk perangkat yang menggunakan arsitektur GKI. Namun, boot_signature tidak terlibat dalam proses booting terverifikasi khusus perangkat dan hanya digunakan dalam VTS. Lihat Konfigurasi boot.img board GKI dan setelan booting terverifikasi GKI untuk mengetahui detailnya.

Header image booting vendor versi 4 mendukung beberapa fragmen ramdisk vendor.

Versi 4 header image booting menggunakan format berikut.

struct boot_img_hdr
{
#define BOOT_MAGIC_SIZE 8
    uint8_t magic[BOOT_MAGIC_SIZE];

    uint32_t kernel_size;    /* size in bytes */
    uint32_t ramdisk_size;   /* size in bytes */

    uint32_t os_version;

    uint32_t header_size;    /* size of boot image header in bytes */
    uint32_t reserved[4];
    uint32_t header_version; /* offset remains constant for version check */

#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024
    uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];

    uint32_t signature_size; /* size in bytes */
};

Header gambar booting, versi 3

Android 11 mengupdate header image booting ke versi 3, yang menghapus data berikut:

  • Bootloader tahap kedua. Kolom second_size dan second_addr tidak lagi muncul di header image booting. Perangkat dengan bootloader tahap kedua harus menyimpan bootloader tersebut di partisinya sendiri.

  • Gambar pemulihan. Persyaratan untuk menentukan image pemulihan sudah tidak digunakan lagi, dan kolom recovery_dtbo_size, recovery_dtbo_offset, recovery_acpio_size, serta recovery_acpio_offset tidak lagi muncul di header image booting.

    • Perangkat A/B menggunakan skema update dan pemulihan sehingga tidak perlu menentukan image DTBO atau ACPIO untuk pemulihan.

    • Perangkat non-A/B yang ingin menentukan image pemulihan (DTBO maupun ACPIO) harus menggunakan header image booting versi 1 atau 2.

  • Blob hierarki perangkat (DTB). DTB disimpan di partisi booting vendor, sehingga kolom dtb_size dan dtb_addr tidak lagi muncul di header image booting (tetapi ada di header image booting vendor).

Perangkat dapat menggunakan header image booting versi 3 untuk mematuhi arsitektur Generic Kernel Image (GKI), yang menyatukan kernel inti dan memindahkan modul vendor yang diperlukan untuk booting ke partisi vendor_boot (artinya boot image hanya berisi komponen GKI). Perangkat yang:

  • Gunakan GKI (memerlukan kernel android-4.19 atau android-5.4), tetapi jangan menggunakan update A/B dapat menentukan image pemulihan dengan menggunakan boot image versi 3 untuk boot image dan boot image versi 2 untuk image pemulihan.

  • Jangan menggunakan GKI dan jangan menggunakan update A/B yang dapat menentukan image pemulihan dengan menggunakan boot image versi 1 atau 2 untuk image booting dan pemulihan.

Versi 3 header image booting menggunakan format berikut.

struct boot_img_hdr
{
#define BOOT_MAGIC_SIZE 8
    uint8_t magic[BOOT_MAGIC_SIZE];

    uint32_t kernel_size;    /* size in bytes */
    uint32_t ramdisk_size;   /* size in bytes */

    uint32_t os_version;

    uint32_t header_size;    /* size of boot image header in bytes */
    uint32_t reserved[4];
    uint32_t header_version; /* offset remains constant for version check */

#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024
    uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];
};

Header gambar booting, versi 2

Android 10 memperbarui header image booting ke versi 2, yang menambahkan bagian untuk informasi gambar DTB pemulihan (ukuran gambar dan alamat pemuatan fisik).

Versi 2 dari versi header image booting menggunakan format berikut.

struct boot_img_hdr
{
    uint8_t magic[BOOT_MAGIC_SIZE];
    uint32_t kernel_size;               /* size in bytes */
    uint32_t kernel_addr;               /* physical load addr */

    uint32_t ramdisk_size;              /* size in bytes */
    uint32_t ramdisk_addr;              /* physical load addr */

    uint32_t second_size;               /* size in bytes */
    uint32_t second_addr;               /* physical load addr */

    uint32_t tags_addr;                 /* physical addr for kernel tags */
    uint32_t page_size;                 /* flash page size we assume */
    uint32_t header_version;
    uint32_t os_version;
    uint8_t name[BOOT_NAME_SIZE];       /* asciiz product name */
    uint8_t cmdline[BOOT_ARGS_SIZE];
    uint32_t id[8];                     /* timestamp / checksum / sha1 / etc */
    uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
    uint32_t recovery_[dtbo|acpio]_size;    /* size of recovery image */
    uint64_t recovery_[dtbo|acpio]_offset;  /* offset in boot image */
    uint32_t header_size;               /* size of boot image header in bytes */
    uint32_t dtb_size;                  /* size of dtb image */
    uint64_t dtb_addr;                  /* physical load address */
};

Header gambar booting, versi 1

Android 9 mengonversi kolom unused dari header image boot menjadi kolom versi header. Perangkat yang diluncurkan dengan Android 9 harus menggunakan header image booting dengan versi header yang disetel ke 1 atau lebih tinggi (ini diverifikasi oleh VTS).

Versi 1 dari versi header image booting menggunakan format berikut.

struct boot_img_hdr
{
    uint8_t magic[BOOT_MAGIC_SIZE];
    uint32_t kernel_size;               /* size in bytes */
    uint32_t kernel_addr;               /* physical load addr */
    uint32_t ramdisk_size;              /* size in bytes */
    uint32_t ramdisk_addr;              /* physical load addr */

    uint32_t second_size;               /* size in bytes */
    uint32_t second_addr;               /* physical load addr */

    uint32_t tags_addr;                 /* physical addr for kernel tags */
    uint32_t page_size;                 /* flash page size we assume */
    uint32_t header_version;
    uint32_t os_version;
    uint8_t name[BOOT_NAME_SIZE];       /* asciiz product name */
    uint8_t cmdline[BOOT_ARGS_SIZE];
    uint32_t id[8];                     /* timestamp / checksum / sha1 / etc */
    uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
    uint32_t recovery_[dtbo|acpio]_size;    /* size of recovery image */
    uint64_t recovery_[dtbo|acpio]_offset;  /* offset in boot image */
    uint32_t header_size;               /* size of boot image header in bytes */
};

Perangkat non-A/B dapat menentukan image overlay DTB/ACPI untuk pemulihan guna membantu mengurangi kegagalan update over the air (OTA). (Perangkat A/B tidak mengalami masalah ini dan tidak perlu menetapkan gambar overlay.) Anda dapat menentukan gambar DTBO atau gambar ACPIO, tetapi tidak keduanya (karena digunakan oleh arsitektur yang berbeda). Untuk mengonfigurasi header image booting dengan benar, saat menggunakan:

  • Image DTBO untuk pemulihan, sertakan kolom recovery_dtbo_size dan recovery_dtbo_offset (dan jangan sertakan kolom recovery_acpio_size dan recovery_acpio_offset).

  • Gambar ACPIO untuk pemulihan, sertakan kolom recovery_acpio_size dan recovery_acpio_offset (dan jangan sertakan kolom recovery_dtbo_size dan recovery_dtbo_offset).

Kolom header_size berisi ukuran header image booting. Jika versi header image booting ditetapkan ke 1, kolom id berisi ringkasan SHA-1 untuk bagian recovery_[dtbo|acpio] pada image booting selain kernel, ramdisk, dan second sections. Untuk mengetahui detail tentang kolom recovery_[dtbo|acpio]_size dan recovery_[dtbo|acpio]_offset, lihat Gambar Pemulihan.

Header image booting lama, versi 0

Perangkat yang diluncurkan sebelum Android 9 menggunakan header image booting lama dianggap menggunakan header image boot versi 0.

struct boot_img_hdr
{
    uint8_t magic[BOOT_MAGIC_SIZE];
    uint32_t kernel_size;                /* size in bytes */
    uint32_t kernel_addr;                /* physical load addr */

    uint32_t ramdisk_size;               /* size in bytes */
    uint32_t ramdisk_addr;               /* physical load addr */

    uint32_t second_size;                /* size in bytes */
    uint32_t second_addr;                /* physical load addr */

    uint32_t tags_addr;                  /* physical addr for kernel tags */
    uint32_t page_size;                  /* flash page size we assume */
    uint32_t unused;
    uint32_t os_version;
    uint8_t name[BOOT_NAME_SIZE];        /* asciiz product name */
    uint8_t cmdline[BOOT_ARGS_SIZE];
    uint32_t id[8];                      /* timestamp / checksum / sha1 / etc */
    uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
};