التوافق مع وحدة النواة

قد لا تحتوي صورة kernel generic (GKI) على التوافق المطلوب مع برنامج التشغيل لسماح الجهاز بتثبيت الأقسام. لتفعيل إمكانية تثبيت الأقسام على الجهاز و لمواصلة عملية التشغيل، يتم تحسين المرحلة الأولى من init لتحميل وحدات kernel المتوفّرة على ذاكرة الوصول العشوائي (RAM). يتم تقسيم ذاكرة التخزين المؤقت في ذاكرة الوصول العشوائي إلى ذاكرة تخزين مؤقت عامة و ذاكرة تخزين مؤقت من المصنّع. يتم تخزين وحدات نواة المورّد في ذاكرة الوصول العشوائي (RAM) الخاصة بالمورّد. يمكن ضبط الترتيب الذي يتم تحميل وحدات kernel به.

موقع الوحدة

ملف ramdisk هو نظام الملفات الخاص بالخطوة الأولى من init, وملف recovery/fastbootd على أجهزة A/B وأجهزة A/B الافتراضية. وهو عبارة عن initramfs يتألف من أرشيفَين بتنسيق cpio يتم تسلسلهما من قِبل برنامج الإقلاع. يحتوي أرشيف cpio الأول، الذي يتم تخزينه كمساحة تخزين مؤقت في ذاكرة الوصول العشوائي (ramdisk) الخاصة بالبائع في قسم vendor-boot، على المكوّنات التالية:

  • وحدات نواة init الخاصة بالمورّد في المرحلة الأولى، والتي يمكن العثور عليها في /lib/modules/
  • ملفات الإعدادات modprobe، والتي يمكن العثور عليها في /lib/modules/: modules.dep وmodules.softdep modules.alias وmodules.options
  • ملف modules.load يشير إلى الوحدات التي يجب تحميلها أثناء بدء المرحلة الأولى، وترتيبها في /lib/modules/
  • وحدات نواة استرداد بيانات المورّدين لأجهزة A/B وأجهزة A/B الافتراضية في /lib/modules/
  • modules.load.recovery التي تشير إلى الوحدات التي يجب تحميلها، بالترتيب، لأجهزة A/B وأجهزة A/B التجريبية، في /lib/modules.

يحتوي أرشيف cpio الثاني، الذي يتم توفيره مع GKI بصفته ملف ramdisk لملف boot.img ويتم تطبيقه على ملف الأول، على first_stage_init والمكتبات التي يعتمد عليها.

تحميل الوحدة في مرحلة الإعداد الأولى

تبدأ المرحلة الأولى من init بقراءة ملفات إعدادات modprobe من /lib/modules/ على ذاكرة الوصول العشوائي (RAM). بعد ذلك، يقرأ البرنامج قائمة بالوحدات المحدّدة في /lib/modules/modules.load (أو /lib/modules/modules.load.recovery في حال استرجاع البيانات) ويحاول تحميل كلّ وحدة من هذه الوحدات بالترتيب، وفقًا للإعدادات المحدّدة في الملفات التي تم تحميلها سابقًا. قد يتمّ الانحراف عن الطلب المطلوب لاستيفاء التبعيات الصارمة أو غير الصارمة.

إنشاء الدعم، الإعداد في المرحلة الأولى

لتحديد وحدات kernel التي سيتم نسخها إلى ملف cpio الخاص بذاكرة التخزين المؤقت للجهاز، أدرِج هذه الوحدات في BOARD_VENDOR_RAMDISK_KERNEL_MODULES. يُشغِّل الإصدار depmod هذه الوحدات ويضع ملفات إعدادات modprobe المنتجة في ملف cpio لذاكرة الوصول العشوائي (RAM) الخاصة بالمورّد.

ينشئ عملية الإنشاء أيضًا ملف modules.load ويخزّنه في ملف vendor ramdisk cpio. يتضمّن هذا القسم تلقائيًا جميع الوحدات المدرَجة في BOARD_VENDOR_RAMDISK_KERNEL_MODULES. لإلغاء محتوى هذا الملف، استخدِم BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD، كما هو موضّح في هذا المثال:

BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := \
    device/vendor/mydevice-kernel/first.ko \
    device/vendor/mydevice-kernel/second.ko \
    device/vendor/mydevice-kernel/third.ko

دعم الإصدارات الكاملة من Android

كما هو الحال في الإصدارات 10 من Android والإصدارات الأقدم، تنسخ منصة Android ملف ‎"ملف kernel" المدرَج في ‎BOARD_VENDOR_KERNEL_MODULES إلى قسم المورِّد في ‎/vendor/lib/modules. يُشغِّل ملف برمجة التطبيقات لنظام التشغيلdepmod هذه الوحدات، وينسخ ملفات الإخراجdepmod إلى قسم المورّد في الموقع نفسه. تظل آلية تحميل وحدات kernel من /vendor كما هي في الإصدارات السابقة من Android. يمكنك تحديد كيفية تحميل هذه الوحدات ووقت تحميلها، على الرغم من أنّه يتم عادةً إجراء ذلك باستخدام ملفَّي برمجة init.rc.

أحرف البدل وإصدارات النواة المدمجة

قد يواجه المورّدون الذين يجمعون بين إصدار نواة الجهاز وإصدار نظام Android الأساسي مشكلة عند استخدام وحدات الماكرو BOARD المذكورة أعلاه لتحديد وحدات النواة التي سيتم نسخها على الجهاز. إذا أراد المورّد تجنُّب إدراج وحدات kernel في ملفات إنشاء النظام الأساسي للجهاز، يمكنه استخدام علامة wildcard ($(wildcard device/vendor/mydevice/*.ko). يُرجى العِلم أنّ العلامة wildcard لا تعمل في حال إنشاء kernel مُدمج، لأنّه عند استدعاء make وتوسيع الوحدات النمطية في ملفات makefiles، لم يتم إنشاء وحدات kernel، وبالتالي تكون الوحدات النمطية فارغة.

لحلّ هذه المشكلة، قد يطلب المورّد من فريقه إنشاء ملف أرشيف zip يحتوي على وحدات kernel التي سيتم نسخها إلى كل قسم. اضبط مسار أرشيف zip هذا في BOARD_*_KERNEL_MODULES_ARCHIVE حيث يكون * هو اسم القسم (مثل BOARD_VENDOR_KERNEL_MODULES_ARCHIVE). يستخرج إصدار نظام التشغيل Android أرشيف zip هذا في الموقع المناسب ويشغّل depmod على الوحدات.

يجب أن يتضمّن أرشيف zip الخاص بوحدة kernel قاعدة make تضمن أنّه يمكن لـ platform build إنشاء الأرشيف عند الحاجة.

الاسترداد

في إصدارات Android السابقة، كانت وحدات kernel المطلوبة للاسترداد محددة في BOARD_RECOVERY_KERNEL_MODULES. في Android 12، لا يزال يتم تحديد وحدات kernel المطلوبة لاسترداد النظام باستخدام هذا الماكرو. ومع ذلك، يتم نسخ وحدات نواة الاسترداد إلىملف cpio الخاص بذاكرة التخزين المؤقت للجهاز من المورّد بدلاً من ملف cpio العام لذاكرة التخزين المؤقت. يتم تلقائيًا تحميل كل وحدات kernel المدرَجة في BOARD_RECOVERY_KERNEL_MODULES أثناء المرحلة الأولى من init. إذا كنت تريد تحميل مجموعة فرعية فقط من هذه الوحدات، حدِّد محتوى هذه المجموعة الفرعية في BOARD_RECOVERY_KERNEL_MODULES_LOAD.

للتعرّف على كيفية إنشاء قسم تمهيد خاص بالمورّد (يحتوي على ملف "أداة بدء التشغيل" المُشار إليه في هذه الصفحة)، يُرجى الاطّلاع على أقسام التمهيد.