תמונת ליבה גנרית (GKI) לא יכולה להכיל את תמיכת הדרייבר הנדרשת כדי לאפשר למכשיר לטעון מחיצות. כדי לאפשר למכשיר להעלות מחיצות ולהמשיך את האתחול, שלב init
משופר כדי לטעון את מודולי הליבה שקיימים ב-ramdisk. דיסק ה-RAM מחולק לדיסקי RAM כלליים ולדיסקי RAM של ספקים. מודולי ליבת הספק מאוחסנים ב-ramdisk של הספק. אפשר להגדיר את הסדר שבו מודולי הליבה נטענים.
מיקום המודול
ה-ramdisk הוא מערכת הקבצים לשלב הראשון של init,
ולתמונת השחזור/fastbootd במכשירי A/B ובמכשירי A/B וירטואליים. זהוinitramfs
שמורכב משני ארכיוני cpio שתוכנת האתחול משרשרת. ארכיון ה-cpio הראשון, שמאוחסן כ-vendor ramdisk במחיצת vendor-boot, מכיל את הרכיבים הבאים:
- מודולי ליבת ספקים בשלב הראשון
init
, שנמצאים ב-/lib/modules/
. - קובצי ההגדרות
modprobe
, שנמצאים במיקומים הבאים:/lib/modules/
:modules.dep
,modules.softdep
,modules.alias
,modules.options
. - קובץ
modules.load
שמציין אילו מודולים לטעון במהלך האתחול בשלב הראשון, ובאיזה סדר, ב-/lib/modules/
. - מודולים של ליבת שחזור של ספקים, למכשירי A/B ו-Virtual A/B, בתיקייה
/lib/modules/
-
modules.load.recovery
שמציין אילו מודולים לטעון, ובאיזה סדר, במכשירי A/B ו-Virtual A/B, ב-/lib/modules
.
ארכיון ה-cpio השני, שמסופק עם GKI בתור ramdisk של boot.img ומוחל על הראשון, מכיל את first_stage_init
ואת הספריות שהוא תלוי בהן.
טעינת מודולים באתחול בשלב הראשון
בשלב הראשון init
מתחילים בקריאת קובצי ההגדרה של modprobe מ-/lib/modules/
ב-ramdisk. לאחר מכן, המערכת קוראת את רשימת המודולים שצוינו בקובץ /lib/modules/modules.load
(או בקובץ /lib/modules/modules.load.recovery
במקרה של שחזור) ומנסה לטעון כל אחד מהמודולים האלה לפי הסדר, בהתאם להגדרות שצוינו בקבצים שנפרסו קודם. יכול להיות שהסדר המבוקש ישתנה כדי לעמוד בתלות קשיחה או רכה.
בניית תמיכה, הפעלה בשלב הראשון
כדי לציין מודולי ליבה שיועתקו ל-vendor ramdisk cpio, צריך לרשום אותם ב-BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. ה-build מופעל depmod
במודולים האלה, ומכניס את קובצי ההגדרות של modprobe שנוצרו ל-vendor ramdisk cpio.
ה-build יוצר גם קובץ modules.load
ושומר אותו ב-vendor 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
תמיכה ב-build, Android מלא
כמו במקרים של גרסאות Android 10 ומטה, מודולי ליבה שמופיעים ב-BOARD_VENDOR_KERNEL_MODULES
מועתקים על ידי בניית פלטפורמת Android למחיצת הספק ב-/vendor/lib/modules
. ה-build של הפלטפורמה מריץ את depmod
במודולים האלה ומעתיק את קובצי הפלט של depmod
למחיצת הספק באותו מיקום. המנגנון לטעינת מודולים של ליבת המערכת מ-/vendor
נשאר זהה לזה שהיה בגרסאות קודמות של Android. אתם מחליטים איך ומתי לטעון את המודולים האלה, אבל בדרך כלל עושים את זה באמצעות סקריפטים של init.rc
.
תווים כלליים לחיפוש ובניית ליבה משולבת
ספקים שמשלבים את הגרסה של ליבת המכשיר עם הגרסה של פלטפורמת Android, עלולים להיתקל בבעיה בשימוש בפקודות המאקרו BOARD
שצוינו למעלה כדי לציין מודולים של ליבת המערכת שיועתקו למכשיר. אם הספק רוצה להימנע מהצגת מודולים של ליבת המערכת בקובצי ה-build של פלטפורמת המכשיר, הוא יכול להשתמש בתו כללי ($(wildcard device/vendor/mydevice/*.ko
). חשוב לזכור שהתו הכללי לא פועל במקרה של build משולב של ליבת המערכת, כי כשמפעילים את הפקודה make והמאקרו מורחב בקובצי ה-make, המודולים של ליבת המערכת לא נבנו, ולכן המאקרו ריק.
כדי לפתור את הבעיה הזו, יכול להיות שהספק יבנה את ליבת המערכת כך שייווצר ארכיון zip
שמכיל את מודולי הליבה שצריך להעתיק לכל מחיצה.
מגדירים את הנתיב של ארכיון ה-ZIP הזה ב-BOARD_*_KERNEL_MODULES_ARCHIVE
, כאשר *
הוא שם המחיצה (לדוגמה, BOARD_VENDOR_KERNEL_MODULES_ARCHIVE
). תהליך הבנייה של פלטפורמת Android מחלץ את ארכיון ה-ZIP הזה למיקום המתאים ומריץ את depmod
במודולים.
ארכיון ה-zip של מודול הליבה צריך לכלול כלל make שמוודא שניתן ליצור את הארכיון כשנדרש לבנות את הפלטפורמה.
שחזור
בגרסאות קודמות של Android, מודולי ליבה שנדרשים לשחזור צוינו ב-BOARD_RECOVERY_KERNEL_MODULES
. ב-Android 12, מודולי ליבה שנדרשים לשחזור עדיין מצוינים באמצעות פקודת המאקרו הזו. עם זאת, מודולי ליבת השחזור מועתקים אל vendor ramdisk cpio ולא אל generic ramdisk cpio. כברירת מחדל, כל מודולי הליבה שמופיעים ב-BOARD_RECOVERY_KERNEL_MODULES
נטענים במהלך השלב הראשון של init
. אם רוצים לטעון רק קבוצת משנה של המודולים האלה, צריך לציין את התוכן של קבוצת המשנה ב-BOARD_RECOVERY_KERNEL_MODULES_LOAD
.
מסמכים קשורים
מידע על יצירת מחיצת אתחול של ספק (שכוללת את ה-ramdisk של הספק שמוזכר בדף הזה) זמין במאמר בנושא מחיצות אתחול.