Prise en charge des modules du noyau

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

Emplacement des modules

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

  • Modules de noyau du fournisseur init de première étape, 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 quels modules charger lors de la première étape d'initialisation et dans quel ordre, dans /lib/modules/ .
  • Modules de noyau de récupération du fournisseur, pour les appareils A/B et virtuels A/B, dans /lib/modules/
  • modules.load.recovery qui indique les modules à charger, et dans quel ordre, pour les périphériques A/B et Virtual A/B, dans /lib/modules .

La deuxième archive cpio, qui est fournie avec le GKI en tant que disque virtuel du boot.img et appliquée par-dessus la première, contient first_stage_init et les bibliothèques dont elle dépend.

Chargement du module lors de l'initialisation de la première étape

init de la première étape commence par la lecture des fichiers de configuration modprobe depuis /lib/modules/ sur le disque virtuel. Ensuite, il lit la liste des modules spécifiés dans /lib/modules/modules.load (ou dans le cas d'une récupération, /lib/modules/modules.load.recovery ) et tente de charger chacun de ces modules dans l'ordre, en suivant l'ordre configuration spécifiée dans les fichiers précédemment chargés. L'ordre demandé peut être dévié pour satisfaire des dépendances matérielles ou logicielles.

Support de construction, initialisation de première étape

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

La version crée également un fichier modules.load et le stocke dans le disque virtuel du fournisseur cpio. Par défaut, il contient tous les modules répertoriés dans BOARD_VENDOR_RAMDISK_KERNEL_MODULES . Pour remplacer le contenu de ce fichier, utilisez BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD , comme indiqué 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

Support de build, Android complet

Comme c'est le cas dans Android 10 et les versions antérieures, les modules du noyau répertoriés dans BOARD_VENDOR_KERNEL_MODULES sont copiés par la plate-forme Android intégrée dans la partition du fournisseur dans /vendor/lib/modules . La version de 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. C'est à vous de décider comment et quand charger ces modules, même si cela se fait généralement à l'aide de scripts init.rc

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

Les fournisseurs qui combinent la version du noyau de leur appareil avec la version de la plate-forme Android peuvent rencontrer un problème en utilisant les macros BOARD mentionnées ci-dessus pour spécifier les modules du noyau à copier sur l'appareil. Si le fournisseur souhaite éviter de répertorier les modules du noyau dans les fichiers de construction de la plate-forme du périphérique, 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'un build du noyau, car lorsque make est invoqué et que les macros sont développées dans les makefiles, les modules du noyau n'ont pas été construits, donc les macros sont vides.

Pour contourner ce problème, le fournisseur peut demander à son noyau de créer une archive zip contenant les modules du noyau à copier sur chaque partition. Définissez le chemin de cette archive zip dans BOARD_*_KERNEL_MODULES_ARCHIVE* est le nom de la partition (comme BOARD_VENDOR_KERNEL_MODULES_ARCHIVE ). La version 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 avoir une règle de création qui garantit que la construction de la plate-forme peut générer l'archive lorsque cela est 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 . Sous Android 11, les modules du noyau requis pour la récupération sont toujours spécifiés à l'aide de cette macro. Cependant, les modules du noyau de récupération sont copiés sur le cpio du disque virtuel du fournisseur, plutôt que sur le cpio du disque virtuel générique. Par défaut, tous les modules du noyau répertoriés dans BOARD_RECOVERY_KERNEL_MODULES sont chargés lors de la première étape init . Si vous souhaitez qu'un seul sous-ensemble de ces modules soit chargé, 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 virtuel du fournisseur mentionné sur cette page), consultez Partitions de démarrage .