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

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

  • ב-Android 13 אפשר להשתמש בכותרת הפעלה בגרסה 3 או 4. במכשירים שתומכים בארכיטקטורת תמונת ליבה כללית (GKI), גרסה 4 היא תמונת האתחול הראשית והשדה os_version בכותרת האתחול צריך להיות אפס. תוכנת האתחול של המכשיר צפויה לקבל את פרטי הגרסה ממאפייני ההפעלה של Android מאומת (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 כדי לוודא שבכותרת של תמונת האתחול נעשה שימוש בגרסה הנכונה. ב-system/tools/mkbootimg/include/bootimg/bootimg.h תוכלו לראות את פרטי ה-AOSP לגבי כל הכותרות של קובצי האימג' שנתמכים בהפעלה ושל קובצי האתחול של הספקים?

הטמעת גרסאות של כותרת תמונת אתחול

הכלי 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, מקבלים את כתובת העומס הפיזית של עץ המכשיר הסופי. לדוגמה, אם הארגומנט 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, שבעזרתו אפשר לבדוק את תקינות הליבה (kernel) וה-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 כדי להתאים לארכיטקטורת תמונת ליבה כללית (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];
};