Quelle est la séquence de chargement du module linux kernel au démarrage? Comment la priorité est-elle fixée à eux?

J'ai un module de kernel Linux que j'ai compilé dynamicment. Comment est-il ajouté au démarrage? Il y a beaucoup de files .ko dans /lib/modules . Comment la priorité est-elle définie pour charger ces modules?

Ils ne sont pas chargés automatiquement au démarrage ou à tout autre moment, même si beaucoup d'entre eux finissent par être chargés lors du démarrage. Il existe trois mécanismes différents par lesquels cela se produit:

  • Demande d'espace user: qui couvre tout, des services init à udev en command line. Init ou udev sont probablement les moyens les plus simples si vous souhaitez charger un module spécifique au moment du démarrage.

  • Périphérique branché à chaud: Lorsque vous connectez quelque chose à, par exemple, USB ou PCI, le kernel le détecte et request un module approprié en fonction de l'identification du périphérique.

  • Protocole nécessaire ou autre implémentation : Lorsque le kernel a besoin de faire quelque chose, comme lire un système de files, et découvre qu'il n'a pas les connaissances pour le faire, il requestra un module.

Notez que pour les deux derniers j'ai utilisé l'expression "request a module" – c'est parce que le kernel se charge réellement via un daemon d'espace user, kmod qui exécute /sbin/modprobe . Selon Wolfgang Mauerer dans Linux Kernel Architecture , il n'y a que ~ 100 points différents dans le kernel 2.6 où il appelle une fonction interne request_module() .

modprobe utilise une database de MODULE_ALIAS installés. Ceux-ci sont spécifiés explicitement dans le code source du module ou dérivés de MODULE_DEVICE_TABLE, qui est une list d'ID de périphérique OEM que le module utilise.

De nombreux systèmes sont configurés pour utiliser initrd ou initramfs . Il s'agit d'images de système de files chargées par le chargeur de démarrage et mises à la disposition du kernel avant de monter la partition racine. Cela permet aux pilotes nécessaires à la partition racine (pilotes de disque, pilotes de système de files, mappeurs de périphériques ou pilotes de volumes logiques, …) d'être compilés en tant que modules et chargés à partir de initrd / initramfs.

Les scripts de démarrage sur initrd ( /linuxrc ) ou initramfs ( /init ) chargent généralement certains modules et localisent le système de files racine. Chaque dissortingbution a sa propre configuration. Ubuntu utilise un initramfs qui est assemblé à partir des composants du package initramfs-tools et régénéré pour chaque kernel en fonction des pilotes nécessaires pour monter le système de files racine.

Une fois le système de files racine installé, au cours du démarrage du système, les modules listés dans /etc/modules (Debian, …) ou /etc/modules.conf (Red Hat, Arch, …) sont chargés. Ce file répertorie généralement quelques modules le cas échéant. La plupart des modules sont chargés à la request.

Lorsque le kernel détecte du matériel pour lequel il manque un pilote ou certains autres composants tels que des protocoles réseau ou des algorithms cryptocharts, il appelle /sbin/modprobe pour charger le module. Pour les pilotes matériels, le kernel transmet les noms qui codent l'identifiant PCI, l'identifiant USB ou toute autre désignation systématique du matériel. Il existe une table dans /lib/modules/$VERSION/modules.alias qui mappe ces désignations systématiques en noms de module. Cette table est générée par depmod et lue par modprobe .

Si vous avez un module de kernel supplémentaire que vous avez compilé manuellement pour un périphérique matériel, déposez-le dans /var/lib/modules/$VERSION/local et exécutez depmod -a pour régénérer la database d'alias. Si le module est pour une fonctionnalité inhabituelle que le kernel ne peut pas détecter automatiquement, déposez-le dans /var/lib/modules/$VERSION/local , exécutez depmod -a pour parsingr ses dependencies et ajoutez le nom du module à /etc/modules .