הכותרת של קובץ האימג' לאתחול

ב-Android 9 הוספנו שדה גרסה בכותרת של קובץ האימג' להפעלה, כדי לאפשר עדכונים בכותרת תוך שמירה על תאימות לאחור. מנהל האתחול צריך לבדוק את שדה גרסת הכותרת ולנתח את הכותרת בהתאם. מכשירים שיושקו עם:

  • ב-Android 13 אפשר להשתמש בכותרת אתחול בגרסה 3 או 4. במכשירים שתומכים בארכיטקטורה של Generic Kernel Image‏ (GKI), גרסה 4 היא קובץ האתחול הראשי והשדה os_version בכותרת האתחול חייב להיות אפס. במקום זאת, תוכנת האתחול של המכשיר אמורה לקבל את פרטי הגרסה מהמאפיינים של Android Verified Boot‏ (AVB).
  • ב-Android 12 אפשר להשתמש בכותרת אתחול בגרסה 3 או 4. במכשירים שתומכים בארכיטקטורה של Generic Kernel Image‏ (GKI), גרסת 4 היא קובץ האימג' הראשי להפעלה.
  • ב-Android 11 אפשר להשתמש בכותרת האתחול בגרסה 3. במכשירים שתומכים בארכיטקטורה של Generic Kernel Image‏ (GKI), צריך להשתמש בגרסה הזו לתמונת האתחול הראשית.
  • ב-Android 10 חייבת להיות כותרת אתחול בגרסה 2.
  • ב-Android 9 חייבת להיות גרסת כותרת אתחול 1.
  • ב-Android 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 משמש לארכיטקטורות שמשתמשות ב-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)

מערכת ה-build של Android משתמשת במשתנה BoardConfigBOARD_PREBUILT_DTBOIMAGE כדי להגדיר את הארגומנט recovery_dtbo של הכלי mkbootimg במהלך יצירת קובץ האימג' לשחזור. פרטים על השינויים ב-Android Open Source Project‏ (AOSP) זמינים ברשימות השינויים המשויכות לגרסאות של כותרות קובצי האימג' להפעלה.

כותרת של קובץ אימג' לאתחול, גרסה 4

ב-Android 12 יש boot_signature בכותרת של קובץ האימג' של האתחול בגרסה 4, שאפשר להשתמש בו כדי לבדוק את תקינות הליבה ואת ה-ramdisk. הבדיקה מתבצעת ב-VtsSecurityAvbTest, והיא נדרשת במכשירים שמשתמשים בארכיטקטורה של GKI. עם זאת, boot_signature לא מעורב בתהליך ההפעלה המאומתת הספציפי למכשיר, והוא משמש רק ב-VTS. פרטים נוספים זמינים במאמרים הגדרת הלוח של boot.img ב-GKI והגדרות האתחול המאומת ב-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

ב-Android 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 או APCIO), צריך להשתמש בכותרת של קובץ אימג' האתחול בגרסה 1 או 2.

  • Device tree blob‏ (DTB) ה-DTB מאוחסן במחיצה של תוכנת האתחול של הספק, ולכן השדות dtb_size ו-dtb_addr לא מופיעים יותר בכותרת של קובץ האתחול (אבל הם נמצאים בכותרת של קובץ האתחול של הספק).

במכשירים אפשר להשתמש בכותרת של קובץ האימג' לאתחול בגרסה 3 כדי לעמוד בדרישות הארכיטקטורה של Generic Kernel Image‏ (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, אבל לא את שתיהן (כי הן משמשות לארכיטקטורות שונות). כדי להגדיר את הכותרת של קובץ האימג' להפעלה בצורה נכונה, כשמשתמשים ב:

  • קובץ אימג' של 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];
};