實作 GKI 模組分區

由於 GKI 模組位於名為 system_dlkm 的超級圖像中,因此 GKI 和 GKI 模組可獨立更新,不受其他分割區影響。Google 會使用核心建構時間金鑰組簽署 GKI 模組,且這些模組僅與用於建構的 GKI 相容。GKI 和 GKI 模組之間沒有 ABI 穩定性;如果要在執行階段正確載入模組,則必須同時建構及更新 GKI 和 GKI 模組。

實作 system_dklm 分區支援

system_dlkm 分區位於超級分區中,是另一個動態分區。此分區可包含:

  • Google 建構時間簽署的核心模組
  • depmod 個成果

建立 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_dlkmBOARD_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 版本中找出目標架構的核心模組,並在平台建構期間將其做為 system_dlkm 分區的來源。

針對 Android 13

BOARD_SYSTEM_DLKM_SRC 指向包含裝置所需 GKI 模組核心物件檔案的資料夾,做為建構系統的輸入內容,以產生 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 模組。

舉例來說,如要從預先建構的 system_dlkm 分區中安裝 GKI arm64 核心 5.15 的所有 GKI 模組:

 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_dlkm/lib/modules/system/lib/modules 符號連結。

接著,供應商程序 (例如 .rc 指令碼) 就能根據 modules.load 中指定的順序載入核心模組。供應商程序必須使用符號連結 /system/lib/modules 載入模組。如有需要,供應商程序也可以稍後載入模組。

SELinux

system_dlkm 分區中的每個檔案都會標示 system_dlkm_file 的檔案內容。如要在 system_dlkm 分割區中載入 GKI 模組檔案,負責載入模組的供應商程序需要在供應商網域中提供 sepolicy

舉例來說,Cuttlefish 用來載入 GKI 模組的 dlkm_loader,在 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