ב-Android 9 נוסף שדה גרסה בכותרת של קובץ אימג' לאתחול, שמאפשר לעדכן את הכותרת תוך שמירה על תאימות לאחור. טוען האתחול חייב לבדוק את שדה גרסת הכותרת ולנתח את הכותרת בהתאם. מכשירים שמופעלים עם:
- ב-Android 13 אפשר להשתמש בגרסה 3 או 4 של כותרת האתחול. במכשירים שתומכים בארכיטקטורה של תמונת ליבה גנרית (GKI), גרסה 4 היא תמונת האתחול הראשית והשדה
os_versionבכותרת האתחול חייב להיות אפס. במקום זאת, תוכנת האתחול במכשיר אמורה לקבל את פרטי הגרסה ממאפייני ההפעלה המאומתת (AVB) של Android. - ב-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 |
ההגדרה הזו קובעת את גרסת הכותרת של קובץ אימג' לאתחול. קובץ אימג' לאתחול עם גרסת כותרת:
|
recovery_dtbo |
משמש לארכיטקטורות שמשתמשות ב-DTB. מציין את הנתיב לתמונת ה-DTBO של השחזור. אופציונלי למכשירי A/B, שלא צריכים קובץ אימג' לשחזור מערכת ההפעלה.
מכשירים שלא תומכים ב-A/B ומשתמשים ב-header_version:
|
recovery_acpio |
משמש לארכיטקטורות שמשתמשות ב-ACPI במקום ב-DTB. מציין את הנתיב לתמונת ה-ACPIO לשחזור. אופציונלי למכשירי A/B, שלא צריכים קובץ אימג' לשחזור מערכת ההפעלה. מכשירים שלא תומכים ב-A/B ומשתמשים ב-header_version:
|
dtb |
הנתיב לתמונת DTB שכלולה בתמונות של אתחול/שחזור. |
dtb_offset |
כשמוסיפים אותו לארגומנט base, הוא מספק את כתובת הטעינה הפיזית של פירוט מבנה המכשיר (DT) הסופי. לדוגמה, אם הארגומנט 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 כדי להגדיר את הארגומנט recovery_dtbo של הכלי mkbootimg במהלך יצירת קובץ אימג' לשחזור מערכת ההפעלה.BOARD_PREBUILT_DTBOIMAGE לפרטים על השינויים ב-Android Open Source Project (פרויקט קוד פתוח של 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];
};