Partitions du fournisseur et de l'ODM DLKM

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

Pour Android 11 ou version ultérieure, le noyau et tous les modules du noyau peuvent être mis à jour indépendamment du reste des partitions. Pour activer les mises à jour des modules du noyau 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 du noyau à chargement dynamique du fournisseur). Vous pourrez ensuite mettre à jour cette partition de manière indépendante. 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
  • Fichiers de configuration modprobe
  • Un fichier modules.load

Contenu odm_dlkm dans /odm/lib/modules

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

Pour en savoir plus sur les fichiers de configuration des modules du noyau, consultez Prise en charge des modules du noyau.

Assistance pour la création

La création de vendor_dlkm et odm_dlkm est un processus similaire à celui des autres partitions dynamiques.

Exemple de compilation vendor_dlkm

Créez 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 mise à jour. Le groupe de mise à jour doit être celui dans lequel se trouve la partition du fournisseur.

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

AB_OTA_PARTITIONS += vendor_dlkm

fstab

Ajoutez l'entrée suivante pour vendor_dlkm à fstab. Modifiez les options en fonction de l'appareil. Prenons pour exemple la CL Add vendor_dlkm to 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 Virtual 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. Prenons pour exemple la CL Add odm_dlkm to CF.

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

Copier des modules du noyau dans une partition

Pour sélectionner les modules du noyau que vous souhaitez copier dans la partition vendor_dlkm, listez-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 listés dans BOARD_VENDOR_KERNEL_MODULES sont installés dans $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules. Un lien symbolique est créé à l'emplacement /vendor/lib/modules et redirige vers /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éé au niveau de /odm/lib/modules et mène à /odm_dlkm/lib/modules.

Utilisez toujours /vendor/lib/modules et /odm/lib/modules pour les modules de noyau 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. Cela pose problème, 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 partitions et chargement de modules

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

Un processus fournisseur (comme un script .rc) peut ensuite charger les modules du noyau 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 obtenir de la documentation sur la création d'une partition vendor-boot (qui contient le vendor RAMDisk), consultez Prise en charge des modules du noyau.