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

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

מיקום המודול

ה-ramdisk הוא מערכת הקבצים של השלב הראשון של init, ושל תמונה לשחזור/אתחול מהיר של קובצי A/B במכשירי 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/.
  • מודולים של ליבה (kernel) לשחזור של ספק, למכשירי A/B ומכשירי A/B וירטואליים /lib/modules/
  • modules.load.recovery שמציין את המודולים לטעינה. באיזה סדר, עבור מכשירי A/B ו-Virtual A/B, /lib/modules.

ארכיון ה-cpio השני, שמסופק באמצעות GKI בתור ה-ramdisk של האתחול.img ומיושם מעל תחילה, מכיל את first_stage_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

בניית תמיכה, Android מלא

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

תווים כלליים לחיפוש וגרסאות ליבה משולבות

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

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

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

התאוששות

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

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