پشتیبانی از ماژول هسته

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

مکان ماژول

ramdisk سیستم فایلی برای مرحله اول init, و برای تصویر بازیابی/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 و Virtual A/B، در /lib/modules .

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

بارگذاری ماژول در مرحله اول init

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

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

برای تعیین ماژول‌های هسته برای کپی شدن در cpio ramdisk فروشنده، آنها را در BOARD_VENDOR_RAMDISK_KERNEL_MODULES فهرست کنید. بیلد روی این ماژول‌ها depmod را اجرا می‌کند و فایل‌های پیکربندی modprobe را در cpio ramdisk فروشنده قرار می‌دهد.

این بیلد همچنین یک فایل modules.load ایجاد می کند و آن را در فروشنده 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 و نسخه‌های پایین‌تر وجود دارد، ماژول‌های هسته فهرست‌شده در BOARD_VENDOR_KERNEL_MODULES توسط پلتفرم Android در پارتیشن فروشنده در /vendor/lib/modules کپی می‌شوند. ساخت پلتفرم depmod روی این ماژول ها اجرا می کند و فایل های خروجی depmod را در پارتیشن فروشنده در همان مکان کپی می کند. مکانیسم بارگیری ماژول‌های هسته از /vendor مانند نسخه‌های قبلی اندروید باقی می‌ماند. این تصمیم شماست که چگونه و چه زمانی این ماژول ها را بارگیری کنید، اگرچه معمولاً این کار با استفاده از اسکریپت های init.rc انجام می شود.

Wildcards و ساختن هسته یکپارچه

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

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

آرشیو فشرده ماژول هسته باید دارای یک قانون ساخت باشد که تضمین کند ساخت پلتفرم می تواند در صورت لزوم آرشیو ایجاد کند.

بهبود

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

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