Un module de noyau est un morceau de code compilé qui peut être inséré dans le noyau au moment de l'exécution, tel que with insmod
ou modprobe
.
Un pilote est un peu de code qui s'exécute dans le noyau pour communiquer avec un périphérique matériel. Il "conduit" le matériel. La plupart des éléments matériels de votre ordinateur ont un pilote associé.¹ Une grande partie du noyau en cours d'exécution est constituée du code du pilote.²
Un pilote peut être construit de manière statique dans le fichier du noyau sur le disque.3 Un pilote peut également être construit en tant que module du noyau afin de pouvoir être chargé dynamiquement ultérieurement. (Et puis peut-être déchargé.)
La pratique standard consiste à créer des pilotes sous forme de modules de noyau, lorsque cela est possible, plutôt que de les lier statiquement au noyau, car cela donne plus de flexibilité. Il y a de bonnes raisons de ne pas cependant:
Parfois, un pilote donné est absolument nécessaire pour aider le système à démarrer. Cela ne se produit pas aussi souvent que vous pouvez l'imaginer, en raison de la fonctionnalité initrd .
Les pilotes construits de manière statique peuvent être exactement ce que vous voulez dans un système à portée statique, tel qu'un système intégré . Autrement dit, si vous savez à l'avance quels pilotes seront toujours nécessaires et que cela ne changera jamais, vous avez une bonne raison de ne pas vous soucier des modules dynamiques du noyau.
Si vous construisez votre noyau statiquement et désactivez la fonctionnalité de chargement de module dynamique de Linux, vous empêchez la modification du code du noyau à l'exécution. Cela offre une sécurité et une stabilité supplémentaires au détriment de la flexibilité.
Tous les modules du noyau ne sont pas des pilotes. Par exemple, une caractéristique relativement récente du noyau Linux est que vous pouvez charger un autre planificateur de processus . Un autre exemple est que les types de matériel les plus complexes ont souvent plusieurs couches génériques situées entre le pilote de matériel de bas niveau et le domaine utilisateur, tel que le pilote USB HID , qui implémente un élément particulier de la pile USB , indépendant du matériel sous-jacent.
À part:
La puce CPU, qui n’a pas de "pilote" en soi, fait exception à la règle . Votre ordinateur peut également contenir du matériel pour lequel vous n’avez pas de pilote.
Le reste du code dans un noyau de système d'exploitation fournit des services génériques tels que la gestion de la mémoire , l' IPC , la planification , etc. Ces services peuvent principalement servir des applications utilisateur , comme avec les exemples liés précédemment, ou peuvent être des services internes utilisés par des pilotes ou d'autres utilisateurs. infrastructure du noyau.
Celui qui est /boot
chargé dans la RAM au moment du démarrage par le chargeur de démarrage au début du processus de démarrage .
man lspci
: "-k Affiche les pilotes du noyau gérant chaque périphérique ainsi que les modules du noyau capables de le gérer ." Vous pouvez le lire comme suit: "Afficher le pilote qui gère actuellement / réellement le périphérique ainsi que tous les modules susceptibles de le gérer ".Pour répondre à votre question concernant la
lspci
sortie, la ligne "Pilote du noyau" désigne le pilote actuellement lié à la carte, dans ce cas lenvidia
pilote propriétaire . La ligne "modules du noyau" répertorie tous les pilotes connus pour être capables de se lier à cette carte. Ici, le pilote propriétaire affiche un nom différent, probablement en raison de la façon dontlspci
le pilote et son nom de fichier ont été trouvés, par rapport au nom codé dans le pilote lui-même.la source
man lspci
- cela dit exactement ce que vous avez écrit.Selon ce beau tutoriel :
Donc, si nous essayons de dessiner une arborescence, nous aurons un "Pilote de périphérique" qui hérite de Module (étendu), et qui a des caractéristiques plus spécifiques, entre lesquelles on trouve "un accès au matériel" ...
la source
Un module de noyau peut ne pas être du tout un pilote de périphérique.
"Pilote de noyau" n'est pas un terme bien défini, mais essayons-le.
Il s’agit d’un module du noyau qui ne gère aucun matériel et ne peut donc raisonnablement être considéré comme un "pilote de périphérique":
Après la construction, vous pouvez l'utiliser avec:
et il imprime
hello init
àdmesg
.Cependant, certains modules du noyau ne sont pas des pilotes de périphériques, mais sont réellement utiles, par exemple, des modules qui exposent des informations de débogage / de performances du noyau.
Les pilotes de périphériques sont généralement aussi des modules du noyau.
Un exemple de "pilote de périphérique" est un peu plus difficile à générer car il nécessite un matériel à gérer et les descriptions de matériel ont tendance à être compliquées.
Cependant, en utilisant QEMU ou d’autres émulateurs, nous pouvons construire des modèles logiciels de matériel réel ou simplifié, ce qui est un excellent moyen d’apprendre à parler au matériel. Voici un exemple simple de pilote de périphérique PCI minimal: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c
Nous voyons ensuite que dans x86, parler au matériel revient à:
in
etout
instructions, par exemple, https://stackoverflow.com/questions/3215878/what-are-in-out-instructions-in-x86-used-for/33444273#33444273En général, ces opérations ne peuvent pas être effectuées à partir de l’utilisateur, comme expliqué à: Quelle est la différence entre l’espace utilisateur et l’espace noyau? Il existe toutefois quelques exceptions: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space .
Le noyau propose ensuite des API de niveau supérieur pour rendre cette interaction matérielle plus facile et plus portable:
request_irq
gérer les interruptionsioreadX
et mappage mémoire IOla source
Ma réponse ira avec Jim. Un pilote de noyau est un programme (module de noyau) conçu pour piloter un composant matériel. La sortie de lspci indique que nvidia est le pilote du noyau, en tant que
loaded
module du périphérique. Avec cela vient d'autres modules de noyau disponibles.J'ajouterai que les commandes sous Linux pour lister et supprimer les pilotes sont
lsmod
etrmmod
respectivement. Qui dit module de liste et supprime le module.la source
Tous les pilotes sont des modules. Tous les modules ne sont pas des pilotes.
Les modules peuvent être insérés au moment de l'exécution. Les modules / pilotes peuvent également être compilés statiquement avec le noyau.
Module typique init a
Le même module peut être transformé en pilote
la source