سرایند تصویر راه‌اندازی

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

  • ‫Android 13 می‌تواند از نسخه ۳ یا ۴ سرایند راه‌اندازی استفاده کند. برای دستگاه‌هایی که از معماری تصویر هسته عمومی (GKI) پشتیبانی می‌کنند، نسخه ۴ تصویر راه‌اندازی اصلی است و os_version فیلد در سرایند راه‌اندازی باید صفر باشد. انتظار می‌رود راه‌انداز سیستم دستگاه به‌جای آن، اطلاعات نسخه را از ویژگی‌های «راه‌اندازی درستی‌سنجی‌شده Android» (AVB) دریافت کند.
  • ‫Android 12 می‌تواند از نسخه ۳ یا ۴ سرایند راه‌اندازی استفاده کند. برای دستگاه‌هایی که از معماری تصویر هسته عمومی (GKI) پشتیبانی می‌کنند، نسخه ۴ تصویر راه‌اندازی اصلی است.
  • ‫Android 11 می‌تواند از نسخه ۳ سرایند راه‌اندازی استفاده کند. برای دستگاه‌هایی که از معماری تصویر هسته عمومی (GKI) پشتیبانی می‌کنند، باید از این نسخه برای تصویر راه‌اندازی اصلی استفاده شود.
  • ‫Android 10 باید از نسخه ۲ سرایند راه‌اندازی استفاده کند.
  • Android 9 باید از نسخه ۱ سرایند راه‌اندازی استفاده کند.
  • ‫Android نسخه ۸ و پایین‌تر به‌عنوان استفاده از نسخه ۰ سرصفحه تصویر راه‌اندازی درنظر گرفته می‌شود.

برای همه دستگاه‌هایی که با Android 9 یا بالاتر کار می‌کنند، مجموعه آزمون فروشنده (VTS) قالب boot/recovery تصویر را بررسی می‌کند تا مطمئن شود سرصفحه تصویر راه‌اندازی از نسخه صحیح استفاده می‌کند. برای مشاهده جزئیات AOSP در همه سرصفحه‌های تصویر راه‌اندازی و راه‌اندازی فروشنده پشتیبانی‌شده، به system/tools/mkbootimg/include/bootimg/bootimg.h مراجعه کنید.

پیاده‌سازی نسخه‌بندی سرایند تصویر راه‌اندازی

ابزار mkbootimg آرگومان‌های زیر را می‌پذیرد.

متغیر مستقل شرح
header_version نسخه سرصفحه تصویر راه‌اندازی را تنظیم می‌کند. تصویر راه‌اندازی با نسخه سرایند:
  • ۱ یا ۲ از تصویر DTBO بازیابی یا تصویر ACPIO بازیابی پشتیبانی می‌کند.
  • ‫۳ از تصویرهای بازیابی پشتیبانی نمی‌کند.
recovery_dtbo برای معماری‌هایی که از DTB استفاده می‌کنند استفاده می‌شود. مسیر تصویر DTBO بازیابی را مشخص می‌کند. برای دستگاه‌های A/B اختیاری است، زیرا این دستگاه‌ها به تصویر بازیابی نیاز ندارند. دستگاه‌های غیر A/B که از header_version استفاده می‌کنند:
  • ‫۱ یا ۲ می‌تواند این مسیر را مشخص کند یا از بخش recovery_acpio برای مشخص کردن مسیر تصویر ACPIO بازیابی استفاده کند.
  • ‫۳ نمی‌تواند تصویر DTBO بازیابی را مشخص کند.
recovery_acpio برای معماری‌هایی استفاده می‌شود که به‌جای DTB از ACPI استفاده می‌کنند. مسیر تصویر ACPIO بازیابی را مشخص می‌کند. برای دستگاه‌های A/B اختیاری است، این دستگاه‌ها به تصویر بازیابی نیاز ندارند. دستگاه‌های غیر A/B که از header_version استفاده می‌کنند:
  • ‫۱ یا ۲ می‌تواند این مسیر را مشخص کند یا از بخش recovery_dtbo برای مشخص کردن مسیر تصویر DTBO بازیابی استفاده کند.
  • ‫۳ نمی‌تواند تصویر 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)، فهرست‌های تغییرات مرتبط برای نسخه‌بندی سرصفحه تصویر راه‌اندازی را مرور کنید.

سرایند تصویر راه‌اندازی، نسخه ۴

‫Android 12 boot_signature را در تصویر راه‌اندازی نسخه سرصفحه ۴ ارائه می‌دهد که می‌توان از آن برای بررسی تمامیت هسته و ramdisk استفاده کرد. این بررسی در VtsSecurityAvbTest انجام می‌شود و برای دستگاه‌هایی که از معماری GKI استفاده می‌کنند الزامی است. بااین‌حال، boot_signature در فرایند بوت درستی‌سنجی‌شده مختص دستگاه دخیل نیست و فقط در VTS استفاده می‌شود. برای جزئیات، پیکربندی برد GKI boot.img و تنظیمات راه‌اندازی درستی‌سنجی‌شده GKI را ببینید.

نسخه ۴ از چند تکه ramdisk فروشنده پشتیبانی می‌کند.

نسخه ۴ سرایند تصویر راه‌اندازی از قالب زیر استفاده می‌کند.

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 */
};

سرایند تصویر راه‌اندازی، نسخه ۳

‫Android 11 سرایند تصویر راه‌اندازی را به نسخه ۳ به‌روزرسانی می‌کند، که داده‌های زیر را برمی‌دارد:

  • راه‌انداز سیستم مرحله دوم. فیلدهای 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) را مشخص کنند باید از نسخه ۱ یا ۲ سرصفحه تصویر راه‌اندازی استفاده کنند.

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

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

  • از GKI استفاده کنید (به هسته android-4.19 یا android-5.4 نیاز دارد) اما از به‌روزرسانی‌های A/B استفاده نکنید. می‌توانید بااستفاده از نسخه ۳ تصویر راه‌اندازی برای تصویر راه‌اندازی و نسخه ۲ تصویر بازیابی، تصویر بازیابی را مشخص کنید.

  • دستگاه‌هایی که از GKI استفاده نمی‌کنند و از به‌روزرسانی‌های A/B استفاده نمی‌کنند می‌توانند بااستفاده از نسخه ۱ یا ۲ تصویر بوت برای تصاویر بوت و بازیابی، تصویر بازیابی را مشخص کنند.

نسخه ۳ سرصفحه تصویر راه‌اندازی از قالب زیر استفاده می‌کند.

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];
};

سرایند تصویر راه‌اندازی، نسخه ۲

‫Android 10 سرایند تصویر راه‌اندازی را به نسخه ۲ به‌روز می‌کند، که بخشی برای اطلاعات تصویر DTB بازیابی (اندازه تصویر و نشانی بار فیزیکی) اضافه می‌کند.

نسخه ۲ سرصفحه تصویر راه‌اندازی از قالب زیر استفاده می‌کند.

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 */
};

سرایند تصویر راه‌اندازی، نسخه ۱

‫Android 9 فیلد unused سرصفحه تصویر راه‌اندازی را به فیلد نسخه سرصفحه تبدیل می‌کند. دستگاه‌هایی که با Android نسخه ۹ راه‌اندازی می‌شوند باید از سرصفحه تصویر راه‌اندازی با نسخه سرصفحه ۱ یا بالاتر استفاده کنند (این مورد توسط VTS تأیید می‌شود).

نسخه ۱ از نسخه سرایند تصویر راه‌اندازی از قالب زیر استفاده می‌کند.

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 حاوی اندازه سرایند تصویر راه‌اندازی است. اگر نسخه سرایند تصویر راه‌اندازی روی ۱ تنظیم شده باشد، فیلد id حاوی خلاصه SHA-1 برای بخش recovery_[dtbo|acpio] تصویر راه‌اندازی علاوه بر kernel، ramdisk، و second sections است. برای جزئیات مربوط به فیلدهای recovery_[dtbo|acpio]_size و recovery_[dtbo|acpio]_offset، تصاویر بازیابی را ببینید.

سرایند تصویر راه‌اندازی قدیمی، نسخه ۰

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

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];
};