دعم وحدة النواة

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

موقع الوحدة

ملف 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 كقرص RAM الخاص بـ 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 لذاكرة الوصول العشوائي للمورّد.

ينشئ عملية الإنشاء أيضًا ملف 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 إلى قسم المورّد في الموقع الجغرافي نفسه. تظل آلية تحميل وحدات النواة من /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 لوحدة النواة قاعدة إنشاء تضمن أنّ الإصدار الأساسي من النظام الأساسي يمكنه إنشاء الأرشيف عند الحاجة.

الاسترداد

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

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