Android 9 เปิดตัวช่องเวอร์ชันในส่วนหัวของอิมเมจสำหรับบูต ซึ่งช่วยให้อัปเดตส่วนหัวได้ในขณะที่ยังคงความเข้ากันได้แบบย้อนหลัง bootloader ต้องตรวจสอบฟิลด์เวอร์ชันของส่วนหัวและแยกวิเคราะห์ส่วนหัวตามนั้น อุปกรณ์ที่เปิดตัวด้วย:
- Android 13 สามารถใช้ส่วนหัวสำหรับบูตเวอร์ชัน 3 หรือ 4 ได้ สำหรับอุปกรณ์ที่รองรับสถาปัตยกรรม Generic Kernel Image (GKI) เวอร์ชัน 4 จะเป็นอิมเมจสำหรับบูตหลัก และช่อง
os_version
ในส่วนหัวสำหรับบูตต้องเป็นศูนย์ คาดว่าอุปกรณ์ bootloader จะได้รับข้อมูลเวอร์ชันจาก คุณสมบัติ Android Verified Boot (AVB) แทน - Android 12 สามารถใช้ส่วนหัวสำหรับบูตเวอร์ชัน 3 หรือ 4 ได้ สำหรับอุปกรณ์ที่รองรับสถาปัตยกรรม Generic Kernel Image (GKI) เวอร์ชัน 4 จะเป็นอิมเมจสำหรับบูตหลัก
- Android 11 สามารถใช้ส่วนหัวสำหรับบูตเวอร์ชัน 3 ได้ สำหรับอุปกรณ์ที่รองรับสถาปัตยกรรม Generic Kernel Image (GKI) จะต้องใช้เวอร์ชันนี้สำหรับอิมเมจสำหรับบูตหลัก
- Android 10 ต้องใช้ส่วนหัวการบูตเวอร์ชัน 2
- Android 9 ต้องใช้ส่วนหัวการบูตเวอร์ชัน 1
- Android 8 และต่ำกว่าถือเป็นการใช้ส่วนหัวของอิมเมจสำหรับบูตเวอร์ชัน 0
สำหรับอุปกรณ์ทั้งหมดที่ใช้ Android 9 หรือสูงกว่า Vendor Test Suite (VTS) จะตรวจสอบรูปแบบของอิมเมจสำหรับ boot/recovery
เพื่อให้แน่ใจว่าส่วนหัวของอิมเมจสำหรับบูตใช้เวอร์ชันที่ถูกต้อง หากต้องการดูรายละเอียด AOSP บนส่วนหัวบูทและอิมเมจบูทของผู้จำหน่ายที่รองรับในปัจจุบันทั้งหมด โปรดดูที่ system/tools/mkbootimg/include/bootimg/bootimg.h
การใช้การกำหนดเวอร์ชันส่วนหัวของอิมเมจสำหรับบูต
เครื่องมือ mkbootimg
ยอมรับอาร์กิวเมนต์ต่อไปนี้
การโต้แย้ง | คำอธิบาย |
---|---|
header_version | ตั้งค่าเวอร์ชันส่วนหัวของอิมเมจสำหรับบูต อิมเมจสำหรับบูตที่มีเวอร์ชันส่วนหัว:
|
recovery_dtbo | ใช้สำหรับสถาปัตยกรรมที่ใช้ DTB ระบุเส้นทางไปยังอิมเมจ DTBO การกู้คืน ตัวเลือกเสริมสำหรับอุปกรณ์ A/B ซึ่งไม่ต้องการอิมเมจการกู้คืน อุปกรณ์ที่ไม่ใช่ A/B ที่ใช้ header_version :
|
recovery_acpio | ใช้สำหรับสถาปัตยกรรมที่ใช้ ACPI แทน DTB ระบุเส้นทางไปยังอิมเมจ ACPIO การกู้คืน ตัวเลือกเสริมสำหรับอุปกรณ์ A/B ซึ่งไม่ต้องการอิมเมจการกู้คืน อุปกรณ์ที่ไม่ใช่ A/B ที่ใช้ header_version :
|
dtb | เส้นทางไปยังอิมเมจ DTB ที่รวมอยู่ในอิมเมจสำหรับบูต/กู้คืน |
dtb_offset | เมื่อเพิ่มลงในอาร์กิวเมนต์ base ให้ระบุที่อยู่โหลดจริงสำหรับแผนผังอุปกรณ์ขั้นสุดท้าย ตัวอย่างเช่น หากอาร์กิวเมนต์ base คือ 0x10000000 และอาร์กิวเมนต์ dtb_offset คือ 0x01000000 dtb_addr_field ในส่วนหัวของอิมเมจสำหรับบูตจะถูกเติมเป็น 0x11000000 |
อุปกรณ์ BoardConfig.mk
ใช้ config BOARD_MKBOOTIMG_ARGS
เพื่อเพิ่ม header version
ให้กับอาร์กิวเมนต์เฉพาะบอร์ดอื่นๆ ของ mkbootimg
ตัวอย่างเช่น:
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
ระบบบิลด์ Android ใช้ตัวแปร BoardConfig
BOARD_PREBUILT_DTBOIMAGE
เพื่อตั้งค่าอาร์กิวเมนต์ recovery_dtbo
ของเครื่องมือ mkbootimg
ระหว่างการสร้างอิมเมจการกู้คืน สำหรับรายละเอียดเกี่ยวกับการเปลี่ยนแปลง Android Open Source Project (AOSP) โปรดดู รายการเปลี่ยนแปลงที่เกี่ยวข้องสำหรับการกำหนดเวอร์ชันส่วนหัวของอิมเมจสำหรับบูต
ส่วนหัวของอิมเมจสำหรับบูต เวอร์ชัน 4
Android 12 มี boot_signature
ในส่วนหัวของอิมเมจสำหรับบูตเวอร์ชัน 4 ซึ่งสามารถใช้เพื่อตรวจสอบความสมบูรณ์ของเคอร์เนลและ ramdisk การตรวจสอบเสร็จสิ้นใน VtsSecurityAvbTest และจำเป็นสำหรับอุปกรณ์ที่ใช้สถาปัตยกรรม GKI อย่างไรก็ตาม boot_signature
ไม่เกี่ยวข้องกับกระบวนการบูตที่ได้รับการตรวจสอบเฉพาะอุปกรณ์ และใช้ใน VTS เท่านั้น ดู การกำหนดค่าบอร์ด GKI boot.img และ การตั้งค่าการบูตที่ตรวจสอบโดย GKI สำหรับรายละเอียด
ส่วนหัวอิมเมจสำหรับบูตของผู้จำหน่าย เวอร์ชัน 4 รองรับแฟรกเมนต์ ramdisk ของผู้จำหน่ายหลายรายการ
เวอร์ชัน 4 ของเวอร์ชันส่วนหัวของอิมเมจสำหรับบูตใช้รูปแบบต่อไปนี้
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 */
};
ส่วนหัวของอิมเมจสำหรับบูต เวอร์ชัน 3
Android 11 อัปเดตส่วนหัวของอิมเมจสำหรับบูตเป็นเวอร์ชัน 3 ซึ่งจะลบข้อมูลต่อไปนี้:
bootloader ขั้นที่สอง ฟิลด์
second_size
และsecond_addr
จะไม่ปรากฏในส่วนหัวของอิมเมจสำหรับบูตอีกต่อไป อุปกรณ์ที่มีโปรแกรมโหลดบูตขั้นที่สองจะต้องจัดเก็บโปรแกรมโหลดบูตนั้นไว้ในพาร์ติชันของตัวเองอิมเมจการกู้คืน ข้อกำหนดสำหรับการระบุอิมเมจการกู้คืนถูกยกเลิกแล้ว และฟิลด์
recovery_dtbo_size
,recovery_dtbo_offset
,recovery_acpio_size
และrecovery_acpio_offset
จะไม่ปรากฏในส่วนหัวของอิมเมจสำหรับบูตอีกต่อไปอุปกรณ์ A/B ใช้แผนการอัปเดตและการกู้คืนซึ่งทำให้ไม่จำเป็นต้องระบุอิมเมจ DTBO หรือ ACPIO สำหรับการกู้คืน
อุปกรณ์ที่ไม่ใช่ A/B ที่ต้องการระบุอิมเมจการกู้คืน (DTBO หรือ ACPIO) ควรใช้ส่วนหัวของอิมเมจสำหรับบูตเวอร์ชัน 1 หรือ 2
ทรีหยดอุปกรณ์ (DTB) DTB ถูกจัดเก็บไว้ใน พาร์ติชันสำหรับบูตของผู้จำหน่าย ดังนั้นฟิลด์
dtb_size
และdtb_addr
จะไม่ปรากฏในส่วนหัวของอิมเมจสำหรับบูตอีกต่อไป (แต่จะมีอยู่ในส่วนหัวของอิมเมจสำหรับบูตของผู้จำหน่าย)
อุปกรณ์สามารถใช้ส่วนหัวของอิมเมจสำหรับบูตเวอร์ชัน 3 เพื่อให้สอดคล้องกับสถาปัตยกรรม Generic Kernel Image (GKI) ซึ่งรวมเคอร์เนลหลักไว้เป็นหนึ่งเดียวและย้ายโมดูลผู้จำหน่ายที่จำเป็นสำหรับการบู๊ตไปยังพาร์ติ vendor_boot
(หมายถึงอิมเมจสำหรับบูตประกอบด้วยส่วนประกอบ GKI เท่านั้น) อุปกรณ์ที่:
ใช้ GKI (ต้องใช้เคอร์เนล android-4.19 หรือ android-5.4) แต่ไม่ใช้การอัปเดต A/B สามารถระบุอิมเมจการกู้คืนได้โดยใช้อิมเมจสำหรับบูตเวอร์ชัน 3 สำหรับอิมเมจสำหรับบูตและอิมเมจสำหรับบูตเวอร์ชัน 2 สำหรับอิมเมจการกู้คืน
อย่าใช้ GKI และอย่าใช้การอัปเดต A/B สามารถระบุอิมเมจการกู้คืนได้โดยใช้อิมเมจสำหรับบูตเวอร์ชัน 1 หรือ 2 สำหรับทั้งอิมเมจสำหรับบูตและอิมเมจการกู้คืน
เวอร์ชัน 3 ของเวอร์ชันส่วนหัวของอิมเมจสำหรับบูตใช้รูปแบบต่อไปนี้
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];
};
ส่วนหัวของอิมเมจสำหรับบูต เวอร์ชัน 2
Android 10 อัปเดตส่วนหัวของอิมเมจสำหรับบูตเป็นเวอร์ชัน 2 ซึ่งเพิ่มส่วนสำหรับข้อมูล อิมเมจ DTB สำหรับการกู้คืน (ขนาดรูปภาพและที่อยู่การโหลดจริง)
เวอร์ชัน 2 ของเวอร์ชันส่วนหัวของอิมเมจสำหรับบูตใช้รูปแบบต่อไปนี้
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 */
};
ส่วนหัวของอิมเมจสำหรับบูต เวอร์ชัน 1
Android 9 แปลงฟิลด์ unused
ของส่วนหัวอิมเมจสำหรับบูตเป็นฟิลด์เวอร์ชันส่วนหัว อุปกรณ์ที่เปิดตัวด้วย Android 9 ต้องใช้ส่วนหัวของอิมเมจสำหรับบูตโดยตั้งค่าเวอร์ชันส่วนหัวเป็น 1 หรือสูงกว่า (ซึ่งตรวจสอบโดย VTS)
เวอร์ชัน 1 ของเวอร์ชันส่วนหัวของอิมเมจสำหรับบูตใช้รูปแบบต่อไปนี้
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 */
};
อุปกรณ์ที่ไม่ใช่ A/B สามารถระบุ อิมเมจซ้อนทับ DTB/ACPI สำหรับการกู้คืน เพื่อช่วยลดความล้มเหลวในการอัปเดตแบบ over-the-air (OTA) (อุปกรณ์ A/B ไม่มีปัญหานี้และไม่จำเป็นต้องระบุรูปภาพซ้อนทับ) คุณสามารถระบุรูปภาพ DTBO หรือรูปภาพ ACPIO ได้ แต่จะระบุทั้งสองอย่างไม่ได้ (เนื่องจากใช้โดยสถาปัตยกรรมที่แตกต่างกัน) หากต้องการกำหนดค่าส่วนหัวของอิมเมจสำหรับบูตอย่างถูกต้อง เมื่อใช้:
อิมเมจ DTBO สำหรับการกู้คืน รวมฟิลด์
recovery_dtbo_size
และrecovery_dtbo_offset
(และไม่รวมฟิลด์recovery_acpio_size
และrecovery_acpio_offset
)อิมเมจ ACPIO สำหรับการกู้คืน รวมฟิลด์
recovery_acpio_size
และrecovery_acpio_offset
(และไม่รวมฟิลด์recovery_dtbo_size
และrecovery_dtbo_offset
)
ฟิลด์ header_size
มีขนาดของส่วนหัวของอิมเมจสำหรับบูต หากเวอร์ชันส่วนหัวของอิมเมจสำหรับบูตตั้งค่าเป็น 1 ฟิลด์ id
จะมีการแยกย่อย SHA-1 สำหรับส่วน recovery_[dtbo|acpio]
ของอิมเมจสำหรับบูต นอกเหนือจาก kernel
, ramdisk
และ second sections
สำหรับรายละเอียดเกี่ยวกับ recovery_[dtbo|acpio]_size
และ recovery_[dtbo|acpio]_offset
โปรดดูที่ อิมเมจการกู้คืน
ส่วนหัวของอิมเมจสำหรับบูตแบบเดิม เวอร์ชัน 0
อุปกรณ์ที่เปิดตัวก่อน Android 9 โดยใช้ส่วนหัวของอิมเมจสำหรับบูตแบบเดิมจะถือว่าใช้ส่วนหัวของอิมเมจสำหรับบูตเวอร์ชัน 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];
};