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