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

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

  • ב-Android 13 אפשר להשתמש בגרסה 3 או 4 של כותרת האתחול. במכשירים שתומכים בארכיטקטורה של תמונת ליבת מערכת הפעלה כללית (GKI), גרסה 4 היא תמונת האתחול הראשית, והערך בשדה os_version בכותרת האתחול חייב להיות אפס. תוכנת האתחול של המכשיר אמורה לקבל את פרטי הגרסה ממאפייני ההפעלה המאומתת של Android ‏ (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 ‏ (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];
};