Un pilote de périphérique sous Linux est-il un programme / processus ou s'agit-il simplement d'une bibliothèque?

23

Un pilote de périphérique est-il un programme qui s'exécute seul, ou s'agit-il simplement d'une bibliothèque (un groupe de fonctions) qui est chargée en mémoire et les programmes peuvent appeler l'une de ses fonctions (donc il ne s'exécute pas seul).

Et s'il s'agit d'un programme, a-t-il un ID de processus, est-ce que je peux par exemple terminer un pilote de périphérique de la même manière que je peux terminer tout autre processus?

user255688
la source
1
Vous pouvez "décharger" un pilote avec rmmod, mais seulement s'il n'est pas utilisé.
pjc50

Réponses:

35

Sous Linux, de nombreux pilotes de périphériques font partie du noyau, pas des bibliothèques ou des processus. Les programmes interagissent avec ces fichiers de périphériques à l' aide (généralement dans /dev) et divers appels système tels que open, read, write, ioctl...

Il existe cependant des exceptions. Certains pilotes de périphériques utilisent un mélange de talons de pilotes du noyau et de bibliothèques d'espace utilisateur ( par exemple en utilisant UIO). D'autres sont entièrement implémentés dans l'espace utilisateur, généralement au-dessus d'une interface de frappe de bits (UART ou GPIO). Dans les deux cas, ils sont généralement en cours de traitement, vous ne verrez donc pas de processus distinct, juste le processus qui utilise l'appareil.

Pour «terminer» un pilote de périphérique, vous devez arrêter tous les processus qui l'utilisent, puis supprimer ses modules du noyau (en supposant qu'il est construit en tant que modules), et éventuellement tous les autres modules qu'il utilise et qui ne sont plus nécessaires. Vous pouvez répertorier les modules sur votre système à l'aide lsmodet les décharger à l'aide de rmmodou modprobe -r, qui ne fonctionneront que s'ils lsmodindiquent qu'ils n'ont pas d'utilisateurs.

Stephen Kitt
la source
2
Si vous êtes assez courageux et que votre noyau a été compilé avec CONFIG_MODULE_FORCE_UNLOAD, vous pouvez essayer rmmod -fde forcer le déchargement des modules qui sont en cours d'utilisation / non conçus pour être supprimés / etc. souille également le noyau.
Ruslan
9

Vous devez d'abord définir ce qu'est un pilote. Je vais le définir comme un programme ou un sous-programme qui contrôle un appareil (comme votre appareil photo) ou un sous-système (comme un système de fichiers). Qu'il le fasse directement via le programme système ou via des serveurs du noyau ou des processus utilisateur-land ne devrait pas principalement concerner cette question essentiellement sémantique.

Dans certains cas, Linux ne fournit qu'un protocole générique écrit dans un logiciel où le "pilote" réel est une arborescence de périphériques. Il s'agit d'une configuration des paramètres matériels et du logiciel à utiliser qui constitue un pilote.

De manière générale, les interfaces et les protocoles des pilotes sont implémentés à l'aide de modules du noyau qui sont chargés selon les besoins définis par les arborescences de périphériques ou les règles udev. Un module noyau n'est pas au sens strict un processus ou une bibliothèque.

Une bibliothèque n'est qu'un ensemble statique de code qui peut être chargé dans n'importe quel processus donné. Les systèmes d'exploitation modernes chargent ces bibliothèques dans la mémoire partagée. Un processus peut lui-même être lié à n'importe quel nombre de bibliothèques partagées.

Un processus est un programme en cours d'exécution dans lequel le programme système ou le noyau a alloué des ressources telles que la mémoire système et le temps processeur. Les modules du noyau peuvent suivre ou non ce modèle eux-mêmes mais ne sont pas considérés comme des processus de facto sous Linux.

Donc, pour répondre à votre question, un pilote n'a pas besoin d'être un processus, mais il peut l'être. Bien que le code puisse exister dans une bibliothèque, le pilote est toujours chargé en mémoire via un programme, que ce soit le noyau sous la forme de modules du noyau ou de processus utilisateur.

Cela devient plus un argument sémantique lorsque l'on considère ce qu'est réellement la totalité d'un conducteur. Vous pourriez dire qu'un pilote est toujours un programme, mais parfois ce n'est pas comme dans le cas des arborescences de périphériques, il peut également s'agir d'un processus utilisateur, d'un fichier d'arborescence de périphériques, de règles udev et d'un module de noyau où le processus et le module utilisent tous les deux des bibliothèques pour constituer la logique d'un conducteur.

jdwolf
la source
0

Un pilote de périphérique Linux est essentiellement une bibliothèque d'espace noyau . Ses appels sont lancés principalement par les pilotes de niveau supérieur ou par les processus de l'espace utilisateur l'utilisant.

Il n'y a que quelques exceptions à cela:

  • Les threads du noyau peuvent également être démarrés / arrêtés par des pilotes, ce sont essentiellement des processus sans partie espace utilisateur.
  • Les gestionnaires d'interruption sont déclenchés par le matériel et non par les processus de l'espace utilisateur.

Dans d'autres systèmes, comme dans GNU Hurd, les pilotes sont essentiellement des démons avec lesquels les processus peuvent interagir. Sous Linux, les pilotes sont des bibliothèques. Les deux concepts ont cependant leurs avantages et leurs inconvénients.

peterh dit réintégrer Monica
la source