web-dev-qa-db-fra.com

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

Quand je fais un lspci -k sur mon Kubuntu avec un noyau générique 3.2.0-29 je peux voir quelque chose comme ceci:

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 existe un pilote de noyau nvidia et des modules de 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?

68
JohnnyFromBF

Un module du noyau est un peu de code compilé qui peut être inséré dans le noyau au moment de l'exécution, comme avec insmod ou modprobe =.

Un pilote est un peu de code qui s'exécute dans le noyau pour parler à un périphérique matériel. Il "pilote" le matériel. La plupart des éléments matériels de votre ordinateur sont associés à un pilote.¹ Une grande partie d'un noyau en cours d'exécution est du code de pilote.²

Un pilote peut être intégré de manière statique dans le fichier du noyau sur le disque.³ Un pilote peut également être créé 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 en tant que modules du noyau lorsque cela est possible, plutôt que de les lier statiquement au noyau, car cela donne plus de flexibilité. Il y a cependant de bonnes raisons de ne pas le faire:

  • 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 statiquement peuvent être exactement ce que vous voulez dans un système à portée statique, tel qu'un système intégré . C'est-à-dire que si vous savez à l'avance exactement quels pilotes seront toujours nécessaires et que cela ne changera jamais, vous avez une bonne raison de ne pas vous soucier des modules de noyau dynamiques.

  • Si vous construisez votre noyau de manière statique et désactivez la fonction de chargement de module dynamique de Linux, vous empêchez la modification au moment de l'exécution du code du noyau. 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 fonctionnalité relativement récente du noyau Linux est que vous pouvez charger un planificateur de processus différent . Un autre exemple est que les types de matériel les plus complexes ont souvent plusieurs couches génériques qui se trouvent entre le pilote matériel de bas niveau et l'espace utilisateur, comme le pilote USB HID , qui implémente n élément particulier de la pile USB , indépendamment du matériel sous-jacent.


À part:

  1. Une exception à cette déclaration générale est la puce CPU, qui n'a pas de "pilote" en soi. 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 comme gestion de la mémoire , IPC , planification , etc. Ces services peuvent principalement servir des applications serland , comme avec les exemples liés précédemment, ou ils peuvent être des services internes utilisés par des pilotes ou d'autres infrastructures intra-noyau.

  3. Celui de /boot, chargé dans RAM au démarrage par le chargeur de démarrage au début le processus de démarrage .

79
Warren Young

Pour répondre à votre question spécifique sur la sortie lspci, la ligne "pilote du noyau" fait référence au pilote actuellement lié à la carte, dans ce cas le pilote propriétaire nvidia. 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 lspci a trouvé le pilote et son nom de fichier par rapport au nom codé dans le pilote lui-même.

19
Jim Paris

Un module du noyau n'est peut-être pas du tout un pilote de périphérique.

"Pilote du noyau" n'est pas un terme bien défini, mais essayons-le.

Il s'agit d'un module du noyau qui ne pilote aucun matériel et ne peut donc pas être raisonnablement 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.

Il existe cependant des modules du noyau qui ne sont pas des pilotes de périphérique, mais qui sont en fait utiles, par exemple, des modules qui exposent les informations de débogage/performances du noyau.

Les pilotes de périphériques sont généralement également des modules du noyau.

Un exemple de quelque chose qui est un "pilote de périphérique" est un peu plus difficile à générer, car il nécessite un matériel pour conduire, et les descriptions matérielles 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 d'un pilote de périphérique PCI minimal: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c

On voit alors qu'en x86, parler au matériel revient à:

Ces opérations ne peuvent généralement pas être effectuées à partir de l'espace utilisateur, comme expliqué dans: Quelle est la différence entre l'espace utilisateur et l'espace noyau? Il existe cependant quelques exceptions: https://stackoverflow.com/questions/7986260/linux-interruption-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 pour gérer les interruptions
  • ioreadX et IO mappage de la mémoire
  • interfaces de niveau encore plus élevé pour les protocoles populaires comme PCI et USB

Selon ce Nice 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 "Driver de périphérique" qui hérite du (étend) Module, et qui a des caractéristiques plus spécifiques, entre lesquelles nous trouvons "l'accès au matériel" ...

5
user1847726

Tous les pilotes sont des modules. Tous les modules ne sont pas des pilotes.

Les modules peuvent être insérés lors de l'exécution. Les modules/pilotes peuvent également être compilés statiquement avec le noyau.

L'init de module typique 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 */
}
0
Prabagaran

Ma réponse ira avec Jim. Un pilote de noyau est un programme (module de noyau) conçu pour piloter un matériel. La sortie lspci indique que nvidia est le pilote du noyau car il s'agit du module loaded pour le périphérique. Parallèlement à cela vient d'autres modules de noyau disponibles.

J'ajouterai que les commandes sous Linux pour lister et supprimer les pilotes sont lsmod et rmmod respectivement. Qui dit module de liste et module de suppression.

0
paintbox