Un módulo de kernel puede no ser un controlador de dispositivo en absoluto.
"Controlador de kernel" no es un término bien definido, pero vamos a intentarlo.
Este es un módulo de kernel que no maneja ningún hardware y, por lo tanto, no podría considerarse razonablemente un "controlador de dispositivo":
#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)
Después de compilar, puede usarlo con:
insmod hello.ko
y se imprime hello init
a dmesg
.
Sin embargo, hay módulos de kernel que no son controladores de dispositivo, pero en realidad son útiles, por ejemplo, módulos que exponen información de depuración / rendimiento del kernel.
Los controladores de dispositivos suelen ser también módulos de kernel.
Un ejemplo de algo que es un "controlador de dispositivo" es un poco más difícil de generar, ya que requiere un hardware para conducir, y las descripciones de hardware tienden a ser complicadas.
Sin embargo, utilizando QEMU u otros emuladores, podemos construir modelos de software de hardware real o simplificado, que es una excelente manera de aprender a hablar con el hardware. Aquí hay un ejemplo simple de un controlador de dispositivo PCI mínimo: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c
Luego vemos que en x86, hablar con el hardware se reduce a:
En general, esas operaciones no se pueden realizar desde el país de usuario, como se explica en: ¿Cuál es la diferencia entre el espacio del usuario y el espacio del kernel? Sin embargo, hay algunas excepciones: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space .
El núcleo luego ofrece API de nivel superior para hacer que dicha interacción de hardware sea más fácil y más portátil:
request_irq
manejar interrupciones
ioreadX
y mapeo de memoria IO
- incluso interfaces de nivel superior para protocolos populares como PCI y USB