כותרת של תמונת הפעלה

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

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

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