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

Android 9 ra mắt một trường phiên bản trong 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. Cho các thiết bị hỗ trợ Hình ảnh hạt nhân chung (GKI) cấu trúc, phiên bản 4 là hình ảnh khởi động chính và 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ừ chương trình Xác minh quy trình khởi động của Android (AVB) thuộc tính.
  • Android 12 có thể sử dụng tiêu đề khởi động phiên bản 3 hoặc 4. Cho các thiết bị hỗ trợ Hình ảnh hạt nhân chung (GKI) cấu trúc, 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. Cho các thiết bị hỗ trợ Hình ảnh hạt nhân chung (GKI) cấu trúc, phiên bản này phải được sử dụng 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ả các thiết bị chạy Android 9 trở lên, Bộ thử nghiệm dành cho nhà cung cấp (VTS) 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 hình ảnh . Cách xem thông tin chi tiết về AOSP (Dự án nguồn mở Android) đối với tất cả tính năng khởi động được hỗ trợ và khởi động của nhà cung cấp tiêu đề hình ảnh, 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ố 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 khôi phục Hình ảnh DTBO. 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 áp dụng A/B sử dụng header_version:
  • 1 hoặc 2 có thể chỉ định đường dẫn này hoặc dùng recovery_acpio để chỉ định đường dẫn tới 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 vào 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 áp dụng A/B sử dụng header_version:
  • 1 hoặc 2 có thể chỉ định đường dẫn này hoặc dùng recovery_dtbo để chỉ định đường dẫn tới 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 tải trọng vật lý cho cây thiết bị cuối cùng. Ví dụ: nếu base đối số là 0x10000000 và đối số dtb_offset0x01000000, dtb_addr_field trong hình ảnh khởi động tiêu đề được điền là 0x11000000.

Thiết bị BoardConfig.mk sử dụng cấu hình BOARD_MKBOOTIMG_ARGS để thêm header version cho các đối số bảng 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 mkbootimg trong quá trình tạo hình ảnh khôi phục. Để biết chi tiết về Các 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 cho tiêu đề hình ảnh khởi động tạo phiên bản.

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

Android 12 cung cấp boot_signature trong hình ảnh khởi động tiêu đề phiên bản 4, có thể dùng để kiểm tra tính toàn vẹn của nhân và ổ đĩa RAM. Quy trình kiểm tra sẽ hoàn tất sau Bài kiểm tra VtsSecurityAvb 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 quá trình xác minh quy trình khởi động dành riêng cho thiết bị và chỉ được dùng trong VTS. Xem bảng GKI boot.img" cấu hìnhquy trình khởi động được xác minh của GKI cài đặt để biết thông tin chi tiết.

Hình ảnh khởi động của nhà cung cấp tiêu đề 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. Thao tác này sẽ xoá dữ liệu sau:

  • Trình tải khởi động giai đoạn hai. Trường second_sizesecond_addr không xuất hiện dài hơn trong tiêu đề hình ảnh khởi động. Thiết bị có trình tải khởi động giai đoạn hai phải lưu trữ trình tải khởi động đó trong phân vùng riêng.

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

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

    • Các thiết bị không phải thiết bị A/B muốn chỉ định hình ảnh khôi phục (DTBO hoặc ACPIO) nên 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 khởi động của nhà cung cấp phân vùng, để các trường dtb_sizedtb_addr không còn xuất hiện trong hình ảnh khởi động nữa tiêu đề (nhưng có trong tiêu đề hình ảnh khởi động của nhà cung cấp).

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

  • Sử dụng GKI (yêu cầu 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 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 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 thành phiên bản 2, Tính năng này thêm một phần dành cho DTB khôi phục thông tin về hình ảnh (kích thước hình ảnh và địa chỉ tải trọng vật lý).

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 phần khởi động tiêu đề hình ảnh vào trường phiên bản tiêu đề. Thiết bị chạy Android 9 phải sử dụng tiêu đề hình ảnh khởi động cùng với tiêu đề phiên bản được đặt thành 1 trở lên (thông tin 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 cho khôi phục để 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 sự cố 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 một hình ảnh ACPIO, chứ không phải cả hai (vì chúng được sử dụng bởi các kiến 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 recovery_dtbo_size và Trường recovery_dtbo_offset (và không bao gồm recovery_acpio_sizerecovery_acpio_offset trường).

  • Hình ảnh ACPIO để khôi phục, bao gồm recovery_acpio_size và Trường recovery_acpio_offset (và không bao gồm recovery_dtbo_sizerecovery_dtbo_offset trường).

Trường header_size chứa kích thước của tiêu đề hình ảnh khởi động. Nếu khởi động phiên bản tiêu đề hình ảnh được đặt thành 1, trường id chứa thông báo SHA-1 cho phần recovery_[dtbo|acpio] của hình ảnh khởi động, ngoài phần tử kernel, ramdisksecond sections. Để biết 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

Thiết bị chạy trước Android 9 bằng phiên bản cũ tiêu đề của hình ảnh khởi động được xem 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];
};