ส่วนหัวของรูปภาพเปิดเครื่อง

Android 9 ได้เปิดตัวช่องเวอร์ชันในส่วนหัวของภาพการบูต ซึ่งช่วยให้อัปเดตส่วนหัวได้ในขณะที่ยังคงใช้งานร่วมกับเวอร์ชันเก่าได้ บูตโหลดเดอร์ต้องตรวจสอบช่องเวอร์ชันส่วนหัวและแยกวิเคราะห์ส่วนหัวตามนั้น อุปกรณ์ที่เปิดตัวด้วย

  • Android 13 สามารถใช้ส่วนหัวการบูตเวอร์ชัน 3 หรือ 4 สำหรับอุปกรณ์ที่รองรับสถาปัตยกรรม Generic Kernel Image (GKI) เวอร์ชัน 4 จะเป็นภาพการบูตหลัก และช่อง os_version ในส่วนหัวของการบูตต้องเป็น 0 คาดว่า 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 ขึ้นไป ชุดทดสอบของผู้ให้บริการ (VTS) จะตรวจสอบรูปแบบของboot/recoveryรูปภาพเพื่อให้แน่ใจว่าส่วนหัวของรูปภาพสำหรับบูตใช้เวอร์ชันที่ถูกต้อง หากต้องการดูรายละเอียด AOSP ในส่วนหัวอิมเมจการเปิดเครื่องและของผู้ให้บริการที่รองรับทั้งหมด โปรดดูที่ system/tools/mkbootimg/include/bootimg/bootimg.h

ใช้การกำหนดเวอร์ชันส่วนหัวของอิมเมจบูท

เครื่องมือ mkbootimg ยอมรับอาร์กิวเมนต์ต่อไปนี้

อาร์กิวเมนต์ คำอธิบาย
header_version ตั้งค่าเวอร์ชันส่วนหัวของอิมเมจสำหรับบูต รูปภาพสำหรับบูตที่มีเวอร์ชันส่วนหัว ดังนี้
  • 1 หรือ 2 รองรับอิมเมจ DTBO สำหรับการกู้คืนหรืออิมเมจ ACPIO สำหรับการกู้คืน
  • 3 ไม่รองรับรูปภาพการกู้คืน
recovery_dtbo ใช้สำหรับสถาปัตยกรรมที่ใช้ DTB ระบุเส้นทางไปยังรูปภาพ DTBO สำหรับการกู้คืน ไม่บังคับสำหรับอุปกรณ์ A/B ซึ่งไม่ต้องใช้อิมเมจการกู้คืน อุปกรณ์ที่ไม่ใช่ A/B ที่ใช้ header_version
  • 1 หรือ 2 สามารถระบุเส้นทางนี้หรือใช้ส่วน recovery_acpioเพื่อระบุเส้นทางไปยังรูปภาพ ACPIO สำหรับการกู้คืน
  • 3 ระบุอิมเมจ DTBO การกู้คืนไม่ได้
recovery_acpio ใช้สำหรับสถาปัตยกรรมที่ใช้ ACPI แทน DTB ระบุเส้นทางไปยังรูปภาพ ACPIO สำหรับการกู้คืน ไม่บังคับสำหรับอุปกรณ์ A/B ซึ่งไม่ต้องใช้อิมเมจการกู้คืน อุปกรณ์ที่ไม่ใช่ A/B ที่ใช้ header_version
  • โดย 1 หรือ 2 จะระบุเส้นทางนี้หรือใช้ส่วน recovery_dtbo เพื่อระบุเส้นทางไปยังอิมเมจ DTBO การกู้คืนได้
  • 3 ระบุอิมเมจ ACPIO การกู้คืนไม่ได้
dtb เส้นทางไปยังอิมเมจ DTB ที่รวมอยู่ในอิมเมจการบูต/การกู้คืน
dtb_offset เมื่อเพิ่มในอาร์กิวเมนต์ base ให้ระบุที่อยู่โหลดจริงสำหรับแผนผังอุปกรณ์สุดท้าย เช่น หากอาร์กิวเมนต์ base เป็น 0x10000000 และอาร์กิวเมนต์ dtb_offset เป็น 0x01000000 ระบบจะป้อนข้อมูล dtb_addr_field ในส่วนหัวของภาพบูตเป็น 0x11000000

อุปกรณ์ BoardConfig.mk ใช้การกำหนดค่า 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 (AOSP) ได้ที่รายการการเปลี่ยนแปลงที่เกี่ยวข้องสำหรับส่วนหัวของภาพสำหรับบูต

ส่วนหัวของอิมเมจบูตเวอร์ชัน 4

Android 12 มี boot_signature ในส่วนหัวของภาพบูตเวอร์ชัน 4 ซึ่งสามารถใช้ตรวจสอบความสมบูรณ์ของเคอร์เนลและแรมดิสก์ได้ การตรวจสอบจะดำเนินการใน VtsSecurityAvbTest และจำเป็นสำหรับอุปกรณ์ที่ใช้สถาปัตยกรรม GKI อย่างไรก็ตาม boot_signature จะไม่เกี่ยวข้องกับกระบวนการเปิดเครื่องที่เชื่อถือได้เฉพาะอุปกรณ์ และจะใช้ใน VTS เท่านั้น ดูรายละเอียดได้ที่การกำหนดค่าบอร์ด Boot.img ของ GKI และการตั้งค่าการเปิดเครื่องที่ได้รับการยืนยัน 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 ระยะที่ 2 ช่อง second_size และ second_addr จะไม่ปรากฏในส่วนหัวของภาพสำหรับบูตอีกต่อไป อุปกรณ์ที่มี Bootloader ระยะที่ 2 ต้องจัดเก็บ Bootloader นั้นไว้ในพาร์ติชันของตัวเอง

  • อิมเมจการกู้คืน เราได้เลิกใช้งานข้อกำหนดในการระบุรูปภาพการกู้คืนแล้ว และช่อง 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 เพื่อปฏิบัติตามสถาปัตยกรรมภาพเคอร์เนลทั่วไป (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 สำหรับการกู้คืนได้เพื่อช่วยลดความล้มเหลวในการอัปเดตผ่านอากาศ (OTA) (อุปกรณ์ A/B จะไม่มีปัญหานี้และ ไม่จำเป็นต้องระบุภาพซ้อนทับ) คุณระบุอิมเมจ DTBO หรือรูปภาพ ACPIO ได้ แต่ระบุทั้ง 2 อย่างไม่ได้ (เนื่องจากใช้ในสถาปัตยกรรมที่ต่างกัน) วิธีกำหนดค่าส่วนหัวของภาพสำหรับบูตอย่างถูกต้องเมื่อใช้

  • รูปภาพ 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];
};