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

يمكن تحديث وحدات 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 إلى الإصدار الخاص بك:

  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 أثناء إنشاء النظام الأساسي.

لنظام أندرويد 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