I moduli GKI e GKI possono essere aggiornati indipendentemente dal resto della partizione
perché risiedono in una partizione dinamica separata nell'immagine super
denominata system_dlkm. I moduli GKI sono firmati da Google utilizzando la coppia di chiavi
di compilazione del kernel e sono compatibili solo con la GKI con cui sono stati creati.
Non esiste stabilità ABI tra GKI e i moduli GKI; affinché i moduli vengano caricati
correttamente durante l'esecuzione, GKI e i moduli GKI devono essere compilati e aggiornati
insieme.
Implementa il supporto della partizione system_dklm
La partizione system_dlkm si trova nella super partizione come un'altra partizione dinamica. Questa partizione può contenere:
- Moduli kernel firmati in fase di compilazione di Google
depmodelementi
Build system_dlkm
La creazione di system_dlkm è una procedura simile a quella per la creazione di altre partizioni dinamiche. Per aggiungere system_dlkm alla tua build:
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_dlkmNell'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 nel file
device.mkper il tuo dispositivo:AB_OTA_PARTITIONS += system_dlkm
Identifica i moduli del kernel da copiare in system_dlkm
Affinché i moduli vengano caricati correttamente in fase di runtime, GKI e i moduli GKI devono essere creati insieme. Pertanto, devi identificare i moduli del kernel nella build GKI per l'architettura di destinazione e fornirli come origine per la partizione system_dlkm durante la build della piattaforma.
Per Android 13
Punta BOARD_SYSTEM_DLKM_SRC a una cartella contenente i file oggetto del kernel dei moduli GKI richiesti
per il dispositivo come input del sistema di compilazione per generare
la partizione system_dlkm. Ad esempio:
Fornisci l'origine dei moduli GKI in una cartella e indica BOARD_SYSTEM_DLKM_SRC
questa 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
indicato dalla macro BOARD_SYSTEM_KERNEL_MODULES. Al momento della build, questi moduli
vengono installati in $ANDROID_PRODUCT_OUT/system_dlkm. Qualsiasi modulo nella partizione vendor_dlkm che ha dipendenze dai moduli nella partizione system_dlkm genera riferimenti corretti nel file modules.dep per la partizione vendor_dlkm. A causa delle dipendenze tra partizioni rappresentate da modules.dep, quando viene caricato un modulo fornitore, viene caricato automaticamente qualsiasi modulo GKI richiesto.
Ad esempio, per installare tutti i moduli GKI sulla partizione system_dlkm per il kernel arm64 GKI 5.15 dai precompilati:
BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)
Monta system_dlkm al 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 della partizione e caricamento del modulo
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
i link simbolici in /system/lib/modules che puntano 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. La procedura del fornitore deve utilizzare
il link simbolico /system/lib/modules per caricare i moduli.
Se necessario, la procedura 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 richiede un sepolicy nel
dominio del fornitore.
Ad esempio, dlkm_loader utilizzato da Cuttlefish per caricare i moduli GKI ha le
seguenti autorizzazioni nel file dei 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;
Convalidare la partizione system-dlkm
Google fornisce uno scenario di test VTS GKI per verificare la partizione system_dlkm. Per
richiamare manualmente il test, utilizza il seguente comando atest:
atest -c vts_dlkm_partition_test