قد لا تحتوي صورة 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
.
الوثائق ذات الصلة
للتعرف على كيفية إنشاء قسم تمهيد البائع (الذي يحتوي على قرص ذاكرة الوصول العشوائي الخاص بالمورد المذكور في هذه الصفحة)، راجع أقسام التمهيد .