قد لا تحتوي صورة النواة العامة (GKI) على دعم برنامج التشغيل المطلوب
لتمكين الجهاز من تثبيت الأقسام. لتمكين الجهاز من تثبيت الأقسام ومواصلة عملية التشغيل، تم تحسين init في المرحلة الأولى لتحميل وحدات النواة المتوفّرة على قرص RAM. يتم تقسيم ramdisk إلى ramdisk عام وramdisk خاص بالبائع. يتم تخزين وحدات نواة المورّد في ramdisk المورّد. يمكن ضبط ترتيب تحميل وحدات النواة.
موقع الوحدة
وramdisk هو نظام الملفات الخاص بالمرحلة الأولى من init, ولصورة الاسترداد/fastbootd على أجهزة A/B والأجهزة التي تستخدم ميزة "A/B الافتراضية". وهي
initramfs تتألف من أرشيفَين بتنسيق cpio يتم ربطهما معًا بواسطة برنامج الإقلاع. يحتوي أرشيف cpio الأول، الذي يتم تخزينه كقرص RAM خاص بالمورّد في قسم vendor_boot، على المكوّنات التالية:
- وحدات kernel الخاصة بمورّد
initفي المرحلة الأولى، والموجودة في/lib/modules/ - ملفات الإعداد
modprobe، والموجودة في/lib/modules/:modules.dep،modules.softdep،modules.alias،modules.options - ملف
modules.loadيشير إلى الوحدات التي سيتم تحميلها أثناء عملية التهيئة في المرحلة الأولى، والترتيب الذي سيتم تحميلها به، في/lib/modules/ - وحدات kernel الخاصة باسترداد بيانات المورّد، لأجهزة A/B وVirtual A/B، في
/lib/modules/ modules.load.recoveryالذي يشير إلى الوحدات التي سيتم تحميلها والترتيب الذي سيتم تحميلها به على أجهزة اختبارات A/B وVirtual A/B، وذلك في/lib/modules
يحتوي أرشيف cpio الثاني، الذي يتم توفيره مع GKI
كقرص RAM الخاص بملف boot.img ويتم تطبيقه فوق
الأرشيف الأول، على first_stage_init والمكتبات التي يعتمد عليها.
تحميل الوحدات في مرحلة الإعداد الأولى
تبدأ المرحلة الأولى init بقراءة ملفات إعدادات modprobe
من /lib/modules/ على ramdisk. بعد ذلك، يقرأ قائمة الوحدات المحدّدة في /lib/modules/modules.load (أو في حالة الاسترداد، /lib/modules/modules.load.recovery) ويحاول تحميل كل وحدة من هذه الوحدات بالترتيب، مع اتّباع الإعدادات المحدّدة في الملفات التي تم تحميلها سابقًا. قد يتم تغيير ترتيب الطلبات المطلوب لتلبية التبعيات الصعبة أو السهلة.
إنشاء دعم، تهيئة المرحلة الأولى
لتحديد وحدات kernel التي سيتم نسخها إلى cpio الخاص بـ ramdisk الخاص بالمورّد، أدرِجها في BOARD_VENDOR_RAMDISK_KERNEL_MODULES. يتم تنفيذ عملية الإنشاء
depmod على هذه الوحدات، ويتم وضع ملفات إعدادات modprobe الناتجة
في ملف cpio الخاص بذاكرة الوصول العشوائي (ramdisk) الخاصة بالمورّد.
ينشئ الإصدار أيضًا ملف 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 والإصدارات الأقدم، يتم نسخ وحدات النواة المُدرَجة في
BOARD_VENDOR_KERNEL_MODULES بواسطة إصدار
نظام Android الأساسي إلى قسم المورّد في /vendor/lib/modules. يتم تشغيل إصدار النظام الأساسي depmod على هذه الوحدات، ويتم نسخ ملفات الإخراج depmod إلى قسم المورّد في الموقع الجغرافي نفسه. تظل آلية تحميل وحدات kernel النمطية من /vendor
كما كانت في الإصدارات السابقة من Android. يعود إليك القرار بشأن كيفية تحميل هذه الوحدات النمطية ومتى يتم ذلك، ولكن عادةً ما يتم ذلك باستخدام نصوص برمجية init.rc.
أحرف البدل وعمليات إنشاء النواة المدمجة
قد يواجه المورّدون الذين يجمعون بين إصدار نواة الجهاز وإصدار نظام Android الأساسي مشكلة في استخدام وحدات الماكرو BOARD المذكورة أعلاه لتحديد وحدات النواة التي سيتم نسخها إلى الجهاز. إذا أراد المورّد تجنُّب إدراج وحدات النواة في ملفات إصدار النظام الأساسي للجهاز، يمكنه استخدام حرف بدل ($(wildcard device/vendor/mydevice/*.ko). تجدر الإشارة إلى أنّ حرف البدل لا يعمل في حالة إصدار نواة مدمجة، لأنّه عند استدعاء الأمر make وتوسيع وحدات الماكرو في ملفات makefile، لم يتم إنشاء وحدات النواة، وبالتالي تكون وحدات الماكرو فارغة.
لحلّ هذه المشكلة، يمكن أن يطلب المورّد من إصدار النواة إنشاء أرشيف مضغوط يحتوي على وحدات النواة التي سيتم نسخها إلى كل قسم.
اضبط مسار ملف zip هذا في BOARD_*_KERNEL_MODULES_ARCHIVE، حيث * هو اسم القسم (مثل BOARD_VENDOR_KERNEL_MODULES_ARCHIVE). ينشئ نظام Android الأساسي هذا الملف المضغوط في الموقع المناسب ويشغّل depmod على الوحدات.
يجب أن يحتوي أرشيف zip الخاص بوحدة النواة على قاعدة make تضمن إمكانية إنشاء الأرشيف عند الحاجة إليه أثناء إنشاء النظام الأساسي.
الاسترداد
في إصدارات Android السابقة، تم تحديد وحدات النواة المطلوبة للاسترداد في BOARD_RECOVERY_KERNEL_MODULES. في نظام التشغيل Android 12،
لا يزال يتم تحديد وحدات النواة المطلوبة للاسترداد
باستخدام هذا الماكرو. ومع ذلك، يتم نسخ وحدات نواة الاسترداد إلى ملف cpio الخاص بـ ramdisk الخاص بالمورّد، بدلاً من ملف cpio الخاص بـ ramdisk العام. يتم تلقائيًا تحميل جميع وحدات النواة المدرَجة في BOARD_RECOVERY_KERNEL_MODULES أثناء init في المرحلة الأولى. إذا كنت تريد تحميل مجموعة فرعية فقط من هذه الوحدات، حدِّد محتوى هذه المجموعة الفرعية في BOARD_RECOVERY_KERNEL_MODULES_LOAD.
المستندات ذات الصلة
لمعرفة المزيد عن إنشاء قسم التشغيل الخاص بالمورّد (الذي يحتوي على ramdisk الخاص بالمورّد المذكور في هذه الصفحة)، يُرجى الاطّلاع على أقسام التشغيل.