כותרת תמונת אתחול

אנדרואיד 9 הציגה שדה גרסה בכותרת תמונת האתחול, המאפשרת עדכונים לכותרת תוך שמירה על תאימות לאחור. על טוען האתחול לבדוק את שדה גרסת הכותרת ולנתח את הכותרת בהתאם. מכשירים המופעלים עם:

  • Android 13 יכול להשתמש בכותרת האתחול בגרסה 3 או 4. עבור מכשירים התומכים בארכיטקטורת Generic Kernel Image (GKI) , גרסה 4 היא תמונת האתחול הראשית והשדה os_version בכותרת האתחול חייב להיות אפס. מטעין האתחול של המכשיר צפוי לקבל את פרטי הגרסה ממאפייני Android Verified Boot (AVB) במקום זאת.
  • אנדרואיד 12 יכולה להשתמש בכותרת האתחול בגרסה 3 או 4. עבור מכשירים התומכים בארכיטקטורת ה- Generic Kernel Image (GKI) , גרסה 4 היא תמונת האתחול הראשית.
  • אנדרואיד 11 יכול להשתמש בגרסת כותרת האתחול 3. עבור מכשירים התומכים בארכיטקטורת Generic Kernel Image (GKI) , יש להשתמש בגרסה זו עבור תמונת האתחול הראשית.
  • אנדרואיד 10 חייב להשתמש בכותרת האתחול בגרסה 2.
  • אנדרואיד 9 חייב להשתמש בגרסה 1 של כותרת האתחול.
  • אנדרואיד 8 ומטה נחשבים כמשתמשים בכותרת של תמונת אתחול בגרסה 0.

עבור כל המכשירים הפועלים עם אנדרואיד 9 ומעלה, ה- Vendor Test Suite (VTS) בודק את הפורמט של תמונת boot/recovery כדי לוודא שכותרת תמונת האתחול משתמשת בגרסה הנכונה. לצפייה בפרטי AOSP על כל כותרות תמונת האתחול והאתחול הנתמכות כעת של הספק, עיין ב- system/tools/mkbootimg/include/bootimg/bootimg.h .

הטמעת גירסאות כותרת של תמונת אתחול

הכלי mkbootimg מקבל את הטיעונים הבאים.

טַעֲנָה תיאור
header_version מגדיר את גרסת הכותרת של תמונת האתחול. תמונת אתחול עם גרסת כותרת:
  • 1 או 2 תומכים בתמונת DTBO לשחזור או בתמונת ACPIO לשחזור.
  • 3 אינו תומך בתמונות שחזור.
recovery_dtbo משמש לארכיטקטורות המשתמשות ב-DTB. מציין את הנתיב לתמונת DTBO לשחזור. אופציונלי עבור מכשירי A/B, שאינם זקוקים לתמונת שחזור. התקנים שאינם A/B ​​המשתמשים header_version :
  • 1 או 2 יכולים לציין נתיב זה או להשתמש בקטע recovery_acpio כדי לציין נתיב לתמונת ACPIO לשחזור.
  • 3 לא יכול לציין תמונת DTBO לשחזור.
recovery_acpio משמש לארכיטקטורות המשתמשות ב-ACPI במקום DTB. מציין את הנתיב לתמונת ACPIO לשחזור. אופציונלי עבור מכשירי A/B, שאינם זקוקים לתמונת שחזור. התקנים שאינם A/B ​​המשתמשים header_version :
  • 1 או 2 יכולים לציין נתיב זה או להשתמש בקטע recovery_dtbo כדי לציין נתיב לתמונת DTBO לשחזור.
  • 3 לא יכול לציין תמונת ACPIO לשחזור.
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

אנדרואיד 12 מספק boot_signature בכותרת תמונת האתחול בגרסה 4, שניתן להשתמש בה כדי לבדוק את תקינות הליבה וה-ramdisk. הבדיקה מתבצעת ב- VtsSecurityAvbTest ונדרשת עבור מכשירים המשתמשים בארכיטקטורת GKI. עם זאת, ה- boot_signature אינו מעורב בתהליך האתחול המאומת הספציפי למכשיר והוא משמש רק ב-VTS. ראה תצורת לוח GKI boot.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

אנדרואיד 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.

  • כתם עץ התקן (DTB). ה-DTB מאוחסן במחיצת האתחול של הספק , כך שהשדות dtb_size ו- dtb_addr אינם מופיעים עוד בכותרת תמונת האתחול (אלא נמצאים בכותרת תמונת האתחול של הספק).

התקנים יכולים להשתמש בכותרת של תמונת האתחול בגרסה 3 כדי להתאים לארכיטקטורת Generic Kernel Image (GKI) , המאחדת את ליבת הליבה ומעבירה את מודולי הספק הנדרשים לאתחול למחיצת vendor_boot (כלומר תמונת האתחול מכילה רק רכיבי GKI). מכשירים ש:

  • השתמש ב-GKI (דורש ליבת אנדרואיד-4.19 או אנדרואיד-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

אנדרואיד 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

אנדרואיד 9 ממירה את השדה unused של כותרת תמונת האתחול לשדה גרסת כותרת. מכשירים המופעלים עם אנדרואיד 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

מכשירים שהושקו לפני אנדרואיד 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];
};