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