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:
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
Nell'elenco delle partizioni, aggiungi
system_dlkm
:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm
(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