طرَح نظام Android 11 مفهوم النواة العامة (Kernel)
صورة (GKI) لتفعيل تشغيل جهاز عشوائي باستخدام لوحة مفاتيح GKI، يجب على نظام التشغيل Android
يمكن لـ 11 جهازًا استخدام الإصدار 3 من عنوان صورة التشغيل. ضِمن
3، يتم حذف كل المعلومات الخاصة بالمورّد من boot
ونقلت إلى قسم vendor_boot
جديد. جهاز ARM64
بدءًا من نظام التشغيل Android 11 على نواة Linux 5.4، يجب
يتيح تقسيم vendor_boot
وتنسيق القسم المحدّث boot
اجتياز الاختبار باستخدام GKI.
يمكن لأجهزة Android 12 استخدام الإصدار 4 من عنوان صورة التشغيل،
التي تتيح تضمين عدة شرائح من البائعين في vendor_boot
قسم القرص. يتم ربط أجزاء من ذاكرة الوصول العشوائي للمورّد الواحد تلو الآخر
في قسم ذاكرة الوصول العشوائي للبائع. يُستخدم جدول ذاكرة التخزين المؤقت للبائع لوصف
تخطيط قسم ذاكرة التخزين المؤقت للبائع والبيانات الوصفية لكل قاعدة بيانات خاصة ببائع
.
بنية القسم
إنّ قسم تشغيل الجهاز الذي يشغِّله المورّد هو A/B-ed مع اختبار A/B افتراضي وحمايته بواسطة Android. التشغيل المتحقَّق منه.
الإصدار 3
يتكون التقسيم من رأس، وذاكرة وصول عشوائي للمورِّد، وملف ثنائي كبير لشجرة الجهاز (DTB).
القسم | عدد الصفحات |
---|---|
عنوان تشغيل المورّد (عدد الصفحات) | n = (2112 + page_size - 1) / page_size |
ملف RAMD للمورّد (صفحات o) | o = (vendor_ramdisk_size + page_size - 1) / page_size |
DTB (صفحات p) | p = (dtb_size + page_size - 1) / page_size |
الإصدار 4
يتكون التقسيم من رأس، وقسم RAMD للمورد (يتكون من جميع أجزاء ذاكرة الوصول العشوائي الخاصة بالمورد، والمتسلسلة، والكائن الثنائي الكبير لشجرة الجهاز (DTB)، جدول ذاكرة التخزين المؤقت للبائع.
القسم | عدد الصفحات |
---|---|
عنوان تشغيل المورّد (عدد الصفحات) | n = (2128 + page_size - 1) / page_size |
أجزاء من ذاكرة الوصول العشوائي للمورّد (صفحات o) | o = (vendor_ramdisk_size + page_size - 1) / page_size |
DTB (صفحات p) | 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 |
عنوان تشغيل المورّد
يتكون محتوى رأس قسم تشغيل المورد من بيانات في الأساس التي تمّ نقلها إلى هناك من عنوان صورة التشغيل. أُنشأها جون هنتر، الذي كان متخصصًا أيضًا على معلومات حول برنامج ramdisk للبائع.
الإصدار 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
إلى نوع القرص، والقيم المحتملة هي:- تشير السمة
VENDOR_RAMDISK_TYPE_NONE
إلى أنّ القيمة غير محدّدة. VENDOR_RAMDISK_TYPE_PLATFORM
تحتوي ملفات RAMD على وحدات بت خاصة بالنظام الأساسي. ويجب أن يحمّل برنامج الإقلاع دائمًا هذه الملفات في الذاكرة.- تحتوي
VENDOR_RAMDISK_TYPE_RECOVERY
ملفات RAMD على موارد استرداد. تشير رسالة الأشكال البيانية برنامج الإقلاع على تحميله في الذاكرة عند بدء الاسترداد. - تحتوي ملفات RAMD على
VENDOR_RAMDISK_TYPE_DLKM
على نواة ديناميكية قابلة للتحميل. الوحدات.
- تشير السمة
- "
ramdisk_name
" هو اسم فريد للقرع. board_id
هو متجه لمعرّفات الأجهزة التي يحدّدها المورّد.
التوافق مع برنامج الإقلاع
ولأن قسم تشغيل المورد يحتوي على معلومات (مثل حجم صفحة الفلاش، والنواة (kernel) وعناوين تحميل RAMdisk وDTB نفسه) التي كانت موجودة سابقًا في في قسم التشغيل، يجب أن يصل برنامج الإقلاع إلى كل من بدء التشغيل والتشغيل من قِبل البائع الأقسام المختلفة للحصول على بيانات كافية لإكمال عملية التشغيل.
يجب أن يحمِّل برنامج الإقلاع قرص ذاكرة التخزين المؤقت العام في الذاكرة فورًا من خلال اتّباع الخطوات التالية:
القرص الكامل للمورد (تدعم تنسيقات CPIO وGzip وlz4 هذا النوع من
والتسلسل). يجب عدم محاذاة الصورة العامة للقرص أو تقديم أي
والمسافة الأخرى بينه وبين نهاية قرص المورد في الذاكرة. بعد
تقوم بفك ضغط kernel، وتُستخرج الملف المتسلسل إلى initramfs
،
وينتج عن ذلك بنية ملف تمثل قرصًا عامًا متراكبًا على
لهيكل ملف ramdisk للبائع.
نظرًا لأنه يتم دمج ramdisk العام وجدول ذاكرة البائع، فيجب أن يكونا في بنفس التنسيق. تستخدم صورة تمهيد GKI قرص RAM عامًا مضغوطًا بتنسيق lz4، يجب أن يستخدم الجهاز المتوافق مع GKI رمز ذاكرة وصول عشوائي (RAM) مضغوطًا من نوع lz4. تشير رسالة الأشكال البيانية لذلك موضحة أدناه.
يمكنك الاطّلاع على شرح متطلبات برنامج الإقلاع لتوفير الدعم لعملية الضبط في نظام التشغيل التنفيذ Bootconfig.
ذاكرة وصول عشوائي متعددة من جانب مورِّدين (الإصدار 4)
فمع الإصدار 4 من رأس صورة التشغيل، يمكن لبرنامج الإقلاع تحديد مجموعة فرعية أو
جميع عمليات الهجرة إلى جانب المورد لتحميلها مثل initramfs
أثناء وقت التشغيل. تشير رسالة الأشكال البيانية
يحتوي جدول رامديسك الخاص بالبائع على بيانات وصفية لكل ذاكرة وصول عشوائي، ويمكن أن يساعد في
برنامج الإقلاع في تحديد ملفات الهضم التي سيتم تحميلها. يمكن لبرنامج الإقلاع تحديد
من أجل تحميل ملفات RAMD خاصة بالبائعين، طالما أن القرص العام
آخر تحميل.
على سبيل المثال، يمكن أن يحذف برنامج الإقلاع ملفات RAMD من النوع الذي يتم تحميله
VENDOR_RAMDISK_TYPE_RECOVERY
أثناء التشغيل العادي للحفاظ على الموارد، لذلك
عمليات إعادة التوجيه للبائعين من النوع VENDOR_RAMDISK_TYPE_PLATFORM
يتم تحميل VENDOR_RAMDISK_TYPE_DLKM
في الذاكرة. من ناحية أخرى، يمكن للبائع
حلقات رمضان من النوع VENDOR_RAMDISK_TYPE_PLATFORM
، VENDOR_RAMDISK_TYPE_RECOVERY
وVENDOR_RAMDISK_TYPE_DLKM
يتم تحميلها في الذاكرة عند بدء تشغيل الاسترداد
الحالي.
بدلاً من ذلك، يمكن أن يتجاهل برنامج الإقلاع جدول ذاكرة التخزين المؤقت للمورد وتحميل ملف
قسم ذاكرة الوصول العشوائي للبائع بأكمله. وينتج عن ذلك التأثير نفسه الذي يؤديه تحميل جميع
أجزاء قرص ذاكرة التخزين المؤقت للمورد في قسم vendor_boot
.
تقديم الدعم
لتنفيذ دعم تمهيد المورد للجهاز:
اضبط السمة
BOARD_BOOT_HEADER_VERSION
على3
أو أعلى.اضبط
BOARD_RAMDISK_USE_LZ4
علىtrue
إذا كان جهازك متوافقًا مع GKI، أو إذا كان فإنه يستخدم في الحالات الأخرى قرصًا عامًا مضغوطًا باستخدام lz4.اضبط
BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE
على حجم مناسب الجهاز، مع الأخذ في الاعتبار وحدات النواة (النواة) التي يجب أن تعمل على القرص الكامل للبائع.يجب تعديل "
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)
لتضمين عدة خطط طارئة للمورّدين في vendor_boot
:
- اضبط السمة
BOARD_BOOT_HEADER_VERSION
على4
. ضبط
BOARD_VENDOR_RAMDISK_FRAGMENTS
على قائمة ذاكرة RAMD للمورّد المنطقي أسماء الأجزاء المراد تضمينها فيvendor_boot
لإضافة ذاكرة وصول عشوائي مخصصة للمورّد، قم بتعيين
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).PREBUILT
إلى العناصر التي تم إنشاؤها مسبقًا .لإضافة ذاكرة وصول عشوائي لمورِّد DLKM، اضبط في
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).KERNEL_MODULE_DIRS
قائمة بدلائل وحدات النواة المراد تضمينها.ضبط
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).MKBOOTIMG_ARGS
علىmkbootimg
وسيطة. ها هي--board_id[0-15]
و--ramdisk_type
. وسيطات لجزء ramdisk الخاص بالبائع. بالنسبة إلى بائع 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
. يحتوي الهرم بعد ذلك على جميع ملفات الاسترداد، وهي الملفات التي يتم تثبيتها ضمن$(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
الناتجة على جزءَين من ذاكرة الوصول العشوائي (RAM) الخاصة بالمورِّد. تشير رسالة الأشكال البيانية
الأول هو "الافتراضي" ramdisk، الذي يحتوي على دليل DLKM baz
باقي الملفات في $(TARGET_VENDOR_RAMDISK_OUT)
. والثاني هو
dlkm_foobar
ramdisk، الذي يحتوي على دليلَي DLKM foo
وbar
،
والإعداد التلقائي لـ --ramdisk_type
هو DLKM
.