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

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

מיקום המודול

דיסק ה-RAM הוא מערכת הקבצים של 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 ו-Virtual A/B ב-/lib/modules.

הארכיון השני של cpio, שסופק עם GKI בתור דיסק ה-RAM של boot.img ויושם מעל הראשון, מכיל את first_stage_init ואת הספריות שהוא תלוי בהן.

טעינה של מודולים בשלב הראשון של האתחול

בשלב הראשון, init מתחיל בקריאת קובצי התצורה של modprobe מ-/lib/modules/ ב-ramdisk. לאחר מכן, המערכת קוראת את רשימת המודולים שצוינה בקובץ /lib/modules/modules.load (או בקובץ /lib/modules/modules.load.recovery במקרה של שחזור) ומנסה לטעון כל אחד מהמודולים האלה לפי הסדר, בהתאם לתצורה שצוינה בקובצים שהועלו קודם. יכול להיות שינוי בסדר הבקשה כדי לעמוד בתנאי של יחסי תלות קשיחים או רכים.

תמיכה ב-build, שלב ראשון של init

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

ב-build נוצר גם קובץ modules.load ששמור ב-cpio של דיסק ה-RAM של הספק. כברירת מחדל, הוא מכיל את כל המודולים שמפורטים ב-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

תמיכה ב-build, Android מלא

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

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

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

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

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

שחזור

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

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