دعم وحدة Kernel

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

موقع الوحدة

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

  • وحدات 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 من /lib/modules/ على ramdisk. بعد ذلك ، تقرأ قائمة الوحدات المحددة في /lib/modules/modules.load (أو في حالة الاسترداد ، /lib/modules/modules.load.recovery ) وتحاول تحميل كل من هذه الوحدات بالترتيب ، باتباع التكوين المحدد في الملفات التي تم تحميلها مسبقًا. قد ينحرف الترتيب المطلوب عن لتلبية التبعيات الثابتة أو اللينة.

بناء الدعم ، المرحلة الأولى

لتحديد وحدات kernel النمطية المراد نسخها في وحدة التخزين ramdisk للمورد ، قم بإدراجها في BOARD_VENDOR_RAMDISK_KERNEL_MODULES . يعمل الإصدار على تشغيل depmod على هذه الوحدات ويضع ملفات تكوين modprobe الناتجة في وحدة التخزين ramdisk cpio الخاصة بالمورد.

ينشئ البناء أيضًا ملف modules.load ويخزنه في البائع 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 والإصدارات الأقل ، يتم نسخ وحدات kernel المُدرجة في BOARD_VENDOR_KERNEL_MODULES بواسطة نظام Android الأساسي إلى قسم البائع في /vendor/lib/modules . يعمل بناء النظام الأساسي على تشغيل depmod على هذه الوحدات النمطية ، ونسخ ملفات الإخراج depmod إلى قسم البائع في نفس الموقع. تظل آلية تحميل وحدات kernel من /vendor كما كانت في الإصدارات السابقة من Android. إن قرارك هو كيف ومتى يتم تحميل هذه الوحدات ، على الرغم من أن هذا يتم عادةً باستخدام البرامج النصية init.rc

أحرف البدل وبناء النواة المتكاملة

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

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

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

استعادة

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

لمعرفة المزيد حول إنشاء قسم تمهيد البائع (الذي يحتوي على قرص RAM الخاص بالمورد المذكور في هذه الصفحة) ، راجع أقسام التمهيد .