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