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

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

موقع الوحدة

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

  • المرحلة الأولى من وحدات النواة (init) الخاصة بالمورِّدين المتوفّرة في /lib/modules/
  • modprobe ملف إعداد موجود في /lib/modules/: modules.dep، modules.softdep، modules.alias، modules.options.
  • ملف modules.load يشير إلى الوحدات المطلوب تحميلها خلال المرحلة الأولى، وبأي ترتيب، /lib/modules/
  • وحدات نواة استرداد المورِّدين، لأجهزة A/B وVirtual 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/ على الهرم. بعد ذلك، يقرأ قائمة من الوحدات المحدّدة في /lib/modules/modules.load (أو في الحالة من عملية الاسترداد، /lib/modules/modules.load.recovery) ويحاول تحميل كل وحدة من هذه الوحدات بالترتيب، وفقًا للإعدادات المحددة في الملفات المحملة مسبقًا. قد ينحرف الطلب المطلوب من إلى يلبي التبعيات الصعبة أو الخفيفة.

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

لتحديد وحدات kernel المراد نسخها إلى وحدة ramdisk cpio للمورد، في 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

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

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

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

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

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

استعادة الكرة

في إصدارات Android السابقة، كانت وحدات النواة المطلوبة لاسترداد البيانات المحددة في BOARD_RECOVERY_KERNEL_MODULES. في Android 12، لا تزال وحدات النواة (kernel) المطلوبة للاسترداد لا تزال باستخدام هذا الماكرو. ومع ذلك، يتم نسخ وحدات نواة الاسترداد إلى للبائع ramdisk cpio، بدلاً من العام ramdisk cpio. كل العناصر تلقائيًا تم تحميل وحدات النواة (kernel) المُدرجة في BOARD_RECOVERY_KERNEL_MODULES. خلال المرحلة الأولى من "init" إذا كنت تريد فقط مجموعة فرعية من هذه الوحدات المراد تحميلها، حدد محتويات تلك المجموعة الفرعية في BOARD_RECOVERY_KERNEL_MODULES_LOAD

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