תמיכה במודול ליבה

ייתכן שתמונת ליבה גנרית (GKI) לא תכיל את תמיכת מנהל ההתקן הנדרשת כדי לאפשר למכשיר לטעון מחיצות. כדי לאפשר להתקן להעלות מחיצות ולהמשיך באתחול, השלב הראשון init משופר לטעינת מודולי הליבה הקיימים ב-ramdisk. ה-ramdisk מפוצל ל-ramdisk גנרי ו-ramdisk. מודולי ליבת הספק מאוחסנים ב-ramdisk של הספק. הסדר שבו מודולי ליבה נטענים ניתן להגדרה.

מיקום המודול

ה-ramdisk הוא מערכת הקבצים ל- init, ולתמונת השחזור/fastbootd ב-A/B ו-A/B וירטואליים. זה initramfs המורכב משני ארכיוני cpio שמשורשרים על ידי טוען האתחול. ארכיון ה-cpio הראשון, המאוחסן כ-ramdisk של הספק במחיצת האתחול של הספק, מכיל את הרכיבים הבאים:

  • מודולי ליבת ספק 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 ) ומנסה לטעון כל אחד מהמודולים האלה לפי הסדר, התצורה שצוינה בקבצים שנטענו קודם לכן. ניתן לסטות מהצו המבוקש כדי לספק תלות קשה או רכה.

בניית תמיכה, שלב ראשון

כדי לציין מודולי ליבה שיועתקו ל-ramdisk cpio של הספק, רשום אותם ב- BOARD_VENDOR_RAMDISK_KERNEL_MODULES . ה-build מריץ את depmod על המודולים האלה ומכניס את קבצי התצורה של modprobe המתקבלים ב-ramdisk cpio של הספק.

ה-build גם יוצר קובץ 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

בניית תמיכה, אנדרואיד מלא

כפי שקורה במהדורות אנדרואיד 10 ומטה, מודולי הליבה הרשומים ב- BOARD_VENDOR_KERNEL_MODULES מועתקים על ידי פלטפורמת אנדרואיד בנוי למחיצת הספק ב- /vendor/lib/modules . בניית הפלטפורמה מריץ depmod על המודולים הללו, ומעתיקה את קבצי הפלט depmod למחיצת הספק באותו מיקום. המנגנון לטעינת מודולי ליבה מ- /vendor נשאר זהה לזה שהיה עבור מהדורות קודמות של אנדרואיד. זו החלטה שלך איך ומתי לטעון את המודולים האלה, אם כי בדרך כלל זה נעשה באמצעות סקריפטים init.rc

תווים כלליים ובניית קרנל משולבת

ספקים המשלבים את מבנה ליבת המכשיר שלהם עם בניית פלטפורמת אנדרואיד עלולים להיתקל בבעיה בשימוש בפקודות המאקרו BOARD שהוזכרו לעיל כדי לציין מודולי ליבה שיועתקו למכשיר. אם הספק מעוניין להימנע מרישום מודולי ליבה בקבצי הבנייה של הפלטפורמה של המכשיר, הוא יכול להשתמש בתו כללי ( $(wildcard device/vendor/mydevice/*.ko ). שימו לב שהתו הכללי לא עובד במקרה של תווים משולבים בניית ליבה, מכיוון שכאשר מופעלת make ופקודות המאקרו מורחבות בקבצי make, מודולי הליבה לא נבנו, ולכן פקודות המאקרו ריקות.

כדי לעקוף את הבעיה הזו, הספק עשוי לבקש מבניית הליבה שלו ליצור ארכיון zip המכיל את מודולי הליבה שיועתקו לכל מחיצה. הגדר את הנתיב של ארכיון zip זה ב- BOARD_*_KERNEL_MODULES_ARCHIVE כאשר * הוא שם המחיצה (כגון BOARD_VENDOR_KERNEL_MODULES_ARCHIVE ). בניית פלטפורמת אנדרואיד מחלצת את ארכיון ה-zip הזה למיקום המתאים ומפעילה depmod על המודולים.

לארכיון ה-zip של מודול הליבה צריך להיות כלל עשה המבטיח שבניית הפלטפורמה יכולה ליצור את הארכיון בעת ​​הצורך.

התאוששות

במהדורות קודמות של אנדרואיד, מודולי ליבה הדרושים לשחזור צוינו ב- BOARD_RECOVERY_KERNEL_MODULES . באנדרואיד 11, מודולי ליבה הדרושים לשחזור עדיין מצוינים באמצעות מאקרו זה. עם זאת, מודולי ליבת השחזור מועתקים ל-ramdisk cpio של הספק, במקום ל-ramdisk cpio הגנרי. כברירת מחדל, כל מודולי הליבה הרשומים ב- BOARD_RECOVERY_KERNEL_MODULES נטענים במהלך init הראשון. אם אתה רוצה שרק תת-קבוצה של מודולים אלה תיטען, ציין את התוכן של אותה תת-קבוצה ב- BOARD_RECOVERY_KERNEL_MODULES_LOAD .

כדי ללמוד על יצירת מחיצת אתחול של ספק (המכילה את ה-ramdisk של הספק המוזכר בדף זה), ראה מחיצות אתחול .