Quelle est la différence entre les pilotes du noyau et les modules du noyau?


67

Quand je fais un lspci -kKubuntu avec un noyau 3.2.0-29-générique, je peux voir quelque chose comme:

01:00.0 VGA compatible controller: NVIDIA Corporation G86 [Quadro NVS 290] (rev a1)
    Subsystem: NVIDIA Corporation Device 0492
    Kernel driver in use: nvidia
    Kernel modules: nvidia_current, nouveau, nvidiafb

Il y a un pilote du noyau nvidiaet des modules du noyau nvidia_current, nouveau, nvidiafb.

Maintenant je me demandais quelle pourrait être la différence entre les pilotes du noyau et les modules du noyau?

Réponses:


78

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 insmodou 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:

  1. 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.

  2. 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.

  3. Celui qui est /bootchargé dans la RAM au moment du démarrage par le chargeur de démarrage au début du processus de démarrage .


1
Les modules peuvent être des systèmes de fichiers, des protocoles réseau, des fonctionnalités de pare-feu, etc. Certains matériels (cartes WiFi, par exemple) nécessitent une pile de modules, certains offrant une infrastructure générale, tandis que d’autres gèrent le matériel lui-même.
vonbrand

1
C’est un bon plan général, mais j’avais exactement la même question que le PO, puis j’ai trouvé cette réponse et je ne savais toujours pas pourquoi le "pilote utilisé" était différent des "modules". En revanche, la réponse de @Jim Paris est correcte. De 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 ".
Binarus

Si vous connaissez Windows: Un module est très similaire à une DLL. Sous Unix, un module est similaire à un objet partagé, mais un module est juste pour le noyau. Un module lié dynamiquement peut contenir des pilotes. Un noyau peut contenir des pilotes liés statiquement. Un module est différent d'une DLL (ou .so) car le noyau a des exigences spécifiques quant à la façon dont les choses sont chargées dynamiquement.
robocat

18

Pour répondre à votre question concernant la lspcisortie, la ligne "Pilote du noyau" désigne le pilote actuellement lié à la carte, dans ce cas le nvidiapilote 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 dont lspcile pilote et son nom de fichier ont été trouvés, par rapport au nom codé dans le pilote lui-même.


Merci - cela a aidé. Si seulement j'avais publié man lspci- cela dit exactement ce que vous avez écrit.
Binarus

5

Selon ce beau tutoriel :

... un type de module est le pilote de périphérique, qui permet au noyau d'accéder au matériel connecté au système.

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" ...


Ceci n'est que partiellement correct. Le pilote est un objet d'une classe dans la hiérarchie (oui, la conception interne de Linux, comme la plupart des systèmes d'exploitation actuels, est orientée objet). Mais ce pilote peut être un module (chargeable à l'exécution) ou compilé dans le noyau. Il n'y a pas (ou très peu) de différence entre les alternatives, en termes de code.
vonbrand

4

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":

#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");

static int myinit(void)
{
    printk(KERN_INFO "hello init\n");
    return 0;
}

static void myexit(void)
{
    printk(KERN_INFO "hello exit\n");
}

module_init(myinit)
module_exit(myexit)

Après la construction, vous pouvez l'utiliser avec:

insmod hello.ko

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 à:

En 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 interruptions
  • ioreadX et mappage mémoire IO
  • interfaces de niveau encore plus élevé pour les protocoles populaires tels que PCI et USB

0

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 loadedmodule 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 lsmodet rmmodrespectivement. Qui dit module de liste et supprime le module.


0

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

module_init(init_fn);
init_fn()
{
   /* some code */
}

Le même module peut être transformé en pilote

module_init(init_fn);
init_fn()
{
   device_register(&device);
   /* some code */
}

8
Les pilotes ne sont pas toujours des modules, ils peuvent être inclus dans l'image du noyau principal.
Gilles 'SO- arrête d'être méchant'

3
@Prabagaran: "Tous les pilotes sont des modules. Tous les modules ne sont pas des pilotes." C'est contradictoire. En termes mathématiques, vous dites que D -> M et M ->! D. Cela permet à D et! D.
Francesco Turco

2
Je pense qu'il veut dire "Tous les pilotes sont des modules. Tous les modules ne sont pas des pilotes".
Renan

4
@ Renan: Ce serait correct, mais si vous regardez l'historique de modification de cette réponse, quelqu'un a déjà essayé de réparer l'erreur et l'auteur l'a annulée. Normalement, j'éditerais simplement pour corriger l'erreur et passer à autre chose, mais dans ce cas, je me suis inscrit parce que c'est tout simplement faux et que le problème est confus.
Caleb

Si je me souviens bien (je ne me suis pas amusé depuis longtemps), certains pilotes ne peuvent pas être construits en tant que modules chargeables. Je semble me souvenir d’autres qui ne peuvent être manipulés que comme des modules.
vonbrand
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.