Bir çekirdek modülü hiç bir aygıt sürücüsü olmayabilir.
"Çekirdek sürücüsü" iyi tanımlanmış bir terim değildir, ancak hadi bir şans verelim.
Bu, herhangi bir donanıma sahip olmayan ve dolayısıyla bir "aygıt sürücüsü" olarak kabul edilemeyecek bir çekirdek modülüdür:
#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)
İnşa ettikten sonra şu şekilde kullanabilirsiniz:
insmod hello.ko
ve yazdırır hello init
için dmesg
.
Bununla birlikte, aygıt sürücüsü olmayan çekirdek modülleri vardır, ancak bunlar gerçekten yararlıdır, örneğin, çekirdek hata ayıklama / performans bilgisini ortaya çıkaran modüller.
Aygıt sürücüleri genellikle çekirdek modüllerdir.
Bir "aygıt sürücüsü" olan bir şeye örnek olarak, üretilmesi biraz zordur, çünkü sürülmesi gereken bir donanım gerektirir ve donanım açıklamaları karmaşık olma eğilimindedir.
Bununla birlikte, QEMU veya diğer emülatörleri kullanarak, gerçek veya basitleştirilmiş donanımın yazılım modellerini oluşturabiliriz; bu, donanımla nasıl konuşulacağını öğrenmenin harika bir yoludur. İşte basit bir PCI aygıt sürücüsü örneği: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c
Daha sonra x86'da donanıma göre konuşmanın aşağı indiğini görüyoruz:
Bu işlemler genel olarak kullanıcı alanından yapılamaz: Açıklandığı gibi: Kullanıcı alanı ve Çekirdek alanı arasındaki fark nedir? Bununla birlikte, bazı istisnalar vardır: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space .
Daha sonra çekirdek, bu tür donanım etkileşimini daha kolay ve daha taşınabilir hale getirmek için daha yüksek seviyeli API'ler sunar:
request_irq
kesintileri idare etmek
ioreadX
ve IO hafıza eşlemesi
- PCI ve USB gibi popüler protokoller için daha da yüksek arayüzler