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

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

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