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

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

تحديد وحدات kernel المطلوب نسخها إلى system_dlkm

لكي يتم تحميل الوحدات بنجاح أثناء التشغيل، يجب إنشاء وحدات GKI وGKI معًا. لذلك، عليك تحديد وحدات kernel في إصدار GKI للبنية المستهدفة وتقديمها كمصدر للقسيمة system_dlkm أثناء إنشاء النظام الأساسي.

لنظام التشغيل Android 13

اضبط العنصر BOARD_SYSTEM_DLKM_SRC على مجلد يحتوي على وحدات GKI المطلوبة وملفات مثيل kernel للجهاز كمدخل لنظام الإنشاء لإنشاء القسم 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 الأخرى. يجب أن تتم الإشارة إلى قائمة وحدات 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;

التحقّق من صحّة قسم system-dlkm

توفّر Google نموذج اختبار GKI VTS للتحقّق من قسم system_dlkm. لبدء الاختبار يدويًا، استخدِم الأمر atest التالي:

  atest -c vts_dlkm_partition_test