قدم 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 | يضبط إصدار رأس صورة التمهيد. صورة تمهيد بإصدار رأس:
|
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)
يستخدم نظام إنشاء 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];
};