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

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

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

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

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

Build‏ system_dlkm

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

  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
    

זיהוי מודולים של ליבה (kernel) להעתקה אל system_dlkm

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

ל-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

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

ל-Android 14

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

לדוגמה, כדי להתקין את כל המודולים של GKI במחיצה system_dlkm עבור הליבה arm64 של GKI‏ 5.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