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