Compatibilité avec les modules du noyau

Une image générique du noyau (GKI) peut ne pas contenir la compatibilité de pilote requise pour permettre à un appareil d'installer des partitions. Pour permettre à un appareil d'installer des partitions et de continuer à démarrer, la première étape init est améliorée pour charger les modules du noyau présents sur un disque RAM. Le disque RAM est divisé en disques RAM génériques et de fournisseur. Les modules du noyau du fournisseur sont stockés dans le disque RAM du fournisseur. L'ordre dans lequel les modules du noyau sont chargés est configurable.

Emplacement du module

Le disque RAM est le système de fichiers pour la première étape init, et pour l' image de récupération/fastbootd sur les appareils A/B et A/B virtuels. Il s'agit d'un initramfs composé de deux archives cpio qui sont concaténées par le bootloader. La première archive cpio, qui est stockée en tant que disque RAM du fournisseur dans la partition de démarrage du fournisseur, contient les composants suivants :

  • Modules du noyau du fournisseur de la première étape init, situés dans /lib/modules/.
  • Fichiers de configuration modprobe, situés dans /lib/modules/ : modules.dep, modules.softdep, modules.alias, modules.options.
  • Un fichier modules.load qui indique les modules à charger lors de la première étape d'initialisation, et dans quel ordre, dans /lib/modules/.
  • Modules du noyau de récupération du fournisseur, pour les appareils A/B et A/B virtuels, dans /lib/modules/
  • modules.load.recovery qui indique les modules à charger, et dans quel ordre, pour les appareils A/B et A/B virtuels, dans /lib/modules.

La deuxième archive cpio, fournie avec la GKI en tant que disque RAM de boot.img et appliquée en plus de la première, contient first_stage_init et les bibliothèques dont elle dépend.

Chargement de modules lors de la première étape d'initialisation

La première étape init commence par lire les fichiers de configuration modprobe à partir de /lib/modules/ sur le disque RAM. Ensuite, elle lit la liste des modules spécifiés dans /lib/modules/modules.load (ou dans le cas de la récupération, /lib/modules/modules.load.recovery) et tente de charger chacun de ces modules dans l'ordre, en suivant la configuration spécifiée dans les fichiers précédemment chargés. L'ordre demandé peut être modifié pour satisfaire les dépendances strictes ou souples.

Compatibilité de compilation, première étape d'initialisation

Pour spécifier les modules du noyau à copier dans le cpio du disque RAM du fournisseur, listez-les dans BOARD_VENDOR_RAMDISK_KERNEL_MODULES. La compilation exécute depmod sur ces modules et place les fichiers de configuration modprobe résultants dans le cpio du disque RAM du fournisseur.

La compilation crée également un fichier modules.load et le stocke dans le cpio du disque RAM du fournisseur. Par défaut, il contient tous les modules listés dans BOARD_VENDOR_RAMDISK_KERNEL_MODULES. Pour remplacer le contenu de ce fichier, utilisez BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD, comme illustré dans cet exemple :

BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := \
    device/vendor/mydevice-kernel/first.ko \
    device/vendor/mydevice-kernel/second.ko \
    device/vendor/mydevice-kernel/third.ko

Compatibilité de compilation, Android complet

Comme dans Android 10 et les versions antérieures, les modules du noyau listés dans BOARD_VENDOR_KERNEL_MODULES sont copiés par la compilation de la plate-forme Android dans la partition du fournisseur à l'adresse /vendor/lib/modules. La compilation de la plate-forme exécute depmod sur ces modules et copie les fichiers de sortie depmod dans la partition du fournisseur au même emplacement. Le mécanisme de chargement des modules du noyau à partir de /vendor reste le même que pour les versions précédentes d'Android. Vous décidez comment et quand charger ces modules, bien que cela soit généralement effectué à l'aide de scripts init.rc.

Caractères génériques et compilations de noyau intégrées

Les fournisseurs qui combinent la compilation du noyau de leur appareil avec la compilation de la plate-forme Android peuvent rencontrer un problème lors de l'utilisation des macros BOARD mentionnées ci-dessus pour spécifier les modules du noyau à copier sur l'appareil. Si le fournisseur souhaite éviter de lister les modules du noyau dans les fichiers de compilation de la plate-forme de l'appareil, il peut utiliser un caractère générique ($(wildcard device/vendor/mydevice/*.ko). Notez que le caractère générique ne fonctionne pas dans le cas d'une compilation de noyau intégrée, car lorsque make est appelé et que les macros sont développées dans les makefiles, les modules du noyau n'ont pas été compilés. Les macros sont donc vides.

Pour contourner ce problème, le fournisseur peut demander à sa compilation de noyau de créer une archive zip contenant les modules du noyau à copier sur chaque partition. Définissez le chemin d'accès à cette archive zip dans BOARD_*_KERNEL_MODULES_ARCHIVE* correspond au nom de la partition (par exemple, BOARD_VENDOR_KERNEL_MODULES_ARCHIVE). La compilation de la plate-forme Android extrait cette archive zip à l'emplacement approprié et exécute depmod sur les modules.

L'archive zip du module du noyau doit comporter une règle make qui garantit que la compilation de la plate-forme peut générer l'archive si nécessaire.

Récupération

Dans les versions précédentes d'Android, les modules du noyau requis pour la récupération étaient spécifiés dans BOARD_RECOVERY_KERNEL_MODULES. Dans Android 12, les modules du noyau requis pour la récupération sont toujours spécifiés à l'aide de cette macro. Toutefois, les modules du noyau de récupération sont copiés dans le cpio du disque RAM du fournisseur, plutôt que dans le cpio du disque RAM générique. Par défaut, tous les modules du noyau listés dans BOARD_RECOVERY_KERNEL_MODULES sont chargés lors de la première étape init. Si vous ne souhaitez charger qu'un sous-ensemble de ces modules, spécifiez le contenu de ce sous-ensemble dans BOARD_RECOVERY_KERNEL_MODULES_LOAD.

Pour en savoir plus sur la création d'une partition de démarrage du fournisseur (qui contient le disque RAM du fournisseur mentionné sur cette page), consultez Partitions de démarrage.