رأس صورة التمهيد

قدم Android 9 حقل إصدار في رأس صورة التمهيد ، مما يتيح تحديثات الرأس مع الحفاظ على التوافق مع الإصدارات السابقة. يجب أن يتحقق برنامج bootloader من حقل إصدار الرأس ويحلل الرأس وفقًا لذلك. تشغيل الأجهزة مع:

  • يمكن أن يستخدم Android 13 الإصدار 3 أو 4. بالنسبة للأجهزة التي تدعم بنية Generic Kernel Image (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 أو أعلى ، يتحقق 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)

يستخدم نظام إنشاء Android متغير BoardConfig BOARD_PREBUILT_DTBOIMAGE لتعيين الوسيطة recovery_dtbo لأداة mkbootimg أثناء إنشاء صورة الاسترداد. للحصول على تفاصيل حول تغييرات مشروع Android Open Source Project (AOSP) ، راجع قوائم التغيير المرتبطة لإصدار رأس صورة التمهيد .

رأس صورة التمهيد ، الإصدار 4

يوفر Android 12 boot_signature في إصدار رأس صورة التمهيد 4 ، والذي يمكن استخدامه للتحقق من سلامة kernel و 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

يقوم Android 11 بتحديث رأس صورة التمهيد إلى الإصدار 3 ، والذي يزيل البيانات التالية:

  • محمل إقلاع المرحلة الثانية. لم يعد حقلا second_size و second_addr يظهران في رأس صورة التمهيد. يجب أن تخزن الأجهزة التي تحتوي على محمل إقلاع المرحلة الثانية محمل الإقلاع هذا في القسم الخاص به.

  • صورة الاسترداد. تم إهمال شرط تحديد صورة recovery_acpio_size ، ولم تعد الحقول 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 للتوافق مع بنية صورة Kernel العامة (GKI) ، والتي توحد النواة الأساسية وتنقل وحدات البائع المطلوبة للتمهيد إلى قسم vendor_boot (بمعنى أن صورة التمهيد تحتوي على مكونات GKI فقط). الأجهزة التي:

  • استخدم GKI (يتطلب android-4.19 أو android-5.4 kernel) ولكن لا تستخدم تحديثات 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] من صورة التمهيد بالإضافة إلى second sections kernel و ramdisk والثانية. للحصول على تفاصيل حول recovery_[dtbo|acpio]_size and recovery_[dtbo|acpio]_offset ، راجع Recovery Images .

رأس صورة التمهيد القديم ، الإصدار 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];
};