הטמעת מחיצה של מודול GKI

אפשר לעדכן את GKI ואת מודולי GKI בנפרד משאר המחיצה, כי מודולי GKI נמצאים במחיצה דינמית נפרדת בתמונה העל שנקראת system_dlkm. מודולי GKI נחתמים על ידי Google באמצעות זוג המפתחות של זמן בניית הליבה, והם תואמים רק ל-GKI שבו הם נבנו. אין יציבות ABI בין GKI לבין מודולים של GKI. כדי שהמודולים ייטענו בצורה תקינה במהלך זמן הריצה, צריך לבנות ולעדכן את GKI ואת המודולים של GKI יחד.

הטמעה של תמיכה במחיצה system_dklm

המחיצה system_dlkm נמצאת במחיצת העל כמחיצה דינמית נוספת. המחיצה הזו יכולה להכיל:

  • מודולי ליבה חתומים בזמן הבנייה של Google
  • depmod פריטי מידע שנוצרו בתהליך פיתוח (Artifact)

Build‏ system_dlkm

תהליך היצירה של system_dlkm דומה לתהליך היצירה של מחיצות דינמיות אחרות. כדי להוסיף את system_dlkm ל-build:

  1. ב-BoardConfig.mk, מוסיפים את הרשומות הבאות:

    BOARD_USES_SYSTEM_DLKMIMAGE := true
    BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
    TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
    
  2. ברשימת המחיצות, מוסיפים את system_dlkm: BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (אופציונלי) במכשירי A/B ובמכשירי A/B וירטואליים, מוסיפים את השורה הבאה לקובץ device.mk של המכשיר:

    AB_OTA_PARTITIONS += system_dlkm
    

זיהוי מודולי ליבה להעתקה אל system_dlkm

כדי שהמודולים ייטענו בהצלחה בזמן הריצה, צריך לבנות את GKI ואת מודולי GKI יחד. לכן, צריך לזהות את מודולי הליבה ב-GKI build עבור ארכיטקטורת היעד ולספק אותם כמקור למחיצה system_dlkm במהלך בניית הפלטפורמה.

ב-Android 13

מציינים את BOARD_SYSTEM_DLKM_SRC כתיקייה שמכילה את קובצי האובייקט של ליבת מודולי GKI הנדרשים למכשיר כקלט למערכת ה-build, כדי ליצור את המחיצה system_dlkm. לדוגמה:

מספקים את המקור של מודולי GKI בתיקייה ומפנים את BOARD_SYSTEM_DLKM_SRC לתיקייה הזו. לדוגמה:

  BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging

בזמן הבנייה, המודולים שמפורטים ב-BOARD_SYSTEM_DLKM_SRC מותקנים ב-$ANDROID_PRODUCT_OUT/system_dlkm.

ל-Android 14

פישטנו את ההטמעה באמצעות פקודות מאקרו (BOARD_*_KERNEL_MODULES) שמשמשות למחיצות אחרות של *_dlkm. רשימת מודולי GKI הנדרשים למכשיר צריכה להיות מוזכרת במאקרו BOARD_SYSTEM_KERNEL_MODULES. בזמן הבנייה, המודולים האלה מותקנים ב-$ANDROID_PRODUCT_OUT/system_dlkm. כל מודול במחיצה vendor_dlkm שיש לו תלות במודולים במחיצה system_dlkm יוצר הפניות נכונות בקובץ modules.dep למחיצה vendor_dlkm. בגלל התלות בין המחיצות שמיוצגת על ידי modules.dep, כשמודול של ספק נטען, כל מודול GKI נדרש נטען באופן אוטומטי.

לדוגמה, כדי להתקין את כל מודולי ה-GKI במחיצה system_dlkm עבור ליבת GKI‏ arm645.15 מ-prebuilts:

 BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)

טעינת system_dlkm בזמן הריצה

בהתאם למערכת הקבצים שבה משתמשים כמערכת קבצים לקריאה בלבד, מוסיפים את השורות הבאות לקובץ fstab כדי לטעון את המחיצה system_dlkm בזמן הריצה:

ext4 כמערכת קבצים לקריאה בלבד

  system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

erofs כמערכת קבצים לקריאה בלבד

  system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb

טעינת מודולים והרכבת מחיצות

במהלך first_stage_init, המחיצה system_dlkm נטענת ב-/system_dlkm כמערכת קבצים לקריאה בלבד. אם ההרכבה מצליחה, הקישורים הסמליים ב-/system/lib/modules שמצביעים על /system_dlkm/lib/modules זמינים.

תהליך של ספק, כמו סקריפט .rc, יכול לטעון את מודולי הליבה על סמך הסדר שצוין ב-modules.load. בתהליך של הספק צריך להשתמש בקישור הסמלי /system/lib/modules כדי לטעון את המודולים. במקרה הצורך, התהליך של הספק יכול גם לטעון את המודולים בשלב מאוחר יותר.

SELinux

כל קובץ במחיצה system_dlkm מסומן בתווית עם הקשר של הקובץ system_dlkm_file. כדי לטעון את קובץ המודולים של GKI במחיצה system_dlkm, תהליך הספק שאחראי לטעינת המודולים צריך sepolicy בדומיין הספק.

לדוגמה, ל-dlkm_loader שמשמש את Cuttlefish לטעינת מודולים של GKI יש את ההרשאות הבאות בקובץ המדיניות ב-shared/sepolicy/vendor/dlkm_loader.te:

allow dlkm_loader self:capability sys_module;
allow dlkm_loader system_dlkm_file:dir r_dir_perms;
allow dlkm_loader system_dlkm_file:file r_file_perms;
allow dlkm_loader system_dlkm_file:system module_load;

אימות המחיצה system-dlkm

‫Google מספקת מקרה בדיקה של GKI VTS כדי לאמת את המחיצה system_dlkm. כדי להפעיל את הבדיקה באופן ידני, משתמשים בפקודה atest הבאה:

  atest -c vts_dlkm_partition_test