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

Android 9 เปิดตัวช่องเวอร์ชันในอิมเมจเปิดเครื่อง ทำให้สามารถใช้งานการอัปเดตส่วนหัวได้ และในขณะเดียวกันก็ยังรักษาความเข้ากันได้แบบย้อนหลังได้ด้วย Bootloader ต้องตรวจสอบช่องเวอร์ชันส่วนหัวและแยกวิเคราะห์ส่วนหัว ตามนั้น อุปกรณ์ที่กำลังจะเปิดตัวด้วย:

  • Android 13 สามารถใช้ส่วนหัวการเปิดเครื่องเวอร์ชัน 3 หรือ 4 สำหรับ อุปกรณ์ที่รองรับอิมเมจเคอร์เนลทั่วไป (GKI) สถาปัตยกรรมเวอร์ชัน 4 คืออิมเมจการเปิดเครื่องหลักและ os_version ในส่วนหัวการเปิดเครื่องต้องเป็น 0 คาดว่า Bootloader ของอุปกรณ์ รับข้อมูลเวอร์ชันจากการเปิดเครื่องที่ได้รับการยืนยันของ Android (AVB) พร็อพเพอร์ตี้แทน
  • Android 12 สามารถใช้ส่วนหัวเปิดเครื่องเวอร์ชัน 3 หรือ 4 ได้ สำหรับ อุปกรณ์ที่รองรับอิมเมจเคอร์เนลทั่วไป (GKI) สถาปัตยกรรมเวอร์ชัน 4 คืออิมเมจการเปิดเครื่องหลัก
  • Android 11 สามารถใช้ส่วนหัวการเปิดเครื่องเวอร์ชัน 3 ได้ สำหรับ อุปกรณ์ที่รองรับอิมเมจเคอร์เนลทั่วไป (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 ตั้งค่าเวอร์ชันส่วนหัวของอิมเมจการเปิดเครื่อง อิมเมจการเปิดเครื่องที่มีเวอร์ชันส่วนหัว:
  • 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 (AOSP) โปรดตรวจสอบรายการการเปลี่ยนแปลงที่เกี่ยวข้อง สำหรับส่วนหัวอิมเมจการเปิดเครื่อง การกำหนดเวอร์ชัน

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

Android 12 มี boot_signature ในอิมเมจเปิดเครื่อง ส่วนหัวเวอร์ชัน 4 ซึ่งสามารถใช้เพื่อตรวจสอบความสมบูรณ์ของเคอร์เนลและ ramdisk การตรวจสอบเสร็จสิ้นใน VtsSecurityAvbTest และจำเป็นสำหรับอุปกรณ์ที่ใช้สถาปัตยกรรม GKI อย่างไรก็ตาม boot_signature ไม่เกี่ยวข้องกับกระบวนการเปิดเครื่องที่ได้รับการยืนยันเฉพาะอุปกรณ์ และใช้เฉพาะใน VTS เท่านั้น ดูกระดาน Boot.img ของ GKI การกำหนดค่า และการเปิดเครื่องที่ได้รับการยืนยัน GKI การตั้งค่า เพื่อดูรายละเอียด

อิมเมจการเปิดเครื่องของผู้ให้บริการ ส่วนหัว เวอร์ชัน 4 รองรับ Fragment ของ RAM ของผู้ให้บริการหลายรายการ

เวอร์ชัน 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

  • Device Tree Blob (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];
};