ב-Android 9 נוסף שדה גרסה בכותרת של תמונת האתחול, שמאפשר עדכונים לכותרת תוך שמירה על תאימות לאחור. מנהל האתחול צריך לבדוק את שדה גרסת הכותרת ולנתח את הכותרת בהתאם. מכשירים שיושקו עם:
- ב-Android 13 אפשר להשתמש בכותרת אתחול בגרסה 3 או 4. במכשירים שתומכים בארכיטקטורת תמונת ליבה כללית (GKI), גרסה 4 היא תמונת האתחול הראשית והשדה
os_version
בכותרת האתחול צריך להיות אפס. במקום זאת, תוכנת האתחול של המכשיר אמורה לקבל את פרטי הגרסה מהמאפיינים של Android Verified Boot (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
כדי לוודא שבכותרת של תמונת האתחול נעשה שימוש בגרסה הנכונה. פרטים על כל כותרות קובצי האימג' הנתמכים של אתחול ושל אתחול של ספקים זמינים ב-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 , הוא מספק את כתובת העומס הפיזית של עץ המכשיר הסופי. לדוגמה, אם הארגומנט 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. פרטים נוספים מופיעים במאמר הגדרות אישיות של לוח אתחול 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 כדי לעמוד בדרישות הארכיטקטורה של 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];
};