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