Nota :
Ce tuto est la copie d'un cours proposé par raleur sur le forum ici :
Que les pas de raleur soient menés sur un tapis de pétales de rose à jamais…
Ce qui suit concerne plus particulièrement les périphériques “plug&play” connectés à un bus de type PCI ou USB.
Il y a deux niveaux de communication entre le noyau et un périphérique :
La communication au niveau bus est commune à tous les périphériques connectés par un même type de bus : PCI, USB, SATA… Elle ne sert pas à faire fonctionner le périphérique mais à le détecter, l'identifier, énumérer ses ressources (plages mémoire et E/S, interruptions…), détecter sa déconnexion… Cette communication est assurée par le pilote du bus.
La communication au niveau fonctionnel est spécifique à chaque modèle de périphérique, ou à chaque classe de périphérique s'il s'agit d'un périphérique standard (clavier, souris, stockage de masse, contrôleur AHCI…). Cette communication est assurée par le pilote spécifique du périphérique ou de la classe de périphérique, qui s'appuie sur le pilote du bus. Elle a pour but d'utiliser le périphérique et de le faire fonctionner.
Quand un périphérique est détecté sur un bus, il est d'abord interrogé par le pilote du bus pour l'identifier.
Le périphérique renvoie diverses informations sur lui-même, dont plusieurs identifiants :
Ce sont par exemple les informations qu'on peut afficher avec lspci ou lsusb.
On peut aussi les retrouver dans l'arborescence de /sys/bus/
.
Le noyau va ensuite notifier divers composants logiciels du système qui se sont enregistrés pour recevoir ces informations :
Lorsqu'un pilote du noyau compilé en dur ou en module chargé reconnaît les identifiants d'un périphérique présent qu'il sait gérer, il s'associe à lui et le prend en charge. D'autre part, chaque pilote plug&play compilé en module contient une liste de combinaisons d'identifiants de périphériques qu'il sait gérer sous forme d'alias. C'est ce qui est affiché par modinfo dans les lignes “alias:” pour un module donné.
Il peut s'agir par exemple de couples d'identifiants constructeur+produit pour le pilote d'un périphérique particulier, ou d'identifiants de classe pour le pilote d'un périphérique générique.
Lorsqu'udev est notifié par le noyau de la détection d'un périphérique, il exécute modprobe avec la combinaison d'identifiants renvoyés.
Modprobe recherche une correspondance avec un module dans le fichier /lib/modules/$(uname -r)/modules.alias
, qui a été créé par depmod en scannant l'ensemble des modules présents dans /lib/modules/$(uname -r)
lors de l'installation du noyau.
Si une correspondance est trouvée, le module est chargé et prend le périphérique en charge.