Tiêu đề hình ảnh khởi động

Android 9 đã giới thiệu một trường phiên bản trong tiêu đề hình ảnh khởi động, cho phép cập nhật tiêu đề trong khi vẫn duy trì khả năng tương thích ngược. Trình tải khởi động phải kiểm tra trường phiên bản tiêu đề và phân tích cú pháp tiêu đề cho phù hợp. Thiết bị chạy bằng:

  • Android 13 có thể sử dụng tiêu đề khởi động phiên bản 3 hoặc 4. Đối với các thiết bị hỗ trợ cấu trúc Hình ảnh hạt nhân chung (GKI), phiên bản 4 là hình ảnh khởi động chính và trường os_version trong tiêu đề khởi động phải bằng 0. Thay vào đó, trình tải khởi động thiết bị dự kiến sẽ nhận thông tin phiên bản từ các thuộc tính Xác minh quy trình khởi động của Android (AVB).
  • Android 12 có thể sử dụng tiêu đề khởi động phiên bản 3 hoặc 4. Đối với các thiết bị hỗ trợ cấu trúc Hình ảnh hạt nhân chung (GKI), phiên bản 4 là hình ảnh khởi động chính.
  • Android 11 có thể sử dụng tiêu đề khởi động phiên bản 3. Đối với các thiết bị hỗ trợ cấu trúc Hình ảnh hạt nhân chung (GKI), bạn phải sử dụng phiên bản này cho hình ảnh khởi động chính.
  • Android 10 phải sử dụng tiêu đề khởi động phiên bản 2.
  • Android 9 phải sử dụng tiêu đề khởi động phiên bản 1.
  • Android 8 trở xuống được xem là đang sử dụng tiêu đề hình ảnh khởi động phiên bản 0.

Đối với tất cả thiết bị chạy Android 9 trở lên, Bộ thử nghiệm nhà cung cấp (VTS) sẽ kiểm tra định dạng của hình ảnh boot/recovery để đảm bảo rằng tiêu đề của hình ảnh khởi động sử dụng đúng phiên bản. Để xem thông tin chi tiết về AOSP (Dự án nguồn mở Android) trên tất cả các tiêu đề hình ảnh khởi động và khởi động của nhà cung cấp được hỗ trợ, hãy tham khảo system/tools/mkbootimg/include/bootimg/bootimg.h.

Triển khai phiên bản tiêu đề hình ảnh khởi động

Công cụ mkbootimg chấp nhận các đối số sau.

Đối số Nội dung mô tả
header_version Thiết lập phiên bản tiêu đề của hình ảnh khởi động. Hình ảnh khởi động có phiên bản tiêu đề:
  • 1 hoặc 2 hỗ trợ hình ảnh DTBO khôi phục hoặc hình ảnh ACPIO khôi phục.
  • 3 không hỗ trợ hình ảnh khôi phục.
recovery_dtbo Dùng cho các kiến trúc sử dụng DTB. Chỉ định đường dẫn đến hình ảnh DTBO khôi phục. Không bắt buộc đối với các thiết bị A/B không cần hình ảnh khôi phục. Các thiết bị không phải A/B sử dụng header_version:
  • 1 hoặc 2 có thể chỉ định đường dẫn này hoặc dùng phần recovery_acpio để chỉ định đường dẫn đến hình ảnh ACPIO khôi phục.
  • 3 không thể chỉ định hình ảnh DTBO khôi phục.
recovery_acpio Dùng cho các kiến trúc sử dụng ACPI thay vì DTB. Chỉ định đường dẫn đến hình ảnh ACPIO khôi phục. Không bắt buộc đối với các thiết bị A/B không cần hình ảnh khôi phục. Các thiết bị không phải A/B sử dụng header_version:
  • 1 hoặc 2 có thể chỉ định đường dẫn này hoặc dùng phần recovery_dtbo để chỉ định đường dẫn đến hình ảnh DTBO khôi phục.
  • 3 không thể chỉ định hình ảnh ACPIO khôi phục.
dtb Đường dẫn đến hình ảnh DTB có trong hình ảnh khởi động/khôi phục.
dtb_offset Khi thêm vào đối số base, hãy cung cấp địa chỉ tải thực tế cho cây thiết bị cuối cùng. Ví dụ: nếu đối số base0x10000000 và đối số dtb_offset0x01000000, thì dtb_addr_field trong tiêu đề của hình ảnh khởi động sẽ được điền là 0x11000000.

Thiết bị BoardConfig.mk sử dụng cấu hình BOARD_MKBOOTIMG_ARGS để thêm header version vào các đối số khác dành riêng cho bảng của mkbootimg. Ví dụ:

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

Hệ thống xây dựng Android sử dụng biến BoardConfig BOARD_PREBUILT_DTBOIMAGE để đặt đối số recovery_dtbo của công cụ mkbootimg trong quá trình tạo hình ảnh khôi phục. Để biết thông tin chi tiết về những thay đổi đối với Dự án nguồn mở Android (AOSP), hãy xem các danh sách thay đổi liên kết để tạo phiên bản tiêu đề hình ảnh khởi động.

Tiêu đề hình ảnh khởi động, phiên bản 4

Android 12 cung cấp boot_signature trong tiêu đề hình ảnh khởi động phiên bản 4. Tiêu đề này có thể dùng để kiểm tra tính toàn vẹn của nhân hệ điều hành và ổ đĩa RAM. Bước kiểm tra này được thực hiện trong VtsSecurityAvbTest và là bắt buộc đối với các thiết bị sử dụng kiến trúc GKI. Tuy nhiên, boot_signature không tham gia vào quy trình khởi động được xác minh dành riêng cho thiết bị và chỉ được dùng trong VTS. Xem phần cấu hình bảng boot.img của GKIchế độ cài đặt khởi động được xác minh của GKI để biết thông tin chi tiết.

Tiêu đề hình ảnh khởi động của nhà cung cấp phiên bản 4 hỗ trợ nhiều mảnh ramdisk của nhà cung cấp.

Phiên bản 4 của phiên bản tiêu đề hình ảnh khởi động sử dụng định dạng sau.

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 */
};

Tiêu đề hình ảnh khởi động, phiên bản 3

Android 11 cập nhật tiêu đề hình ảnh khởi động thành phiên bản 3, tức là xoá các dữ liệu sau:

  • Trình tải khởi động giai đoạn hai. Các trường second_sizesecond_addr không còn xuất hiện trong tiêu đề của hình ảnh khởi động nữa. Các thiết bị có trình tải khởi động ở giai đoạn thứ hai phải lưu trữ trình tải khởi động đó trong phân vùng riêng của nó.

  • Ảnh khôi phục. Yêu cầu chỉ định hình ảnh khôi phục không còn được dùng nữa và các trường recovery_dtbo_size, recovery_dtbo_offset, recovery_acpio_sizerecovery_acpio_offset không còn xuất hiện trong tiêu đề của hình ảnh khởi động nữa.

    • Thiết bị A/B sử dụng lược đồ cập nhật và khôi phục nên việc chỉ định hình ảnh DTBO hoặc ACPIO để khôi phục là không cần thiết.

    • Các thiết bị không phải A/B muốn chỉ định hình ảnh khôi phục (DTBO hoặc ACPIO) phải sử dụng tiêu đề hình ảnh khởi động phiên bản 1 hoặc 2.

  • blob cây thiết bị (DTB). DTB được lưu trữ trong phân vùng khởi động của nhà cung cấp, vì vậy, các trường dtb_sizedtb_addr không còn xuất hiện trong tiêu đề hình ảnh khởi động nữa (nhưng có trong tiêu đề hình ảnh khởi động của nhà cung cấp).

Các thiết bị có thể sử dụng tiêu đề hình ảnh khởi động phiên bản 3 để tuân thủ cấu trúc Hình ảnh hạt nhân chung (GKI), trong đó hợp nhất nhân cốt lõi và di chuyển các mô-đun nhà cung cấp cần thiết để khởi động vào phân vùng vendor_boot (nghĩa là hình ảnh khởi động chỉ chứa các thành phần GKI). Thiết bị:

  • Sử dụng GKI (yêu cầu nhân hệ điều hành android-4.19 hoặc android-5.4) nhưng không sử dụng bản cập nhật A/B, bạn có thể chỉ định hình ảnh khôi phục bằng cách sử dụng hình ảnh khởi động phiên bản 3 cho hình ảnh khởi động và hình ảnh khởi động phiên bản 2 cho hình ảnh khôi phục.

  • Không sử dụng GKI và không sử dụng bản cập nhật A/B, bạn có thể chỉ định hình ảnh khôi phục bằng cách sử dụng hình ảnh khởi động phiên bản 1 hoặc 2 cho cả hình ảnh khởi động và hình ảnh khôi phục.

Phiên bản 3 của phiên bản tiêu đề hình ảnh khởi động sử dụng định dạng sau.

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];
};

Tiêu đề hình ảnh khởi động, phiên bản 2

Android 10 cập nhật tiêu đề hình ảnh khởi động lên phiên bản 2, trong đó thêm một phần dành cho thông tin hình ảnh DTB khôi phục (kích thước hình ảnh và địa chỉ tải thực).

Phiên bản 2 của phiên bản tiêu đề hình ảnh khởi động sử dụng định dạng sau.

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 */
};

Tiêu đề hình ảnh khởi động, phiên bản 1

Android 9 chuyển đổi trường unused của tiêu đề hình ảnh khởi động thành trường phiên bản tiêu đề. Các thiết bị chạy Android 9 phải sử dụng tiêu đề hình ảnh khởi động với phiên bản tiêu đề được đặt thành 1 trở lên (điều này đã được VTS xác minh).

Phiên bản 1 của phiên bản tiêu đề hình ảnh khởi động sử dụng định dạng sau.

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 */
};

Các thiết bị không phải A/B có thể chỉ định hình ảnh lớp phủ DTB/ACPI để khôi phục nhằm giúp giảm thiểu lỗi cập nhật qua mạng không dây (OTA). (Thiết bị A/B không gặp vấn đề này và không cần chỉ định hình ảnh lớp phủ.) Bạn có thể chỉ định hình ảnh DTBO hoặc hình ảnh ACPIO, nhưng không thể chỉ định cả hai (vì chúng được sử dụng bởi các cấu trúc khác nhau). Để định cấu hình tiêu đề hình ảnh khởi động chính xác, khi sử dụng:

  • Hình ảnh DTBO để khôi phục, bao gồm các trường recovery_dtbo_sizerecovery_dtbo_offset (không bao gồm các trường recovery_acpio_sizerecovery_acpio_offset).

  • Hình ảnh ACPIO để khôi phục, bao gồm các trường recovery_acpio_sizerecovery_acpio_offset (không bao gồm các trường recovery_dtbo_sizerecovery_dtbo_offset).

Trường header_size chứa kích thước của tiêu đề hình ảnh khởi động. Nếu phiên bản tiêu đề của hình ảnh khởi động được đặt thành 1, thì trường id sẽ chứa chuỗi đại diện SHA-1 cho phần recovery_[dtbo|acpio] của hình ảnh khởi động, ngoài kernel, ramdisksecond sections. Để biết thông tin chi tiết về các trường recovery_[dtbo|acpio]_sizerecovery_[dtbo|acpio]_offset, hãy xem Hình ảnh khôi phục.

Tiêu đề hình ảnh khởi động cũ, phiên bản 0

Các thiết bị khởi chạy trước Android 9 bằng tiêu đề hình ảnh khởi động cũ được xem là đang sử dụng tiêu đề hình ảnh khởi động phiên bản 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];
};