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 đề tương ứng. 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. Trình tải khởi động thiết bị dự kiến sẽ lấy thông tin phiên bản từ các thuộc tính Xác minh quy trình khởi động 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 nhân hệ điều hành 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 coi là 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ộ kiểm thử 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 đề hình ảnh khởi động sử dụng đúng phiên bản. Để xem thông tin chi tiết về AOSP trên tất 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 tính năng tạo 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ố Mô tả
header_version Đặt phiên bản tiêu đề 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 cấu trúc sử dụng DTB. Chỉ định đường dẫn đến hình ảnh DTBO phục hồi. 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. 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 sử 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 cấu 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. 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 sử 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 đề 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ố dành riêng cho bo mạch khác 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ề các thay đổi đối với Dự án nguồn mở Android (AOSP), hãy xem danh sách thay đổi liên quan đến việc 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. Hãy xem cấu hình bảng boot.img của GKIchế độ cài đặt khởi động đã 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 ổ đĩa RAM của nhà cung cấp.

Phiên bản 4 của 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.

  • Hình ả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, đồng thời 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.

  • Tệp 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 (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), giúp hợp nhất hạ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 sang 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 hạt nhân android-4.19 hoặc android-5.4) nhưng không sử dụng bản cập nhật A/B 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 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à khôi phục.

Phiên bản 3 của 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, thêm một phần 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 (VTS xác minh điều này).

Phiên bản 1 của 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 các 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ì các hình ảnh này được các cấu trúc khác nhau sử dụng). Để định cấu hình chính xác tiêu đề hình ảnh khởi động, 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 (và 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 đề 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 phần 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ị ra mắt trước Android 9 sử dụng tiêu đề hình ảnh khởi động cũ được coi là 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];
};