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

Android 9 đã giới thiệu 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. Bộ nạp khởi động phải kiểm tra trường phiên bản tiêu đề và phân tích tiêu đề tương ứng. Thiết bị khởi chạy với:

  • 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ợ kiến ​​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 đó, bộ tải khởi động thiết bị dự kiến ​​sẽ lấy thông tin phiên bản từ thuộc tính Khởi động được xác minh 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ợ kiến ​​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ợ kiến ​​trúc Hình ảnh hạt nhân chung (GKI) , 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 boot header 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ả các thiết bị chạy Android 9 trở lên, Bộ kiểm tra 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 chi tiết AOSP trên tất cả các tiêu đề hình ảnh khởi động của nhà cung cấp và khởi động hiện đượ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.

Lý lẽ Sự miêu tả
header_version Đặt phiên bản tiêu đề hình ảnh khởi động. Hình ảnh khởi động với 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 Được sử 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. Tùy chọn cho 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 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 Được sử 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. Tùy chọn cho 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 sử dụng phần recovery_dtbo để chỉ định đường dẫn đến image 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 được thêm vào đối số base , sẽ cung cấp địa chỉ tải vật lý 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 đề ảnh khởi động đượ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 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 công cụ mkbootimg trong quá trình tạo hình ảnh khôi phục. Để biết chi tiết về các thay đổi của Dự án mã nguồn mở Android (AOSP), hãy xem lại danh sách thay đổi liên quan để lập 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. Bạn có thể dùng thông tin này để kiểm tra tính toàn vẹn của kernel và ramdisk. Việc kiểm tra được thực hiện trong VtsSecurityAvbTest và 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 liên quan đến quá trình khởi động được xác minh dành riêng cho thiết bị và chỉ được sử dụng trong VTS. Xem cấu hình bảng GKI boot.imgcài đặt khởi động được xác minh GKI để biết 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 đoạn đĩa ram của nhà cung cấp.

Phiên bản 4 của phiên bản tiêu đề ả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 lên phiên bản 3, loại bỏ dữ liệu sau:

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

  • Hình ảnh phục hồi. 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 đề hình ảnh khởi động.

    • Các thiết bị A/B sử dụng sơ đồ 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 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 vùng khởi động của nhà cung cấp , do đó 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 hiện diện 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ủ kiến ​​trúc Hình ảnh hạt nhân chung (GKI) , kiến ​​trúc này hợp nhất nhân lõi và di chuyển các mô-đun của nhà cung cấp cần thiết để khởi động vào phân vùng vendor_boot (có nghĩa là hình ảnh khởi động chỉ chứa các thành phần GKI). Các thiết bị:

  • Sử dụng GKI (yêu cầu kernel 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à hình ảnh khôi phục.

Phiên bản 3 của phiên bản tiêu đề ả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, bổ sung thêm phần thông tin hình ảnh DTB khôi phục (kích thước hình ảnh và địa chỉ tải vật lý).

Phiên bản 2 của phiên bản tiêu đề ả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ị khởi chạy bằng 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 hoặc cao hơn (điều này đã được VTS xác minh).

Phiên bản 1 của phiên bản tiêu đề ả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 (OTA). (Thiết bị A/B không gặp phải 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 kiến ​​trúc khác nhau). Để định cấu hình chính xác tiêu đề ả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 (và 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 đề ảnh khởi động. Nếu phiên bản tiêu đề ảnh khởi động được đặt thành 1 thì trường id chứa thông báo SHA-1 cho phần recovery_[dtbo|acpio] của ảnh khởi động ngoài 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 kế thừa, phiên bản 0

Các thiết bị được khởi chạy 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];
};