دعم وحدة Kernel

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

موقع الوحدة

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

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

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

تحميل الوحدة النمطية في المرحلة الأولى

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

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

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

يقوم البناء أيضًا بإنشاء ملف 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

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

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

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

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

استعادة

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

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