هدر تصویر را بوت کنید

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

  • اندروید ۱۳ می‌تواند از هدر بوت نسخه ۳ یا ۴ استفاده کند. برای دستگاه‌هایی که از معماری Generic Kernel Image (GKI) پشتیبانی می‌کنند، نسخه ۴ ایمیج بوت اصلی است و فیلد os_version در هدر بوت باید صفر باشد. انتظار می‌رود بوت‌لودر دستگاه، اطلاعات نسخه را از ویژگی‌های Android Verified Boot (AVB) دریافت کند.
  • اندروید ۱۲ می‌تواند از هدر بوت نسخه ۳ یا ۴ استفاده کند. برای دستگاه‌هایی که از معماری Generic Kernel Image (GKI) پشتیبانی می‌کنند، نسخه ۴، بوت ایمیج اصلی است.
  • اندروید ۱۱ می‌تواند از نسخه ۳ هدر بوت استفاده کند. برای دستگاه‌هایی که از معماری Generic Kernel Image (GKI) پشتیبانی می‌کنند، این نسخه باید برای بوت ایمیج اصلی استفاده شود.
  • اندروید ۱۰ باید از نسخه ۲ هدر بوت استفاده کند.
  • اندروید ۹ باید از هدر بوت نسخه ۱ استفاده کند.
  • اندروید ۸ و پایین‌تر به عنوان نسخه ۰ هدر تصویر بوت در نظر گرفته می‌شوند.

برای همه دستگاه‌هایی که با اندروید ۹ یا بالاتر کار می‌کنند، مجموعه تست فروشنده (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 استفاده کنند.
  • 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 در حین ایجاد تصویر بازیابی استفاده می‌کند. برای جزئیات بیشتر در مورد تغییرات پروژه متن‌باز اندروید (AOSP)، لیست تغییرات مرتبط با نسخه‌بندی هدر تصویر بوت را بررسی کنید.

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

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

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

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

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

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

اندروید ۱۱ هدر تصویر بوت را به نسخه ۳ به‌روزرسانی می‌کند که داده‌های زیر را حذف می‌کند:

  • بوت لودر مرحله دوم. فیلدهای 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 دیگر در هدر تصویر بوت ظاهر نمی‌شوند (اما در هدر تصویر بوت فروشنده وجود دارند).

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

  • از GKI استفاده کنید (به کرنل اندروید ۴.۱۹ یا اندروید ۵.۴ نیاز دارد) اما از A/B استفاده نکنید. به‌روزرسانی‌ها می‌توانند با استفاده از boot image نسخه ۳ برای boot image و boot image نسخه ۲ برای recovery image، یک recovery image مشخص کنند.

  • از 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];
};

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

اندروید ۱۰ هدر تصویر بوت را به نسخه ۲ به‌روزرسانی می‌کند که بخشی برای اطلاعات تصویر 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 */
};

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

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

هدر تصویر بوت قدیمی، نسخه ۰

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

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