GNU/Linux >> Tutoriels Linux >  >> Linux

Quelle est la séquence de chargement du module du noyau Linux au démarrage ? Quelle priorité leur est accordée ?

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

  • Demande d'espace utilisateur : Ce qui couvre tout, des services init à udev en passant par la ligne de commande. Init ou udev sont probablement les moyens les plus simples si vous souhaitez charger un module spécifique au démarrage.

  • Appareil branché à chaud : Lorsque vous connectez quelque chose à, par exemple, USB ou PCI, le noyau le détecte et demande un module approprié en fonction de la façon dont le périphérique s'identifie.

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

Notez que pour les deux derniers, j'ai utilisé l'expression "demander un module" - c'est parce que le noyau se charge en fait via un démon de l'espace utilisateur, kmod qui exécute /sbin/modprobe . Selon Wolfgang Mauerer dans Linux Kernel Architecture , il n'y a que ~100 points différents dans le noyau 2.6 où il appelle un request_module() interne fonction.

modprobe utilise une base de données des MODULE_ALIAS installés. Ceux-ci sont spécifiés explicitement dans le code source du module, ou dérivés de son MODULE_DEVICE_TABLE, qui est une liste d'ID de périphériques OEM que le module dessert.


De nombreux systèmes sont configurés pour utiliser un initrd ou un initramfs. Ce sont des images de système de fichiers qui sont chargées par le chargeur de démarrage et mises à la disposition du noyau avant qu'il ne monte la partition racine. Cela permet aux pilotes nécessaires pour monter la partition racine (pilotes de disque, pilotes de système de fichiers, mappeur de périphérique ou pilotes de volume logique, …) d'être compilés en tant que modules et chargés à partir de initrd/initramfs.

Les scripts de démarrage sur l'initrd (/linuxrc ) ou initramfs (/init ) charge généralement certains modules et localise le système de fichiers racine. Chaque distribution a sa propre configuration. Ubuntu utilise un initramfs qui est assemblé à partir de composants dans le initramfs-tools package et régénéré pour chaque noyau en fonction des pilotes nécessaires pour monter le système de fichiers racine.

Une fois le système de fichiers racine monté, lors du démarrage du système, les modules répertoriés dans /etc/modules (Debian, …) ou /etc/modules.conf (Red Hat, Arch, …) sont chargées. Ce fichier répertorie généralement quelques modules, voire aucun. La plupart des modules sont chargés à la demande.

Lorsque le noyau détecte un matériel pour lequel il manque un pilote, ou certains autres composants tels que des protocoles réseau ou des algorithmes cryptographiques, il appelle /sbin/modprobe pour charger le module. Pour les pilotes matériels, le noyau transmet des noms qui encodent l'identifiant PCI, l'identifiant USB ou toute autre désignation systématique du matériel. Il y a un tableau en /lib/modules/$VERSION/modules.alias qui associe ces désignations systématiques aux noms de module. Cette table est générée par depmod et lu par modprobe .

Si vous avez un module de noyau supplémentaire que vous avez compilé manuellement pour un périphérique matériel, déposez-le dans /lib/modules/$VERSION/local (créer le local sous-répertoire s'il n'existe pas) et exécutez depmod -a pour régénérer la base de données d'alias. Si le module est destiné à une fonctionnalité inhabituelle que le noyau est incapable de détecter automatiquement, déposez-le dans /lib/modules/$VERSION/local , exécutez depmod -a pour analyser ses dépendances, et ajouter le nom du module à /etc/modules .


Linux
  1. Comment définir le nom d'un thread dans les pthreads Linux ?

  2. Comment définir l'adresse IP de C sous Linux

  3. Quelle est la source actuelle du noyau Linux ?

  4. Qu'est-ce qu'un noyau teinté sous Linux ?

  5. Comment définir l'interface réseau préférée sous Linux

Comment compiler un noyau Linux au 21e siècle

Comment charger ou décharger un module du noyau Linux

Comment vérifier la version du noyau sous Linux

Comment définir ou modifier le fuseau horaire sous Linux

Comment changer la priorité d'un processus sous Linux

Comment configurer le pare-feu UFW sous Linux