قدّم نظام التشغيل Android 11 مفهوم "صورة الإصدار العام للنواة" (GKI). لتفعيل تشغيل جهاز عشوائي باستخدام GKI، يمكن لأجهزة Android
11 استخدام الإصدار 3 من عنوان صورة التمهيد. في
الإصدار 3، يتم استبعاد جميع المعلومات الخاصة بالمورّد من قسم boot
وإعادة نقلها إلى قسم vendor_boot
جديد. يجب أن يتوافق جهاز ARM64 الذي يعمل بالإصدار 11 من نظام التشغيل Android على نواة Linux 5.4 مع القسم vendor_boot
وتنسيق القسم boot
المعدَّل لاجتياز الاختبار باستخدام GKI.
يمكن لأجهزة Android 12 استخدام الإصدار 4 من عنوان صورة التمهيد،
الذي يتيح تضمين عدة أقراص RAMdisks للمورّدين في القسم vendor_boot
. يتم تسلسل عدة أجزاء من ذاكرة التخزين المؤقت للجهاز من المورّد بعد بعضها
في قسم ذاكرة التخزين المؤقت للجهاز من المورّد. يُستخدَم جدول ذاكرة التخزين المؤقت للمورّد لوصف ملف تخطيط قسم ذاكرة التخزين المؤقت للمورّد وبيانات التعريف الخاصة بكل ملف ذاكرة تخزين مؤقت للمورّد.
بنية التقسيم
يتم تقسيم قسم التمهيد الخاص بالمورّد إلى قسمَين A/B باستخدام ميزة A/B الافتراضي ويتم حمايته من خلال ميزة "التمهيد التحقق منه" في Android.
الإصدار 3
يتألّف القسم من عنوان ومساحة تخزين مؤقت للمورّد ومجموعة بيانات شجرة الجهاز (DTB).
القسم | عدد الصفحات |
---|---|
رأس التمهيد الخاص بالمورّد (n صفحة) | n = (2112 + page_size - 1) / page_size |
ذاكرة التخزين المؤقت المؤقتة (o pages) | o = (vendor_ramdisk_size + page_size - 1) / page_size |
DTB (p pages) | p = (dtb_size + page_size - 1) / page_size |
الإصدار 4
يتألّف القسم من عنوان وقسم ذاكرة الوصول العشوائي الخاصة بالمورّد (المكوّن من جميع أجزاء ذاكرة الوصول العشوائي الخاصة بالمورّد التي تم تجميعها) ومجموعة بيانات شجرة الجهاز (DTB) وجدول ذاكرة الوصول العشوائي الخاصة بالمورّد.
القسم | عدد الصفحات |
---|---|
رأس التمهيد الخاص بالمورّد (n صفحة) | n = (2128 + page_size - 1) / page_size |
أجزاء ذاكرة التخزين المؤقت العشوائي للمورّد (o صفحات) | o = (vendor_ramdisk_size + page_size - 1) / page_size |
DTB (p pages) | p = (dtb_size + page_size - 1) / page_size |
جدول ذاكرة التخزين المؤقت للتطبيقات (صفحات q) | q = (vendor_ramdisk_table_size + page_size - 1) / page_size |
Bootconfig (صفحات r) | r = (bootconfig_size + page_size - 1) / page_size |
عنوان التشغيل الخاص بالمورّد
تتألف محتويات عنوان قسم التمهيد الخاص بالمورّد بشكل أساسي من البيانات التي تم نقلها إلى هناك من عنوان صورة التمهيد. ويحتوي أيضًا على معلومات عن ذاكرة التخزين المؤقت للأجهزة التي يقدّمها المورّد.
الإصدار 3
struct vendor_boot_img_hdr_v3
{
#define VENDOR_BOOT_MAGIC_SIZE 8
uint8_t magic[VENDOR_BOOT_MAGIC_SIZE];
uint32_t header_version;
uint32_t page_size; /* flash page size we assume */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t vendor_ramdisk_size; /* size in bytes */
#define VENDOR_BOOT_ARGS_SIZE 2048
uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE];
uint32_t tags_addr; /* physical addr for kernel tags */
#define VENDOR_BOOT_NAME_SIZE 16
uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
uint32_t header_size; /* size of vendor boot image header in
* bytes */
uint32_t dtb_size; /* size of dtb image */
uint64_t dtb_addr; /* physical load address */
};
الإصدار 4
struct vendor_boot_img_hdr_v4
{
#define VENDOR_BOOT_MAGIC_SIZE 8
uint8_t magic[VENDOR_BOOT_MAGIC_SIZE];
uint32_t header_version;
uint32_t page_size; /* flash page size we assume */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t vendor_ramdisk_size; /* size in bytes */
#define VENDOR_BOOT_ARGS_SIZE 2048
uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE];
uint32_t tags_addr; /* physical addr for kernel tags */
#define VENDOR_BOOT_NAME_SIZE 16
uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
uint32_t header_size; /* size of vendor boot image header in
* bytes */
uint32_t dtb_size; /* size of dtb image */
uint64_t dtb_addr; /* physical load address */
uint32_t vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk table */
uint32_t vendor_ramdisk_table_entry_num; /* number of entries in the vendor ramdisk table */
uint32_t vendor_ramdisk_table_entry_size; /* size in bytes for a vendor ramdisk table entry */
uint32_t bootconfig_size; /* size in bytes for the bootconfig section */
};
#define VENDOR_RAMDISK_TYPE_NONE 0
#define VENDOR_RAMDISK_TYPE_PLATFORM 1
#define VENDOR_RAMDISK_TYPE_RECOVERY 2
#define VENDOR_RAMDISK_TYPE_DLKM 3
struct vendor_ramdisk_table_entry_v4
{
uint32_t ramdisk_size; /* size in bytes for the ramdisk image */
uint32_t ramdisk_offset; /* offset to the ramdisk image in vendor ramdisk section */
uint32_t ramdisk_type; /* type of the ramdisk */
#define VENDOR_RAMDISK_NAME_SIZE 32
uint8_t ramdisk_name[VENDOR_RAMDISK_NAME_SIZE]; /* asciiz ramdisk name */
#define VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE 16
// Hardware identifiers describing the board, soc or platform which this
// ramdisk is intended to be loaded on.
uint32_t board_id[VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE];
};
vendor_ramdisk_size
هو الحجم الإجمالي لجميع أجزاء ذاكرة التخزين المؤقت للنظام الأساسي للمورّد.- يشير الرمز
ramdisk_type
إلى نوع ملف ramdisk، وتكون القيم المحتملة هي:- يشير الرمز
VENDOR_RAMDISK_TYPE_NONE
إلى أنّ القيمة غير محدّدة. - تحتوي
VENDOR_RAMDISK_TYPE_PLATFORM
ramdisks على أجزاء خاصة بالنظام الأساسي. ويجب أن يحمِّل برنامج الإقلاع هذه الملفات دائمًا في الذاكرة. VENDOR_RAMDISK_TYPE_RECOVERY
تحتوي أقراص RAM على موارد الاسترداد. يجب أن يحمِّل برنامج الإقلاع هذه الملفات إلى الذاكرة عند التمهيد إلى وضع الاسترداد.- تحتوي
VENDOR_RAMDISK_TYPE_DLKM
ramdisks على وحدات ملف kernel قابلة للتحميل ديناميكيًا.
- يشير الرمز
ramdisk_name
هو اسم فريد لوحدة التخزين المؤقت في ذاكرة الوصول العشوائي.board_id
هو مصفوفة من معرّفات الأجهزة التي يحدّدها المورّد.
دعم برنامج الإقلاع
بما أنّ قسم التمهيد الخاص بالمورّد يحتوي على معلومات (مثل حجم صفحة الفلاش، والنواة، وعناوين تحميل قرص التخزين المؤقت في ذاكرة الوصول العشوائي، وملف DTB نفسه) كانت متوفّرة سابقًا في قسم التمهيد، يجب أن يصل أداة تحميل البرامج إلى كل من قسم التمهيد وقسم التمهيد الخاص بالمورّد للحصول على بيانات كافية لإكمال عملية التمهيد.
يجب أن يحمِّل برنامج الإقلاع ذاكرة الوصول العشوائي (RAM) العامة في الذاكرة على الفور بعد
ذاكرة الوصول العشوائي (RAM) الخاصة بالمورّد (تتوافق تنسيقات CPIO وGzip وlz4 مع هذا النوع من
التسلسل). لا تُعدِّل تنسيق صفحة صورة ذاكرة التخزين المؤقت العشوائي العامة أو تُدرِج أي
مساحة أخرى بينها وبين نهاية ذاكرة التخزين المؤقت العشوائي الخاصة بالمورّد في الذاكرة. بعد إزالة ضغط ملف التمهيد، يُستخرج الملف المجمَّع إلى ملف initramfs
، مما يؤدي إلى إنشاء بنية ملف تمثل ذاكرة وصول عشوائي (RAM) عامة مضمَّنة في بنية ملف ذاكرة وصول عشوائي (RAM) الخاصة بالمورِّد.
وبما أنّه يتم تسلسل ملف ramdisk العام وملف ramdisk الخاص بالمورّد، يجب أن يكونا بالتنسيق نفسه. تستخدم صورة التمهيد في GKI ذاكرة وصول عشوائي (RAM) عامة مضغوطة بتنسيق lz4، لذا يجب أن يستخدم الجهاز المتوافق مع GKI ذاكرة وصول عشوائي (RAM) مضغوطة بتنسيق lz4 من الشركة المصنّعة. يمكنك الاطّلاع أدناه على خطوات الإعداد.
يتم شرح متطلبات برنامج الإقلاع لتفعيل bootconfig في مقالة تنفيذ Bootconfig.
أقراص RAM متعددة المورّدين (الإصدار 4)
باستخدام الإصدار 4 من عنوان صورة التمهيد، يمكن لبرنامج التمهيد اختيار مجموعة فرعية أو
جميع أقراص التخزين المؤقت للنظام الأساسي من المصنّع لتحميلها كـ initramfs
أثناء عملية التمهيد. يحتوي جدول
ramdisk الخاص بالمورّد على البيانات الوصفية لكل ذاكرة وصول عشوائي (RAM)، ويمكن أن يساعد بوتloader في تحديد ذاكرات الوصول العشوائي التي يجب تحميلها. يمكن لبرنامج التمهيد تحديد
ترتيب تحميل وحدات التخزين المؤقت للنظام التي اختارها المورّد، شرط أن يتم تحميل ملف التخزين المؤقت العام
لاحقًا.
على سبيل المثال، يمكن لبرنامج التحميل التمهيدي حذف تحميل وحدات التخزين المؤقت للأجهزة المصنّعة من النوع
VENDOR_RAMDISK_TYPE_RECOVERY
أثناء عملية التحميل العادية للحفاظ على الموارد، وبالتالي لا يتم تحميل سوى
وحدات التخزين المؤقت للأجهزة المصنّعة من النوع VENDOR_RAMDISK_TYPE_PLATFORM
و
VENDOR_RAMDISK_TYPE_DLKM
في الذاكرة. من ناحية أخرى، يتم تحميل ملف ramdisk الخاص بالمورّد من النوع VENDOR_RAMDISK_TYPE_PLATFORM
وVENDOR_RAMDISK_TYPE_RECOVERY
وVENDOR_RAMDISK_TYPE_DLKM
في الذاكرة عند التمهيد إلى وضع recovery
(الاسترداد).
بدلاً من ذلك، يمكن لبرنامج الإقلاع تجاهل جدول ذاكرة التخزين المؤقت للمورّد وتحميل
قسم ذاكرة التخزين المؤقت للمورّد بالكامل. ويؤدي ذلك إلى التأثير نفسه الناتج عن تحميل كل
أجزاء ذاكرة التخزين المؤقت للجهاز في قسم vendor_boot
.
إنشاء الدعم
لتنفيذ ميزة "تشغيل الجهاز من خلال موفِّر البرامج الأساسية" لجهاز:
اضبط
BOARD_BOOT_HEADER_VERSION
على3
أو أعلى.اضبط
BOARD_RAMDISK_USE_LZ4
علىtrue
إذا كان جهازك متوافقًا مع GKI، أو إذا كان يستخدم ملف ramdisk عامًا مضغوطًا بتنسيق lz4.اضبط
BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE
على حجم مناسب لجهازك، مع مراعاة وحدات kernel التي يجب وضعها في ذاكرة الوصول العشوائي (RAM) الخاصة بالمورّد.عدِّل
AB_OTA_PARTITIONS
لتضمينvendor_boot
وأي قوائم خاصة بالمورّد لقسيمات OTA على الجهاز.انسخ
fstab
على جهازك إلى/first_stage_ramdisk
في قسمvendor_boot
، وليس في قسمboot
. على سبيل المثال:$(LOCAL_PATH)/fstab.hardware:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)
.
لتضمين عدة أقراص RAM لجهات خارجية في vendor_boot
:
- اضبط
BOARD_BOOT_HEADER_VERSION
على4
. اضبط
BOARD_VENDOR_RAMDISK_FRAGMENTS
على قائمة بأسماء أجزاء ملف ramdisk اللوجي الخاص بالمورّد المطلوب تضمينها فيvendor_boot
.لإضافة ذاكرة وصول عشوائي (RAM) مُعدّة مسبقًا من المورّد، اضبط
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).PREBUILT
على ملف المسار المُعدّ مسبقًا.لإضافة ذاكرة وصول عشوائي (RAM) لجهة خارجية في حِزم DLKM، اضبط
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).KERNEL_MODULE_DIRS
على قائمة أدلة وحدات kernel المطلوب تضمينها.اضبط
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).MKBOOTIMG_ARGS
علىmkbootimg
. هذه هي الوسيطات--board_id[0-15]
و--ramdisk_type
لجزء ذاكرة التخزين المؤقت للجهاز من المورّد. بالنسبة إلى قرص التخزين المؤقت لجهة تصنيع DLKM، سيكون القيمة التلقائية لسمة--ramdisk_type
هيDLKM
في حال عدم تحديد قيمة أخرى.
لإنشاء موارد الاسترداد كأداة تخزين مؤقت recovery
مستقلة في vendor_boot
:
- اضبط
BOARD_BOOT_HEADER_VERSION
على4
. - اضبط
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
علىtrue
. - اضبط
BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT
علىtrue
. - يؤدي ذلك إلى إضافة جزء من ذاكرة التخزين المؤقت للمورّد يكون
ramdisk_name
=recovery
وramdisk_type
=VENDOR_RAMDISK_TYPE_RECOVERY
. يحتوي ملف ramdisk بعد ذلك على جميع ملفات الاسترداد، وهي الملفات المثبَّتة ضمن$(TARGET_RECOVERY_ROOT_OUT)
.
وسيطات mkbootimg
الوسيطة | الوصف |
---|---|
--ramdisk_type |
نوع قرص التخزين المؤقت في ذاكرة الوصول العشوائي، يمكن أن يكون أحد القيم التالية: NONE
PLATFORM أو RECOVERY أو DLKM .
|
--board_id[0-15] |
حدِّد متجه board_id ، الذي يتم ضبطه تلقائيًا على 0 . |
في ما يلي مثال على الضبط:
BOARD_KERNEL_MODULE_DIRS := foo bar baz
BOARD_BOOT_HEADER_VERSION := 4
BOARD_VENDOR_RAMDISK_FRAGMENTS := dlkm_foobar
BOARD_VENDOR_RAMDISK_FRAGMENT.dlkm_foobar.KERNEL_MODULE_DIRS := foo bar
BOARD_VENDOR_RAMDISK_FRAGMENT.dlkm_foobar.MKBOOTIMG_ARGS := --board_id0 0xF00BA5 --board_id1 0xC0FFEE
سيتضمّن vendor_boot
الناتج جزءَين من ذاكرة التخزين المؤقت للجهاز من المورّد.
الأول هو ذاكرة الوصول العشوائي "التلقائية"، التي تحتوي على دليل DLKM baz
وبقية الملفات في $(TARGET_VENDOR_RAMDISK_OUT)
. أما القسم الثاني، فهو ملف ذاكرة التخزين المؤقت
dlkm_foobar
الذي يحتوي على دليلَي DLKM foo
وbar
، ويُعدّ --ramdisk_type
الإعداد التلقائي لDLKM
.