قد لا تحتوي صورة النواة العامة (GKI) على دعم برنامج التشغيل المطلوب
لتمكين الجهاز من تثبيت الأقسام. لتمكين الجهاز من تثبيت الأقسام ومواصلة عملية التشغيل، تم تحسين init
في المرحلة الأولى لتحميل وحدات النواة المتوفّرة على قرص RAM. يتم تقسيم ramdisk إلى ramdisk عام وramdisk خاص بالبائع. يتم تخزين وحدات نواة البائع في ramdisk البائع. يمكن ضبط ترتيب تحميل وحدات النواة.
موقع الوحدة
وramdisk هو نظام الملفات الخاص بالمرحلة الأولى من init,
ولصورة
recovery/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
المذكورة أعلاه لتحديد وحدات النواة التي سيتم نسخها إلى الجهاز. إذا أراد المورّد تجنُّب إدراج وحدات kernel في ملفات إصدار النظام الأساسي للجهاز، يمكنه استخدام حرف بدل ($(wildcard device/vendor/mydevice/*.ko
). تجدر الإشارة إلى أنّ حرف البدل لا يعمل في حالة إصدار kernel مدمج، لأنّه عند استدعاء make وتوسيع وحدات الماكرو في ملفات make، لم يتم إنشاء وحدات kernel، وبالتالي تكون وحدات الماكرو فارغة.
لحلّ هذه المشكلة، يمكن أن يطلب المورّد من إصدار النواة إنشاء أرشيف مضغوط يحتوي على وحدات النواة التي سيتم نسخها إلى كل قسم.
اضبط مسار ملف zip هذا في BOARD_*_KERNEL_MODULES_ARCHIVE
، حيث *
هو اسم القسم (مثل BOARD_VENDOR_KERNEL_MODULES_ARCHIVE
). يستخرج إصدار منصة Android ملف zip هذا إلى الموقع المناسب ويشغّل depmod
على الوحدات.
يجب أن يحتوي أرشيف zip الخاص بوحدة kernel على قاعدة make تضمن إمكانية إنشاء الأرشيف عند الحاجة إليه أثناء إنشاء النظام الأساسي.
الاسترداد
في إصدارات Android السابقة، تم تحديد وحدات النواة المطلوبة للاسترداد في BOARD_RECOVERY_KERNEL_MODULES
. في نظام التشغيل Android 12،
لا يزال يتم تحديد وحدات النواة المطلوبة للاسترداد
باستخدام هذا الماكرو. ومع ذلك، يتم نسخ وحدات نواة الاسترداد إلى ملف cpio الخاص بـ ramdisk الخاص بالمورّد، بدلاً من ملف cpio الخاص بـ ramdisk العام. يتم تلقائيًا تحميل جميع وحدات النواة المدرَجة في BOARD_RECOVERY_KERNEL_MODULES
أثناء init
في المرحلة الأولى. إذا كنت تريد تحميل مجموعة فرعية فقط من هذه الوحدات، حدِّد محتوى هذه المجموعة الفرعية في BOARD_RECOVERY_KERNEL_MODULES_LOAD
.
المستندات ذات الصلة
لمزيد من المعلومات حول إنشاء قسم التشغيل الخاص بالمورّد (الذي يحتوي على ramdisk الخاص بالمورّد المذكور في هذه الصفحة)، يُرجى الاطّلاع على أقسام التشغيل.