تنفيذ قسم وحدة GKI

يمكن تحديث صورة النواة العامة (GKI) ووحدات GKI بشكل مستقل عن بقية القسم لأنّ وحدات GKI تقع على قسم ديناميكي منفصل في الصورة الفائقة يُسمّى system_dlkm. توقّع Google وحدات GKI باستخدام زوج المفاتيح في وقت إنشاء النواة، ولا تتوافق هذه الوحدات إلا مع صورة النواة العامة التي تم إنشاؤها بها. لا يتوفّر توافق واجهة التطبيق الثنائية (ABI) بين صورة النواة العامة ووحدات GKI، ولتحميل الوحدات بشكل صحيح أثناء وقت التشغيل، يجب إنشاء صورة النواة العامة ووحدات GKI وتحديثهما معًا.

.

تنفيذ دعم قسم system_dklm

يقع قسم system_dlkm في القسم الفائق كقسم ديناميكي آخر. يمكن أن يحتوي هذا القسم على ما يلي:

  • وحدات النواة الموقّعة في وقت الإنشاء من Google
  • عناصر depmod

إنشاء system_dlkm

تشبه عملية إنشاء system_dlkm عملية إنشاء الأقسام الديناميكية الأخرى. اتّبِع الخطوات التالية لإضافة system_dlkm إلى عملية الإنشاء:

  1. في 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
    
  2. في قائمة الأقسام، أضِف system_dlkm: BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (اختياري) بالنسبة إلى أجهزة A/B والأجهزة الافتراضية A/B، أضِف السطر التالي في ملف device.mk لجهازك:

    AB_OTA_PARTITIONS += system_dlkm
    

تحديد وحدات النواة التي سيتم نسخها إلى system_dlkm

لتحميل الوحدات بنجاح في وقت التشغيل، يجب إنشاء صورة النواة العامة ووحدات 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 حالة اختبار GKI VTS للتحقّق من قسم system_dlkm. لاستدعاء الاختبار يدويًا، استخدِم أمر atest التالي:

  atest -c vts_dlkm_partition_test