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 đề:
|
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 :
|
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 :
|
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ố base là 0x10000000 và đối số dtb_offset là 0x01000000 , 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 GKI và chế độ 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_size
vàsecond_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_size
vàrecovery_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_size
vàdtb_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_size
vàrecovery_dtbo_offset
(không bao gồm các trườngrecovery_acpio_size
vàrecovery_acpio_offset
).Hình ảnh ACPIO để khôi phục, bao gồm các trường
recovery_acpio_size
vàrecovery_acpio_offset
(và không bao gồm các trườngrecovery_dtbo_size
vàrecovery_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
, ramdisk
và second sections
. Để biết thông tin chi tiết về các trường recovery_[dtbo|acpio]_size
và recovery_[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];
};