Prise en charge des modules kernel

Une image de kernel générique (GKI) peut ne pas contenir la prise en charge des pilotes requise pour permettre à un appareil d'installer des partitions. Pour permettre à un appareil d'installer des partitions et de continuer le démarrage, init de premier niveau est amélioré pour charger les modules du noyau présents sur un ramdisk. Le ramdisk est divisé en ramdisks génériques et de fournisseurs. Les modules du kernel du fournisseur sont stockés dans le ramdisk du fournisseur. L'ordre dans lequel les modules du noyau sont chargés est configurable.

Emplacement du module

Le ramdisk est le système de fichiers pour init, de premier niveau et pour l'image de récupération/fastbootd sur les appareils A/B et A/B virtuels. Il s'agit d'un objet 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 ramdisk du fournisseur dans la partition vendor-boot, contient les composants suivants:

  • Modules de noyau du fournisseur init de premier niveau, situés dans /lib/modules/.
  • Fichiers de configuration modprobe, situés dans /lib/modules/ : modules.dep, modules.softdep, modules.alias et modules.options.
  • Fichier modules.load qui indique les modules à charger lors de l'initialisation de la première étape, et dans quel ordre, dans /lib/modules/.
  • Modules de kernel 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 appareils A/B et A/B virtuels, dans /lib/modules.

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

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

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

Prise en charge de la compilation, initialisation de première étape

Pour spécifier les modules de kernel à copier dans le cpio du ramdisk 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 qui en résultent dans le cpio du ramdisk du fournisseur.

La compilation crée également un fichier modules.load et le stocke dans le cpio du ramdisk 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

Prise en charge de la compilation, version complète d'Android

Comme c'est le cas dans Android 10 et versions antérieures, les modules du noyau répertoriés dans BOARD_VENDOR_KERNEL_MODULES sont copiés par le build de la plate-forme Android dans la partition du fournisseur sous /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. C'est à vous de décider comment et quand charger ces modules, bien que cela se fasse généralement à l'aide de scripts init.rc.

Caractères génériques et builds du kernel intégrés

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 lister les modules du kernel 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 du kernel intégrée, car lorsque make est appelé et que les macros sont développées dans les fichiers make, les modules du kernel n'ont pas été compilés, et les macros sont donc 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 d'accès de cette archive ZIP dans BOARD_*_KERNEL_MODULES_ARCHIVE, où * est le nom de la partition (par exemple, 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 comporter une règle de compilation 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 de kernel requis pour la récupération étaient spécifiés dans BOARD_RECOVERY_KERNEL_MODULES. Dans Android 12, les modules de kernel requis pour la récupération sont toujours spécifiés à l'aide de cette macro. Toutefois, les modules du kernel de récupération sont copiés dans le cpio du ramdisk du fournisseur, plutôt que dans le cpio générique du ramdisk. Par défaut, tous les modules du noyau listés dans BOARD_RECOVERY_KERNEL_MODULES sont chargés lors de la première étape de 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 ramdisk du fournisseur mentionné sur cette page), consultez la section Partitions de démarrage.