אפשר לעדכן את 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:
ב-
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
ברשימת המחיצות, מוסיפים את
system_dlkm
:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm
(אופציונלי) במכשירי 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 arm64
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