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

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