عنوان صورة التشغيل

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

  • يمكن أن يستخدم نظام Android 13 الإصدار 3 أو 4 من رأس التشغيل. في الأجهزة التي تتوافق مع بنية صورة Kernel العامة (GKI)، يكون الإصدار 4 هو صورة التشغيل الأساسية ويجب أن يكون الحقل os_version في رأس التشغيل صفرًا. ومن المتوقّع أن يحصل برنامج إقلاع الجهاز على معلومات الإصدار من خصائص "التشغيل المتحقّق منه على Android" (AVB) بدلاً من ذلك.
  • يمكن أن يستخدم نظام Android 12 الإصدار 3 أو 4 من رأس التشغيل. بالنسبة إلى الأجهزة التي تتوافق مع بنية صورة النواة العامة (GKI)، يكون الإصدار 4 هو الصورة الأساسية عند التشغيل.
  • يمكن أن يستخدم نظام Android 11 الإصدار 3 من رأس التشغيل. بالنسبة إلى الأجهزة التي تتوافق مع بنية صورة Kernel العامة (GKI)، يجب استخدام هذا الإصدار لصورة التشغيل الأساسية.
  • يجب أن يستخدم نظام Android 10 الإصدار 2 من رأس التشغيل.
  • يجب أن يستخدم نظام Android 9 الإصدار 1 من رأس التشغيل.
  • يستخدم الإصدار Android 8 والإصدارات الأقدم الإصدار 0 من عنوان صورة التشغيل.

بالنسبة إلى جميع الأجهزة التي تعمل بالإصدار 9 من نظام التشغيل Android أو الإصدارات الأحدث، تتحقّق حزمة اختبار المورّدين (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 من العنوان الخاص بصورة التشغيل، والذي يمكن استخدامه للتحقّق من سلامة النواة (kernel) و"ramdisk". يتم إجراء عملية التحقّق من خلال VtsSecurityAvbTest وهي مطلوبة للأجهزة التي تستخدم بنية GKI. يُرجى العِلم أنّ boot_signature لا تدخل في عملية التشغيل المتحقَّق منه الخاصة بالجهاز وتُستخدم فقط في VTS. لمعرفة التفاصيل، يمكنك الاطّلاع على إعداد لوحة GKI Boot.img وإعدادات التشغيل الذي تم التحقّق منه في GKI.

يتوافق الإصدار 4 من عنوان صورة تشغيل المورِّد 4 مع أجزاء متعددة من ذاكرة RAMD للمورّد.

يستخدم الإصدار 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) ولكن لا تستخدِم تحديثات A/B. يمكن أن تحدّد تحديثات 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 image للاسترداد (حجم الصورة وعنوان التحميل الفعلي).

يستخدم الإصدار 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];
};