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