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

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

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

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

  • מודולים של ליבה (kernel) חתומים בזמן ה-build של 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
    

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

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

ל-Android 13

להפנות את המשתמש BOARD_SYSTEM_DLKM_SRC לתיקייה שמכילה את המודולים הנדרשים של GKI קובצי אובייקט ליבה (kernel) של המכשיר כקלט למערכת ה-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 מחיצות. רשימת המודולים של GKI הנדרשים למכשיר צריכה להיות שיש הפניה אליו במאקרו BOARD_SYSTEM_KERNEL_MODULES. בזמן ה-build, המודולים האלה מותקנות דרך $ANDROID_PRODUCT_OUT/system_dlkm. כל מודול ב- מחיצה vendor_dlkm שיש בה יחסי תלות במודולים ב-system_dlkm המחיצה יוצרת הפניות נכונות בקובץ modules.dep עבור מחיצה vendor_dlkm. בגלל יחסי התלות בין מחיצות על ידי modules.dep, כאשר מודול הספק נטען, כל מודול נדרש של GKI נטען באופן אוטומטי.

לדוגמה, כדי להתקין את כל המודולים של GKI במחיצה system_dlkm של GKI ליבה של arm64 5.15 מגרסאות מוכנות מראש:

 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