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

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

  • يمكن لنظام Android 13 استخدام الإصدار 3 أو 4 من رأس التمهيد. بالنسبة للأجهزة التي تدعم بنية صورة Kernel العامة (GKI) ، فإن الإصدار 4 هو صورة التمهيد الأساسية ويجب أن يكون حقل os_version في رأس التمهيد صفرًا. من المتوقع أن يحصل برنامج تحميل التشغيل على معلومات الإصدار من خصائص Android Verified Boot (AVB) بدلاً من ذلك.
  • يمكن لنظام التشغيل Android 12 استخدام الإصدار 3 أو 4 من رأس التمهيد. بالنسبة للأجهزة التي تدعم بنية صورة Kernel العامة (GKI) ، فإن الإصدار 4 هو صورة التمهيد الأساسية.
  • يمكن لنظام Android 11 استخدام الإصدار 3 من رأس التمهيد. بالنسبة للأجهزة التي تدعم بنية صورة Kernel العامة (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 يضبط إصدار رأس صورة التمهيد. صورة التمهيد مع إصدار الرأس:
  • 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 مفتوح المصدر (AOSP)، راجع قوائم التغيير المرتبطة بإصدار رأس صورة التمهيد .

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

يوفر Android 12 boot_signature في الإصدار 4 من رأس صورة التمهيد، والذي يمكن استخدامه للتحقق من سلامة النواة وقرص ذاكرة الوصول العشوائي. يتم إجراء الفحص في VtsSecurityAvbTest وهو مطلوب للأجهزة التي تستخدم بنية GKI. ومع ذلك، لا يشارك boot_signature في عملية التمهيد التي تم التحقق منها الخاصة بالجهاز ويتم استخدامه فقط في VTS. راجع تكوين لوحة GKI boot.img وإعدادات التمهيد التي تم التحقق منها بواسطة GKI للحصول على التفاصيل.

يدعم الإصدار 4 من رأس صورة تمهيد البائع أجزاء متعددة من قرص ذاكرة الوصول العشوائي الخاص بالمورد.

يستخدم الإصدار 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 من رأس صورة التمهيد.

  • فقاعة شجرة الجهاز (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] لصورة التمهيد بالإضافة إلى أقسام 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];
};