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