پشتیبانی واحد هسته

ممکن است تصویر هسته عمومی (GKI) حاوی پشتیبانی درایور لازم برای فعال کردن دستگاه برای سوار کردن بخش‌ها نباشد. برای اینکه دستگاه بتواند پارتیشن‌ها را سوار کند و به بوت شدن ادامه دهد، init مرحله اول بهبود یافته است تا واحدهای هسته موجود در دیسک RAM را بار کند. ‫ramdisk به ramdisk عمومی و فروشنده تقسیم می‌شود. واحدهای هسته فروشنده در ramdisk فروشنده ذخیره می‌شوند. ترتیب بار شدن واحدهای هسته قابل‌پیکربندی است.

مکان واحد

رام‌دیسک سیستم فایل برای مرحله اول init, و برای تصویر بازیابی/fastbootd در دستگاه‌های A/B و مجازی A/B است. این یک initramfs است که از دو بایگانی cpio تشکیل شده است که توسط راه‌انداز سیستم به‌هم متصل می‌شوند. اولین بایگانی cpio که به‌عنوان vendor ramdisk در پارتیشن vendor-boot ذخیره می‌شود، شامل این مؤلفه‌ها است:

  • واحد هسته فروشنده init مرحله اول، واقع در /lib/modules/.
  • ‫modprobe فایل پیکربندی، واقع در /lib/modules/: modules.dep،‏ modules.softdep، modules.alias،‏ modules.options.
  • فایل modules.load که نشان می‌دهد کدام ماژول‌ها باید درطول مرحله اول راه‌اندازی و با چه ترتیبی در /lib/modules/ بار شوند.
  • واحدهای هسته بازیابی فروشنده، برای دستگاه‌های A/B و Virtual A/B، در /lib/modules/
  • modules.load.recovery که نشان می‌دهد کدام واحدها و به چه ترتیبی برای دستگاه‌های A/B و Virtual A/B در /lib/modules بار شوند.

بایگانی دوم cpio که همراه با GKI به‌عنوان ramdisk در boot.img ارائه می‌شود و روی بایگانی اول اعمال می‌شود، حاوی first_stage_init و کتابخانه‌هایی است که به آن وابسته است.

درحال بار کردن واحد در مقداردهی اولیه مرحله اول

init مرحله اول با خواندن فایل‌های پیکربندی modprobe از /lib/modules/ در ramdisk شروع می‌شود. سپس، فهرست واحدهای مشخص‌شده در /lib/modules/modules.load (یا درصورت بازیابی، /lib/modules/modules.load.recovery) را می‌خواند و تلاش می‌کند هریک از آن واحدها را به‌ترتیب بار کند و از پیکربندی مشخص‌شده در فایل‌های بارشده قبلی پیروی می‌کند. ممکن است ترتیب درخواست‌شده برای برآورده کردن وابستگی‌های سخت یا نرم تغییر کند.

پشتیبانی ساخت، راه‌اندازی مرحله اول

برای مشخص کردن واحد‌های هسته که باید در vendor ramdisk cpio کپی شوند، آن‌ها را در BOARD_VENDOR_RAMDISK_KERNEL_MODULES فهرست کنید. ساخت depmod روی این واحدها اجرا می‌شود و فایل‌های پیکربندی modprobe حاصل را در vendor ramdisk 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 کامل

همان‌طور که در Android 10 و نسخه‌های پایین‌تر وجود دارد، واحدهای هسته فهرست‌شده در BOARD_VENDOR_KERNEL_MODULES توسط ساخت پلاتفرم Android در پارتیشن فروشنده در /vendor/lib/modules کپی می‌شوند. ساخت پلاتفرم depmod را روی این ماژول‌ها اجرا می‌کند و فایل‌های خروجی depmod را در همان مکان در پارتیشن فروشنده کپی می‌کند. سازوکار بار کردن واحدهای هسته از /vendor همانند نسخه‌های قبلی Android باقی می‌ماند. اینکه این واحدها چگونه و چه زمانی بار شوند تصمیم شما است، هرچند معمولاً این کار بااستفاده از اسکریپت‌های init.rc انجام می‌شود.

حروف عام و ساخت‌های هسته یکپارچه

فروشندگانی که ساختار هسته دستگاه خود را با ساختار پلاتفرم Android ترکیب می‌کنند ممکن است هنگام استفاده از BOARD کلان‌دستور ذکرشده در بالا برای مشخص کردن واحد‌های هسته که باید در دستگاه کپی شوند با مشکل مواجه شوند. اگر فروشنده می‌خواهد از فهرست کردن واحدهای هسته در فایل‌های ساخت پلاتفرم دستگاه اجتناب کند، می‌تواند از نویسه عام ($(wildcard device/vendor/mydevice/*.ko) استفاده کند. توجه داشته باشید که نویسه عام در ساخت هسته یکپارچه کار نمی‌کند، زیرا وقتی make فراخوانده می‌شود و ماکروها در فایل‌های make گسترش می‌یابند، واحدهای هسته ساخته نشده‌اند، بنابراین ماکروها خالی هستند.

برای حل این مشکل، فروشنده می‌تواند ساختار هسته خود را به‌گونه‌ای ایجاد کند که بایگانی zip حاوی واحدهای هسته را ایجاد کند تا در هر پارتیشن کپی شود. مسیر آن بایگانی zip را در BOARD_*_KERNEL_MODULES_ARCHIVE تنظیم کنید که در آن * نام پارتیشن است (برای مثال BOARD_VENDOR_KERNEL_MODULES_ARCHIVE). ساخت پلاتفرم Android این بایگانی zip را در مکان مناسب استخراج می‌کند و depmod را روی واحدها اجرا می‌کند.

بایگانی فشرده واحد هسته باید قانون ساخت داشته باشد تا مطمئن شود که ساخت پلاتفرم می‌تواند درصورت نیاز بایگانی را تولید کند.

بازیابی

در نسخه‌های قبلی Android، واحدهای هسته موردنیاز برای بازیابی در BOARD_RECOVERY_KERNEL_MODULES مشخص شده بودند. در Android 12، واحدهای هسته موردنیاز برای بازیابی همچنان بااستفاده از این کلان تعریف می‌شوند. بااین‌حال، واحدهای هسته بازیابی به‌جای ramdisk cpio عمومی، در ramdisk cpio فروشنده کپی می‌شوند. به‌طور پیش‌فرض، همه واحدهای هسته فهرست‌شده در BOARD_RECOVERY_KERNEL_MODULES درطول مرحله اول init بار می‌شوند. اگر فقط می‌خواهید زیرمجموعه‌ای از این واحدها بار شود، محتوای آن زیرمجموعه را در BOARD_RECOVERY_KERNEL_MODULES_LOAD مشخص کنید.

برای آشنایی با نحوه ایجاد پارتیشن راه‌اندازی فروشنده (که حاوی ramdisk فروشنده ذکرشده در این صفحه است)، به پارتیشن‌های راه‌اندازی مراجعه کنید.