هدر تصویر بوت

اندروید 9 یک فیلد نسخه را در هدر تصویر راه‌اندازی معرفی کرد که به‌روزرسانی‌های هدر را در عین حفظ سازگاری با عقب، فعال می‌کرد. بوت لودر باید قسمت نسخه هدر را بررسی کرده و هدر را بر اساس آن تجزیه کند. راه اندازی دستگاه هایی با:

  • Android 13 می‌تواند از نسخه 3 یا 4 هدر بوت استفاده کند. برای دستگاه‌هایی که از معماری هسته عمومی (GKI) پشتیبانی می‌کنند، نسخه 4 تصویر اولیه راه‌اندازی است و فیلد os_version در هدر بوت باید صفر باشد. انتظار می رود بوت لودر دستگاه به جای آن اطلاعات نسخه را از ویژگی های Android Verified Boot (AVB) بدست آورد.
  • Android 12 می‌تواند از نسخه 3 یا 4 سرصفحه بوت استفاده کند. برای دستگاه‌هایی که از معماری هسته عمومی (GKI) پشتیبانی می‌کنند، نسخه 4 تصویر اولیه راه‌اندازی است.
  • Android 11 می‌تواند از نسخه 3 هدر بوت استفاده کند. برای دستگاه‌هایی که از معماری هسته عمومی (GKI) پشتیبانی می‌کنند، این نسخه باید برای تصویر راه‌اندازی اولیه استفاده شود.
  • اندروید 10 باید از هدر بوت نسخه 2 استفاده کند.
  • اندروید 9 باید از هدر بوت نسخه 1 استفاده کند.
  • اندروید 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 برای معماری هایی که به جای DTB از ACPI استفاده می کنند استفاده می شود. مسیر تصویر 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)

سیستم ساخت اندروید از متغیر BoardConfig BOARD_PREBUILT_DTBOIMAGE برای تنظیم آرگومان recovery_dtbo ابزار mkbootimg در حین ایجاد تصویر بازیابی استفاده می کند. برای جزئیات در مورد تغییرات پروژه منبع باز Android (AOSP)، فهرست‌های تغییرات مرتبط را برای نسخه‌بندی سرصفحه تصویر بوت مرور کنید.

هدر تصویر بوت، نسخه 4

اندروید 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

اندروید 11 هدر تصویر بوت را به نسخه 3 به روز می کند که داده های زیر را حذف می کند:

  • بوت لودر مرحله دوم فیلدهای second_size و second_addr دیگر در هدر تصویر بوت ظاهر نمی شوند. دستگاه های دارای بوت لودر مرحله دوم باید آن بوت لودر را در پارتیشن خود ذخیره کنند.

  • تصویر بازیابی الزام برای تعیین تصویر بازیابی منسوخ شده است و فیلدهای recovery_dtbo_size ، recovery_dtbo_offset ، recovery_acpio_size و recovery_acpio_offset دیگر در سرصفحه تصویر بوت ظاهر نمی شوند.

    • دستگاه‌های A/B از یک طرح به‌روزرسانی و بازیابی استفاده می‌کنند که تعیین یک تصویر DTBO یا ACPIO را برای بازیابی غیرضروری می‌کند.

    • دستگاه‌های غیرA/B که می‌خواهند یک تصویر بازیابی را مشخص کنند (اعم از DTBO یا ACPIO) باید از هدر تصویر بوت نسخه ۱ یا ۲ استفاده کنند.

  • حباب درخت دستگاه (DTB). DTB در پارتیشن راه‌اندازی فروشنده ذخیره می‌شود، بنابراین فیلدهای dtb_size و dtb_addr دیگر در هدر تصویر راه‌اندازی ظاهر نمی‌شوند (اما در هدر تصویر راه‌اندازی فروشنده وجود دارند).

دستگاه‌ها می‌توانند از هدر تصویر بوت نسخه 3 برای مطابقت با معماری Generic Kernel Image (GKI) استفاده کنند، که هسته اصلی را متحد می‌کند و ماژول‌های فروشنده را که برای بوت مورد نیاز هستند به پارتیشن vendor_boot منتقل می‌کند (به این معنی که تصویر بوت فقط شامل اجزای GKI است). دستگاه هایی که:

  • استفاده از GKI (نیاز به android-4.19 یا android-5.4) اما عدم استفاده از به‌روزرسانی‌های A/B می‌تواند تصویر بازیابی را با استفاده از Boot Image نسخه 3 برای تصویر بوت و Boot Image نسخه 2 برای تصویر بازیابی مشخص کند.

  • از GKI استفاده نکنید و از A/B استفاده نکنید، به‌روزرسانی‌های A/B می‌توانند یک تصویر بازیابی را با استفاده از Boot Image نسخه 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

اندروید 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

اندروید 9 فیلد unused هدر تصویر بوت را به فیلد نسخه هدر تبدیل می کند. دستگاه‌هایی که با Android 9 راه‌اندازی می‌شوند باید از هدر تصویر بوت با نسخه هدر تنظیم شده روی ۱ یا بالاتر استفاده کنند (این توسط 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 را تعیین کنید، اما نه هر دو را (زیرا توسط معماری‌های مختلف استفاده می‌شوند). برای پیکربندی صحیح هدر تصویر بوت، هنگام استفاده از:

  • یک تصویر 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

دستگاه‌هایی که قبل از اندروید 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];
};