يمكن تحديث صورة النواة العامة (GKI) ووحدات GKI بشكل مستقل عن بقية الأقسام، لأنّ وحدات GKI تقع في قسم ديناميكي منفصل في الصورة الفائقة يُسمى system_dlkm. توقّع Google وحدات GKI باستخدام زوج المفاتيح في وقت إنشاء النواة، ولا تتوافق هذه الوحدات إلا مع GKI التي تم إنشاؤها بها.
لا تتوافق واجهة التطبيق الثنائية (ABI) بين صورة النواة العامة (GKI) ووحدات GKI، ويجب إنشاء صورة النواة العامة ووحدات GKI وتحديثها معًا لكي يتم تحميل الوحدات بشكل صحيح أثناء وقت التشغيل.
تنفيذ دعم تقسيم system_dklm
يقع القسم system_dlkm في القسم الفائق كقسم ديناميكي آخر. يمكن أن يحتوي هذا القسم على ما يلي:
- وحدات نواة موقَّعة في وقت الإنشاء من Google
depmodعنصر
الإصدار system_dlkm
إنشاء system_dlkm هو عملية مشابهة لإنشاء الأقسام الديناميكية الأخرى. اتّبِع الخطوات التالية لإضافة system_dlkm إلى الإصدار:
في
BoardConfig.mk، أضِف الإدخالات التالية:BOARD_USES_SYSTEM_DLKMIMAGE := true BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE) TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkmفي قائمة الأقسام، أضِف
system_dlkm:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm(اختياري) بالنسبة إلى أجهزة اختبار A/B واختبار A/B الافتراضي، أضِف السطر التالي في ملف
device.mkالخاص بجهازك:AB_OTA_PARTITIONS += system_dlkm
تحديد وحدات النواة المطلوب نسخها إلى system_dlkm
لكي يتم تحميل الوحدات بنجاح في وقت التشغيل، يجب إنشاء GKI ووحدات GKI معًا. لذلك، يجب تحديد وحدات النواة في إصدار GKI لبنية النظام المستهدَفة وتوفيرها كمصدر لقسم system_dlkm أثناء إنشاء النظام الأساسي.
لنظام التشغيل Android 13
أضِف BOARD_SYSTEM_DLKM_SRC إلى مجلد يحتوي على وحدات GKI المطلوبة
وملفات عناصر النواة للجهاز كمدخل إلى نظام الإصدار لإنشاء
القسم system_dlkm. مثلاً:
قدِّم مصدر وحدات GKI في مجلد وأشِر إلى BOARD_SYSTEM_DLKM_SRC
هذا المجلد. مثلاً:
BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging
أثناء عملية الإنشاء، يتم تثبيت الوحدات المدرَجة في BOARD_SYSTEM_DLKM_SRC ضمن $ANDROID_PRODUCT_OUT/system_dlkm.
بالنسبة إلى Android 14
لقد بسّطنا عملية التنفيذ باستخدام وحدات الماكرو (BOARD_*_KERNEL_MODULES) المستخدَمة في أقسام *_dlkm الأخرى. يجب أن يشير ماكرو BOARD_SYSTEM_KERNEL_MODULES إلى قائمة وحدات GKI المطلوبة للجهاز. ويتم تثبيت هذه الوحدات في $ANDROID_PRODUCT_OUT/system_dlkm أثناء عملية الإنشاء. أي وحدة في القسم vendor_dlkm تعتمد على الوحدات في القسم system_dlkm تنشئ مراجع صحيحة في الملف modules.dep للقسم vendor_dlkm. بسبب التبعيات بين الأقسام التي يمثّلها modules.dep، عند تحميل وحدة خاصة بمورّد، يتم تحميل أي وحدة GKI مطلوبة تلقائيًا.
على سبيل المثال، لتثبيت جميع وحدات GKI على القسم system_dlkm لنواة GKI
arm64 5.15 من الإصدارات المسبقة:
BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)
تثبيت system_dlkm في وقت التشغيل
استنادًا إلى نظام الملفات المستخدَم كنظام ملفات للقراءة فقط، أضِف ما يلي في fstab لتحميل القسم system_dlkm في وقت التشغيل:
ext4 كنظام ملفات للقراءة فقط
system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
erofs كنظام ملفات للقراءة فقط
system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb
تركيب الأقسام وتحميل الوحدات
أثناء first_stage_init، يتم تركيب القسم system_dlkm في /system_dlkm كنظام ملفات للقراءة فقط. عند ربط وحدة التخزين بنجاح، ستتوفّر الروابط الرمزية في /system/lib/modules التي تشير إلى /system_dlkm/lib/modules.
يمكن بعد ذلك لعملية خاصة بمورّد، مثل نص برمجي .rc، تحميل وحدات النواة
استنادًا إلى الترتيب المحدّد في modules.load. يجب أن تستخدم عملية المورّد الرابط الرمزي /system/lib/modules لتحميل الوحدات.
وإذا لزم الأمر، يمكن أن تحمّل عملية المورّد الوحدات في وقت لاحق.
SELinux
يتم تصنيف كل ملف في القسم system_dlkm باستخدام سياق الملف system_dlkm_file. لتحميل ملف وحدات GKI في قسم system_dlkm، يجب أن تتضمّن عملية المورّد المسؤولة عن تحميل الوحدات sepolicy في نطاق المورّد.
على سبيل المثال، dlkm_loader الذي يستخدمه Cuttlefish لتحميل وحدات GKI يتضمّن الأذونات التالية في ملف السياسة على shared/sepolicy/vendor/dlkm_loader.te:
allow dlkm_loader self:capability sys_module;
allow dlkm_loader system_dlkm_file:dir r_dir_perms;
allow dlkm_loader system_dlkm_file:file r_file_perms;
allow dlkm_loader system_dlkm_file:system module_load;
إثبات صحة قسم system-dlkm
توفّر Google حالة اختبار VTS لواجهة GKI للتحقّق من القسم system_dlkm. لتشغيل الاختبار يدويًا، استخدِم الأمر atest التالي:
atest -c vts_dlkm_partition_test