Les GKI et les modules GKI peuvent être mis à jour indépendamment du reste de la partition, car les modules GKI résident sur une partition dynamique distincte dans la super image appelée system_dlkm
. Les modules GKI sont signés par Google à l'aide de la paire de clés au moment de la compilation du noyau et ne sont compatibles qu'avec le GKI avec lequel ils sont compilés.
Il n'y a pas de stabilité ABI entre les modules GKI et GKI. Pour que les modules se chargent correctement au moment de l'exécution, les modules GKI et GKI doivent être compilés et mis à jour ensemble.
Implémenter la prise en charge de la partition system_dklm
La partition system_dlkm
se trouve dans la super partition en tant qu'autre partition dynamique. Cette partition peut contenir les éléments suivants:
- Modules de noyau signés par Google au moment de la compilation
depmod
artifacts
Créer system_dlkm
La création de system_dlkm
est un processus semblable à celui de la création d'autres partitions dynamiques. Pour ajouter system_dlkm
à votre build, procédez comme suit:
Dans
BoardConfig.mk
, ajoutez les entrées suivantes:BOARD_USES_SYSTEM_DLKMIMAGE := true BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE) TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
Dans la liste des partitions, ajoutez
system_dlkm
:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm
(Facultatif) Pour les appareils A/B et virtuels A/B, ajoutez la ligne suivante dans le fichier
device.mk
de votre appareil:AB_OTA_PARTITIONS += system_dlkm
Identifier les modules de kernel à copier dans system_dlkm
Pour que les modules se chargent correctement au moment de l'exécution, les modules GKI et GKI doivent être compilés ensemble. Par conséquent, vous devez identifier les modules du noyau dans le build GKI pour l'architecture cible et les fournir en tant que source pour la partition system_dlkm
lors de la compilation de la plate-forme.
Pour Android 13
Pointez BOARD_SYSTEM_DLKM_SRC
vers un dossier contenant les fichiers d'objets de kernel des modules GKI requis pour l'appareil en tant qu'entrée du système de compilation pour générer la partition system_dlkm
. Exemple :
Fournissez la source des modules GKI dans un dossier et pointez BOARD_SYSTEM_DLKM_SRC
vers ce dossier. Exemple :
BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging
Au moment de la compilation, les modules listés dans BOARD_SYSTEM_DLKM_SRC
sont installés dans $ANDROID_PRODUCT_OUT/system_dlkm
.
Pour Android 14
Nous avons simplifié l'implémentation avec les macros (BOARD_*_KERNEL_MODULES
) utilisées pour d'autres partitions *_dlkm
. La liste des modules GKI requis pour l'appareil doit être référencée par la macro BOARD_SYSTEM_KERNEL_MODULES
. Au moment de la compilation, ces modules sont installés dans $ANDROID_PRODUCT_OUT/system_dlkm
. Tout module de la partition vendor_dlkm
qui dépend des modules de la partition system_dlkm
génère des références correctes dans le fichier modules.dep
pour la partition vendor_dlkm
. En raison des dépendances interpartitions représentées par modules.dep
, lorsqu'un module fournisseur est chargé, tout module GKI requis est chargé automatiquement.
Par exemple, pour installer tous les modules GKI sur la partition system_dlkm
pour le noyau 5.15
GKI arm64
à partir de précompilés:
BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)
Monter system_dlkm
au moment de l'exécution
En fonction du système de fichiers utilisé en tant que système de fichiers en lecture seule, ajoutez ce qui suit dans votre fstab
pour installer la partition system_dlkm
au moment de l'exécution:
ext4
en tant que système de fichiers en lecture seule
system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
erofs
en tant que système de fichiers en lecture seule
system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb
Montage de la partition et chargement du module
Lors de first_stage_init
, la partition system_dlkm
est installée dans /system_dlkm
en tant que système de fichiers en lecture seule. En cas de montage réussi, des liens symboliques à /system/lib/modules
pointant vers /system_dlkm/lib/modules
sont disponibles.
Un processus du fournisseur, tel qu'un script .rc
, peut ensuite charger les modules du kernel en fonction de l'ordre spécifié dans modules.load
. Le processus fournisseur doit utiliser le lien symbolique /system/lib/modules
pour charger les modules.
Si nécessaire, le processus du fournisseur peut également charger les modules ultérieurement.
SELinux
Chaque fichier de la partition system_dlkm
est associé au contexte de fichier system_dlkm_file
. Pour charger le fichier de modules GKI dans la partition system_dlkm
, le processus du fournisseur chargé de charger les modules a besoin d'un sepolicy
dans le domaine du fournisseur.
Par exemple, dlkm_loader
utilisé par Cuttlefish pour charger les modules GKI dispose des autorisations suivantes dans le fichier de stratégie à l'emplacement 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;
Valider la partition system-dlkm
Google fournit un cas de test VTS GKI pour vérifier la partition system_dlkm
. Pour appeler manuellement le test, utilisez la commande atest
suivante:
atest -c vts_dlkm_partition_test