Header Gambar Boot

Android 9 memperkenalkan bidang versi di header image boot, memungkinkan pembaruan ke header sambil mempertahankan kompatibilitas mundur. Bootloader harus memeriksa bidang versi header dan mengurai header yang sesuai. Perangkat diluncurkan dengan:

  • Android 12 dapat menggunakan header boot versi 3 atau 4. Untuk perangkat yang mendukung arsitektur Generic Kernel Image (GKI) , versi 4 adalah image boot utama.
  • Android 11 dapat menggunakan boot header versi 3. Untuk perangkat yang mendukung arsitektur Generic Kernel Image (GKI) , versi ini harus digunakan untuk image boot utama.
  • Android 10 harus menggunakan header boot versi 2.
  • Android 9 harus menggunakan header boot versi 1.
  • Android 8 dan yang lebih rendah dianggap menggunakan header image boot versi 0.

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

Menerapkan versi header gambar boot

Alat mkbootimg menerima argumen berikut.

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

Perangkat BoardConfig.mk menggunakan konfigurasi BOARD_MKBOOTIMG_ARGS untuk menambahkan header version ke argumen khusus papan lainnya dari mkbootimg . Sebagai 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 menyetel argumen recovery_dtbo dari alat mkbootimg selama pembuatan image pemulihan. Untuk detail tentang perubahan Android Open Source Project (AOSP), tinjau daftar perubahan terkait untuk pembuatan versi header image boot .

Header gambar boot, versi 4

Android 12 menyediakan boot_signature di header image boot 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 boot terverifikasi khusus perangkat dan hanya digunakan di VTS. Lihat konfigurasi papan boot.img GKI dan pengaturan boot terverifikasi GKI untuk detailnya.

Header gambar boot vendor versi 4 mendukung beberapa fragmen ramdisk vendor.

Versi 4 dari versi header gambar boot 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 boot, versi 3

Android 11 memperbarui header gambar boot ke versi 3, yang menghapus data berikut:

  • Bootloader tahap kedua. Bidang second_size dan second_addr tidak lagi muncul di header gambar boot. Perangkat dengan bootloader tahap kedua harus menyimpan bootloader itu di partisinya sendiri.

  • Gambar pemulihan. Persyaratan untuk menentukan citra pemulihan tidak digunakan lagi, dan bidang recovery_dtbo_size , recovery_dtbo_offset , recovery_acpio_size , dan recovery_acpio_offset tidak lagi muncul di header citra boot.

    • Perangkat A/B menggunakan skema pembaruan dan pemulihan yang membuatnya tidak perlu menentukan gambar DTBO atau ACPIO untuk pemulihan.

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

  • Gumpalan pohon perangkat (DTB). DTB disimpan di partisi boot vendor , sehingga bidang dtb_size dan dtb_addr tidak lagi muncul di header gambar boot (tetapi ada di header gambar boot vendor).

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

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

  • Jangan gunakan GKI dan jangan gunakan pembaruan A/B dapat menentukan gambar pemulihan dengan menggunakan gambar boot versi 1 atau 2 untuk gambar boot dan pemulihan.

Versi 3 dari versi header gambar boot 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 boot, versi 2

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

Versi 2 dari versi header gambar boot 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 boot, versi 1

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

Versi 1 dari versi header gambar boot 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 gambar overlay DTB/ACPI untuk pemulihan guna membantu mengurangi kegagalan pembaruan over-the-air (OTA). (Perangkat A/B tidak memiliki masalah ini dan tidak perlu menentukan gambar overlay.) Anda dapat menentukan gambar DTBO atau gambar ACPIO, tetapi tidak keduanya (karena digunakan oleh arsitektur yang berbeda). Untuk mengonfigurasi header gambar boot dengan benar, saat menggunakan:

  • Gambar DTBO untuk pemulihan, sertakan bidang recovery_dtbo_size dan recovery_dtbo_offset (dan jangan sertakan bidang recovery_acpio_size dan recovery_acpio_offset ).

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

Bidang header_size berisi ukuran header gambar boot. Jika versi header image boot disetel ke 1, bidang id berisi intisari SHA-1 untuk bagian recovery_[dtbo|acpio] image boot selain kernel , ramdisk , dan second sections . Untuk detail tentang bidang recovery_[dtbo|acpio]_size dan recovery_[dtbo|acpio]_offset , lihat Gambar Pemulihan .

Header gambar boot lawas, versi 0

Perangkat yang diluncurkan sebelum Android 9 menggunakan header image boot 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];
};