Partitions DLKM du fournisseur et ODM

Android 11 introduit le concept d'image de kernel générique et de partition de démarrage du fournisseur. La partition de démarrage du fournisseur stocke les modules de noyau compatibles avec GKI et est chargée par l'initialisation de la première étape. Les modules du noyau antérieurs à la version d'Android 11 sont également stockés dans des partitions de fournisseurs et d'ODM, et sont chargés par des processus de fournisseurs.

Pour Android 11 ou version ultérieure, le noyau et tous ses modules peuvent être mis à jour indépendamment du reste des partitions. Pour activer les mises à jour des modules de kernel stockés dans la partition du fournisseur (sans mise à jour de la partition du fournisseur), déplacez tous les modules de la partition du fournisseur vers une nouvelle partition appelée Vendor DLKM (module de kernel pouvant être chargé dynamiquement). Vous pouvez ensuite mettre à jour cette partition indépendamment. De même, vous pouvez déplacer tous les modules du noyau stockés dans la partition ODM vers une nouvelle partition appelée ODM DLKM. Cette partition peut également être mise à jour indépendamment.

Emplacement de la partition

Les partitions vendor_dlkm et odm_dlkm se trouvent dans la super partition en tant qu'autre partition dynamique.

Contenu "vendor_dlkm" dans /vendor/lib/modules

  • Modules du noyau du fournisseur
  • modprobe fichiers de configuration
  • Un fichier modules.load

Contenus odm_dlkm dans /odm/lib/modules

  • Modules du noyau ODM
  • Fichiers de configuration modprobe
  • Un fichier modules.load

Pour en savoir plus sur les fichiers de configuration des modules du kernel, consultez la section Compatibilité avec les modules du kernel.

Assistance de compilation

La création de vendor_dlkm et de odm_dlkm est un processus semblable à la création d'autres partitions dynamiques.

Exemple de compilation provider_dlkm

Compilez vendor_dlkm comme indiqué dans les exemples suivants.

BoardConfig.mk

BOARD_USES_VENDOR_DLKMIMAGE := true
BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm
BOARD_<GROUP_NAME>_PARTITION_LIST += vendor_dlkm

Remplacez <GROUP_NAME> par le nom approprié du groupe de mises à jour. Le groupe de mise à jour doit être celui de la partition du fournisseur.

Pour les appareils A/B et virtuels A/B, device.mk

AB_OTA_PARTITIONS += vendor_dlkm

fstab

Ajoutez l'entrée suivante pour vendor_dlkm à fstab. Modifiez les indicateurs en fonction de l'appareil. Utilisez l'exemple de commande Ajouter vendor_dlkm à CF.

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

Exemple de compilation odm_dlkm

Créez odm_dlkm comme indiqué dans les exemples suivants.

BoardConfig.mk

BOARD_USES_ODM_DLKIMAGE := true
BOARD_ODM_DLKIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_ODM_DLKM := odm_dlkm
BOARD_<group_name>_PARTITION_LIST += odm_dlkm

Pour les appareils A/B et virtuels A/B, device.mk

AB_OTA_PARTITIONS += odm_dlkm

fstab

Ajoutez l'entrée suivante pour odm_dlkm à fstab. Modifiez les indicateurs en fonction de l'appareil. Utilisez l'exemple de commande Ajouter odm_dlkm à CF.

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

Copier les modules du noyau dans une partition

Pour sélectionner les modules du noyau que vous souhaitez copier dans la partition vendor_dlkm, répertoriez-les dans BOARD_VENDOR_KERNEL_MODULES.

Si vous souhaitez remplacer le contenu de modules.load, vous pouvez le spécifier dans BOARD_VENDOR_KERNEL_MODULES_LOAD.

Au moment de la compilation, les modules répertoriés dans BOARD_VENDOR_KERNEL_MODULES sont installés dans $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules. Un lien symbolique est créé à /vendor/lib/modules et mène à /vendor_dlkm/lib/modules.

De même, pour sélectionner les modules du noyau que vous souhaitez copier dans la partition odm_dlkm, listez-les dans BOARD_ODM_KERNEL_MODULES. La compilation de la plate-forme exécute depmod sur les modules et copie les fichiers de sortie depmod dans l'image. La compilation crée un fichier modules.load et le stocke dans l'image. Ce fichier contient tous les modules listés dans BOARD_ODM_KERNEL_MODULES.

Si vous souhaitez remplacer le contenu de modules.load, vous pouvez le spécifier dans BOARD_ODM_KERNEL_MODULES_LOAD.

Au moment de la compilation, les modules listés dans BOARD_ODM_KERNEL_MODULES sont installés dans $ANDROID_PRODUCT_OUT/odm_dlkm/lib/modules. Un lien symbolique est créé à /odm/lib/modules et mène à /odm_dlkm/lib/modules.

Utilisez toujours /vendor/lib/modules et /odm/lib/modules pour les modules de kernel du fournisseur et de l'ODM.

N'utilisez jamais /vendor_dlkm/lib/modules. Les appareils sans partition vendor_dlkm installent BOARD_VENDOR_KERNEL_MODULES directement sur /vendor/lib/modules. Ce problème est problématique, car /vendor_dlkm/lib/modules n'existe pas.

N'utilisez jamais /odm_dlkm/lib/modules. Les appareils sans partition odm_dlkm installent BOARD_ODM_KERNEL_MODULES directement sur /odm/lib/modules. Cela pose problème, car /odm_dlkm/lib/modules n'existe pas.

Montage de la partition et chargement du module

Lors de first_stage_init, les partitions vendor_dlkm et odm_dlkm sont montées dans les répertoires /vendor_dlkm et /odm_dlkm, respectivement. Dans ce cas, les liens symboliques à /vendor/lib/modules et /odm/lib/modules deviennent disponibles.

Un processus du fournisseur (comme un script .rc) peut ensuite charger les modules du kernel en fonction de l'ordre spécifié dans modules.load. Le processus du fournisseur peut également charger les modules ultérieurement, si nécessaire.

Pour en savoir plus sur la création d'une partition de démarrage du fournisseur (qui contient le RAMDisk du fournisseur), consultez la section Compatibilité avec le module du kernel.