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

ב-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. במכשירים שתומכים בארכיטקטורה של 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 משתמשת במשתנה BoardConfig BOARD_PREBUILT_DTBOIMAGE כדי להגדיר את הארגומנט recovery_dtbo של mkbootimg במהלך היצירה של תמונת השחזור. לפרטים על שינויים בפרויקט קוד פתוח של Android (AOSP), כדאי לבדוק את רשימות השינויים המשויכות לכותרת של תמונת אתחול ניהול גרסאות.

כותרת של תמונת הפעלה, גרסה 4

ב-Android 12 יש boot_signature בתמונת ההפעלה כותרת 4, שבה ניתן להשתמש כדי לבדוק את תקינות הליבה ramdisk. הבדיקה מתבצעת בעוד VtsSecurityAvbTest ונדרש למכשירים עם ארכיטקטורת GKI. אבל, האפליקציה boot_signature לא מעורבת בתהליך ההפעלה המאומתת שספציפית למכשיר ומשמש רק ב-VTS. למידע נוסף, ראו לוח GKIboo.img board הגדרה אישית ואתחול מאומת של 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 כדי לעמוד בדרישות של תמונת ליבה גנרית" (GKI), שמאחד את ליבת הליבה ומעביר את המודולים של הספקים שנדרשים להפעיל את המחיצה vendor_boot (כלומר, תמונת האתחול מכילה רק GKI) רכיבים). מכשירים:

  • שימוש ב-GKI (נדרשת ליבה (kernel) של 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];
};