實作 GKI 模組分割區

GKI 和 GKI 模組可以獨立於分割區的其餘部分進行更新,因為 GKI 模組駐留在超級映像中名為system_dlkm單獨動態分割區上。 GKI 模組由 Google 使用核心建置時金鑰對進行簽名,並且僅與其建置時使用的 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_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 建置中識別核心模組,並在平台建置期間將其提供為system_dlkm分區的來源。

適用於安卓 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中。

適用於安卓 14

我們透過用於其他*_dlkm分區的巨集 ( BOARD_*_KERNEL_MODULES ) 簡化了實作。設備所需的 GKI 模組清單應由BOARD_SYSTEM_KERNEL_MODULES巨集引用。在建置時,這些模組安裝在$ANDROID_PRODUCT_OUT/system_dlkm中。 vendor_dlkm分區中依賴system_dlkm分區中的模組的任何模組都會在modules.dep檔案中為vendor_dlkm分區產生正確的參考。由於由modules.dep表示的跨分區依賴關係,當載入供應商模組時,會自動載入任何所需的 GKI 模組。

例如,要從預先建置的 GKI arm64核心5.15system_dlkm分割區上安裝所有 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/lib/modules中指向/system_dlkm/lib/modules符號連結可用。

然後,供應商進程(例如.rc腳本)可以根據modules.load中指定的順序載入核心模組。供應商程序必須使用符號連結/system/lib/modules來載入模組。如果有必要,供應商進程還可以稍後載入模組。

SELinux

system_dlkm分區中的每個檔案都標有system_dlkm_file的檔案上下文。要載入system_dlkm分區中的 GKI 模組文件,負責載入模組的供應商程序需要供應商網域中的sepolicy

例如,Cuttlefish 用於載入 GKI 模組的dlkm_loadershared/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