يمكن تحديث وحدات GKI وGKI بشكل مستقل عن بقية القسم لأن وحدات GKI موجودة في قسم ديناميكي منفصل في الصورة الفائقة التي تسمى system_dlkm
. يتم توقيع وحدات GKI بواسطة Google باستخدام زوج مفاتيح وقت إنشاء kernel وهي متوافقة فقط مع GKI التي تم إنشاؤها بها. لا يوجد استقرار ABI بين وحدات GKI وGKI؛ لكي يتم تحميل الوحدات بشكل صحيح أثناء وقت التشغيل، يجب إنشاء وحدات GKI وGKI وتحديثها معًا.
تنفيذ دعم قسم system_dklm
يوجد قسم system_dlkm
في القسم الفائق كقسم ديناميكي آخر. يمكن أن يحتوي هذا القسم على:
- وحدات kernel الموقعة في وقت البناء من 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
تحديد وحدات kernel لنسخها إلى system_dlkm
لكي يتم تحميل الوحدات بنجاح في وقت التشغيل، يجب إنشاء وحدات GKI وGKI معًا. لذلك، يجب عليك تحديد وحدات kernel في بنية GKI للبنية المستهدفة وتوفير ذلك كمصدر لقسم system_dlkm
أثناء إنشاء النظام الأساسي.
لنظام أندرويد 13
قم بتوجيه BOARD_SYSTEM_DLKM_SRC
إلى مجلد يحتوي على ملفات كائنات kernel لوحدات 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
.
لنظام أندرويد 14
لقد قمنا بتبسيط التنفيذ باستخدام وحدات الماكرو ( BOARD_*_KERNEL_MODULES
) المستخدمة لأقسام *_dlkm
الأخرى. يجب الرجوع إلى قائمة وحدات GKI المطلوبة للجهاز بواسطة الماكرو BOARD_SYSTEM_KERNEL_MODULES
. في وقت الإنشاء، يتم تثبيت هذه الوحدات في $ANDROID_PRODUCT_OUT/system_dlkm
. تقوم أي وحدة نمطية في قسم vendor_dlkm
والتي لها تبعيات على الوحدات النمطية الموجودة في قسم system_dlkm
بإنشاء مراجع صحيحة في ملف modules.dep
لقسم vendor_dlkm
. نظرًا لتبعيات الأقسام المتقاطعة التي يمثلها modules.dep
، فعندما يتم تحميل وحدة البائع، يتم تحميل أي وحدة GKI مطلوبة تلقائيًا.
على سبيل المثال، لتثبيت جميع وحدات GKI على قسم system_dlkm
لـ GKI arm64
kernel 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
، تحميل وحدات kernel بناءً على الترتيب المحدد في 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;
التحقق من صحة قسم dlkm النظام
توفر Google حالة اختبار GKI VTS للتحقق من قسم system_dlkm
. لاستدعاء الاختبار يدويًا، استخدم الأمر atest
التالي:
atest -c vts_dlkm_partition_test