GNU/Linux >> Tutoriels Linux >  >> Linux

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

Un module de noyau est un morceau 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 morceau de code qui s'exécute dans le noyau pour communiquer avec un périphérique matériel. Il "pilote" le matériel. La plupart des composants matériels de votre ordinateur sont associés à un pilote.¹ Une grande partie d'un noyau en cours d'exécution est constituée de code de pilote.²

Un pilote peut être construit de manière statique dans le fichier du noyau sur le disque.³ Un pilote peut également être construit en tant que module du noyau afin qu'il puisse être chargé dynamiquement ultérieurement. (Et puis peut-être déchargé.)

La pratique standard consiste à construire les 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 démarrage du système. Cela n'arrive pas aussi souvent que vous pourriez l'imaginer, grâce à la fonctionnalité initrd.

  • Les pilotes construits statiquement peuvent être exactement ce que vous voulez dans un système dont la portée est statique, comme un système embarqué. 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 dynamiques du noyau.

  • Si vous construisez votre noyau de manière statique 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 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 situent entre le pilote matériel de bas niveau et l'espace utilisateur, comme le pilote USB HID, qui implémente un é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 tels que la gestion de la mémoire, l'IPC, la planification, etc. Ces services peuvent principalement servir des applications utilisateur, comme dans les exemples liés précédemment, ou ils peuvent être des services internes utilisés par des pilotes ou d'autres intra- infrastructure du noyau.

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


Pour répondre à votre question spécifique sur le lspci sortie, la ligne "pilote du noyau" fait référence au pilote actuellement lié à la carte, dans ce cas le propriétaire nvidia chauffeur. La ligne "modules du noyau" répertorie tous les pilotes connus capable 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.


Un module de noyau peut ne pas être du tout un pilote de périphérique

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

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 compilation, 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 des informations de débogage/performance du noyau.

Les pilotes de périphériques sont généralement aussi 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 à piloter, 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

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

  • in et out instructions, par exemple, https://stackoverflow.com/questions/3215878/what-are-in-out-instructions-in-x86-used-for/33444273#33444273
  • gestion des interruptions en enregistrant les gestionnaires avec le CPU

Ces opérations ne peuvent généralement pas être effectuées à partir de l'espace utilisateur, comme expliqué à :Quelle est la différence entre l'espace utilisateur et l'espace noyau ? Il existe cependant 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 le mappage de la mémoire IO
  • interfaces de niveau encore plus élevé pour les protocoles populaires tels que PCI et USB

Linux
  1. Quelle est la différence entre InnoDB et MyISAM ?

  2. La Différence Entre [[ $a ==Z* ]] Et [ $a ==Z* ] ?

  3. Quelle est la différence entre module_init et init_module dans un module du noyau Linux ?

  4. Quelle est la différence entre strtok_r et strtok_s en C ?

  5. Quelle est la différence entre fsck et e2fsck ?

Quelle est la différence entre les noyaux macOS et Linux

Quelle est la différence entre Linux et Unix ?

Qu'est-ce qu'un Hyperviseur ? Quelle est la différence entre les types 1 et 2 ?

Quelle est la différence entre curl et Wget ?

Quelle est la différence entre $(CC) et $CC ?

Quelle est la différence entre la route et la route IP ?