หัวภาพบูต

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

  • Android 12 สามารถใช้บูตหัวรุ่น 3 หรือ 4 สำหรับอุปกรณ์ที่สนับสนุน ทั่วไป Kernel ภาพ (GKI) สถาปัตยกรรมรุ่น 4 เป็นภาพบูตหลัก
  • Android 11 สามารถใช้รุ่นหัวบูต 3. สำหรับอุปกรณ์ที่รองรับ ทั่วไป Kernel ภาพ (GKI) สถาปัตยกรรมรุ่นนี้จะต้องนำมาใช้สำหรับภาพบูตหลัก
  • Android 10 ต้องใช้ส่วนหัวสำหรับบูตเวอร์ชัน 2
  • Android 9 ต้องใช้ส่วนหัวสำหรับบูตเวอร์ชัน 1
  • Android 8 และต่ำกว่านั้นถือเป็นการใช้ส่วนหัวของอิมเมจสำหรับบูตเวอร์ชัน 0

สำหรับอุปกรณ์ทั้งหมดที่ใช้กับ Android 9 หรือสูงกว่า การทดสอบผู้ขาย 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 ซึ่งไม่ต้องการอิมเมจการกู้คืน Non-A / B ใช้อุปกรณ์ header_version :
  • 1 หรือ 2 สามารถระบุเส้นทางนี้หรือใช้ recovery_acpio ส่วนเพื่อระบุเส้นทางที่จะกู้คืน ACPIO ภาพ
  • 3 ไม่สามารถระบุอิมเมจ DTBO การกู้คืน
recovery_acpio ใช้สำหรับสถาปัตยกรรมที่ใช้ ACPI แทน DTB ระบุพาธไปยังอิมเมจ ACPIO การกู้คืน ตัวเลือกสำหรับอุปกรณ์ A/B ซึ่งไม่ต้องการอิมเมจการกู้คืน Non-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)

หุ่นยนต์ที่สร้างระบบการใช้ BoardConfig ตัวแปร BOARD_PREBUILT_DTBOIMAGE การตั้งอาร์กิวเมนต์ recovery_dtbo ของ mkbootimg เครื่องมือในระหว่างการสร้างภาพการกู้คืน สำหรับรายละเอียดใน Android Open Source Project (AOSP) การเปลี่ยนแปลงให้ตรวจสอบ รายการการเปลี่ยนแปลงที่เกี่ยวข้องสำหรับภาพบูตหัวเวอร์ชัน

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

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

ผู้ขายบูตภาพส่วนหัว 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 เขตไม่ปรากฏในส่วนหัวของภาพบูต อุปกรณ์ที่มี bootloader ขั้นที่สองต้องเก็บ 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 รุ่นเพื่อให้สอดคล้องกับ ทั่วไป Kernel ภาพ (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 */
};

Non-A / B อุปกรณ์สามารถระบุ ภาพซ้อนทับ DTB / ACPI สำหรับการกู้คืน เพื่อช่วยลดมากกว่า-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];
};