Implementare una partizione del modulo GKI

I moduli GKI e GKI possono essere aggiornati indipendentemente dal resto della partizione poiché i moduli GKI risiedono su una partizione dinamica separata nella superimmagine chiamato system_dlkm. I moduli GKI vengono firmati da Google usando il kernel in fase di build e sono compatibili solo con la GKI con cui sono create. Non c'è stabilità ABI tra i moduli GKI e GKI; per caricare i moduli correttamente durante il runtime, i moduli GKI e GKI devono essere creati e aggiornati in sinergia.

Implementare il supporto delle partizioni system_dklm

La partizione system_dlkm si trova nella partizione super come un'altra partizione dinamica. Questa partizione può contenere:

  • Moduli kernel Google firmati in fase di build
  • depmod elementi

Build system_dlkm

La creazione di system_dlkm è una procedura simile a quella di altre creatività dinamiche partizioni di Compute Engine. Per aggiungere system_dlkm alla tua build, segui questi passaggi:

  1. In BoardConfig.mk, aggiungi le seguenti voci:

    BOARD_USES_SYSTEM_DLKMIMAGE := true
    BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
    TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
    
  2. Nell'elenco delle partizioni, aggiungi system_dlkm: BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (Facoltativo) Per i dispositivi A/B e A/B virtuali, aggiungi la seguente riga nella device.mk file per il tuo dispositivo:

    AB_OTA_PARTITIONS += system_dlkm
    

Identifica i moduli del kernel da copiare in system_dlkm

Per caricare correttamente i moduli in fase di runtime, è necessario creare moduli GKI e GKI in sinergia. Pertanto, devi identificare i moduli del kernel nella compilazione GKI per l'architettura di destinazione e fornirli come origine per la partizione system_dlkm durante la compilazione della piattaforma.

Per Android 13

Indica BOARD_SYSTEM_DLKM_SRC a una cartella contenente i file oggetto del kernel dei moduli GKI richiesti per il dispositivo come input per il sistema di compilazione per generare la partizione system_dlkm. Ad esempio:

Fornisci l'origine dei moduli GKI in una cartella e punta BOARD_SYSTEM_DLKM_SRC a quella cartella. Ad esempio:

  BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging

Al momento della compilazione, i moduli elencati in BOARD_SYSTEM_DLKM_SRC vengono installati in $ANDROID_PRODUCT_OUT/system_dlkm.

Per Android 14

Abbiamo semplificato l'implementazione con le macro (BOARD_*_KERNEL_MODULES) utilizzate per altre partizioni*_dlkm. L'elenco dei moduli GKI richiesti per il dispositivo deve essere riferito dalla macro BOARD_SYSTEM_KERNEL_MODULES. Al momento della creazione, questi moduli sono installati nell'$ANDROID_PRODUCT_OUT/system_dlkm. Qualsiasi modulo in Partizione vendor_dlkm che ha dipendenze dai moduli in system_dlkm genera nel file modules.dep riferimenti corretti per vendor_dlkm partizione. A causa delle dipendenze tra partizioni rappresentate da modules.dep, quando viene caricato un modulo del fornitore, qualsiasi modulo GKI necessario viene caricato automaticamente.

Ad esempio, per installare tutti i moduli GKI sulla partizione system_dlkm per GKI Kernel arm64 5.15 da predefiniti:

 BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)

Monta system_dlkm in fase di runtime

A seconda del file system utilizzato come file system di sola lettura, aggiungi quanto segue in fstab per montare la partizione system_dlkm in fase di runtime:

ext4 come file system di sola lettura

  system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

erofs come file system di sola lettura

  system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb

Montaggio delle partizioni e caricamento dei moduli

Durante first_stage_init, la partizione system_dlkm viene montata in /system_dlkm come file system di sola lettura. In caso di montaggio riuscito, sono disponibili link simbolici in /system/lib/modules che rimandano a /system_dlkm/lib/modules.

Un processo del fornitore, ad esempio uno script .rc, può quindi caricare i moduli del kernel in base all'ordine specificato in modules.load. Il processo del fornitore deve utilizzare il link simbolico /system/lib/modules per caricare i moduli. Se necessario, il processo del fornitore può anche caricare i moduli in un secondo momento.

SELinux

Ogni file nella partizione system_dlkm è etichettato con il contesto del file di system_dlkm_file. Per caricare il file dei moduli GKI nella partizione system_dlkm, il processo del fornitore responsabile del caricamento dei moduli ha bisogno di un sepolicy nel dominio del fornitore.

Ad esempio, dlkm_loader utilizzato da Cuttlefish per caricare i moduli GKI ha le seguenti autorizzazioni nel file di criteri in 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;

Convalida la partizione system-dlkm

Google fornisce un test case VTS GKI per verificare la partizione system_dlkm. A richiama manualmente il test, usa questo comando atest:

  atest -c vts_dlkm_partition_test