قد لا تحتوي صورة kernel generic (GKI) على التوافق المطلوب مع برنامج التشغيل لمنح الجهاز الإذن بتثبيت الأقسام. لتفعيل إمكانية تثبيت الأقسام على الجهاز و
لمواصلة عملية التشغيل، يتم تحسين المرحلة الأولى من init
لتحميل
وحدات kernel المتوفّرة على قرص RAM. يتم تقسيم ذاكرة التخزين المؤقت في ذاكرة الوصول العشوائي إلى ذاكرة تخزين مؤقت عامة و
ذاكرة تخزين مؤقت من المصنّع. يتم تخزين وحدات نواة المورّد في ذاكرة الوصول العشوائي (RAM) الخاصة بالمورّد. يكون الترتيب الذي يتم به تحميل وحدات النواة قابلاً للتهيئة.
موقع الوحدة
ملف 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 كقرص RAM الخاص بـ 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 لذاكرة الوصول العشوائي للمورّد.
ينشئ عملية الإنشاء أيضًا ملف 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
إلى قسم المورّد في الموقع الجغرافي نفسه. تظل آلية تحميل وحدات النواة من /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 لوحدة النواة قاعدة إنشاء تضمن أنّ الإصدار الأساسي من النظام الأساسي يمكنه إنشاء الأرشيف عند الحاجة.
الاسترداد
في إصدارات Android السابقة، كانت وحدات kernel المطلوبة للاسترداد
محددة في BOARD_RECOVERY_KERNEL_MODULES
. في Android 12،
لا يزال يتم تحديد وحدات kernel المطلوبة لاسترداد النظام
باستخدام هذا الماكرو. ومع ذلك، يتم نسخ وحدات نواة الاسترداد إلى سعر ramdisk cpio للمورِّد، بدلاً من وحدة ramdisk cpio العامة. يتم تلقائيًا تحميل كل
وحدات kernel المدرَجة في BOARD_RECOVERY_KERNEL_MODULES
أثناء المرحلة الأولى من init
. وإذا كنت تريد تحميل مجموعة فرعية من هذه الوحدات فقط، حدِّد محتوى تلك المجموعة الفرعية في BOARD_RECOVERY_KERNEL_MODULES_LOAD
.
المستندات ذات الصلة
للتعرّف على كيفية إنشاء قسم تمهيد خاص بالمورّد (يحتوي على ملف ramdisk الخاص بالمورّد المذكور في هذه الصفحة)، يُرجى الاطّلاع على أقسام التمهيد.