ייתכן שתמונת ליבה גנרית (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 שהוזכר בדף הזה), ראה מגף .