Bir donanım için kernel modülü (kernel space driver) mi yoksa user space driver mı yazarsınız? Artıları ve eksileri nelerdir?

Cevap

Kısa cevap: Kesme gecikmesi kritikse, birden çok süreç cihazı paylaşacaksa veya mevcut bir kernel alt sistemine (IIO, input, net, hwmon) entegre olmak gerekiyorsa kernel driver; basit, düşük hızlı ve tek uygulamanın kullandığı cihazlarda user space driver tercih edilir.

KriterKernel modülüUser space driver
Hata etkisiBug tüm sistemi çökertebilir (kernel panic)Sadece süreç çöker
Geliştirme / debugZor (printk, kgdb, yeniden boot)Kolay (gdb, valgrind, normal araçlar)
Kesme gecikmesiDüşük, doğrudan IRQ handlerDaha yüksek (UIO/poll ile uyanma)
PerformansContext switch yokSistem çağrısı ve kopyalama maliyeti
LisansGPL uyumlu olmalıKapalı kaynak mümkün
Kernel sürüm bağımlılığıAPI değişince yeniden derlemeKararlı userspace ABI

User space yöntemleri

  • I2C: /dev/i2c-N + ioctl(I2C_RDWR)
  • SPI: /dev/spidevX.Y
  • GPIO: /dev/gpiochipN + libgpiod
  • Bellek eşlemeli cihaz: UIO (/dev/uioN) veya VFIO ile mmap

Kernel modülü iskeleti

#include <linux/module.h>
#include <linux/init.h>

static int __init hello_init(void)
{
    pr_info("hello: yuklendi\n");
    return 0;
}

static void __exit hello_exit(void)
{
    pr_info("hello: kaldirildi\n");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
make -C /lib/modules/$(uname -r)/build M=$PWD modules
sudo insmod hello.ko && dmesg | tail -1
sudo rmmod hello

Örnek karar: 100 Hz okunan bir I2C sıcaklık sensörü için /dev/i2c-1 üzerinden user space yeterlidir. Mikrosaniye seviyesinde kesme cevabı gereken bir motor encoder'ı için kernel driver gerekir.

  1. Linux'ta user space'den GPIO kontrol etmek için sysfs mi libgpiod mu kullanılmalı? Neden?KolayGömülü LinuxEmbedded
  2. User space'den /dev/mem ve mmap ile donanım register'larına erişmek nasıl yapılır? Riskleri ve daha iyi alternatifleri nelerdir?ZorGömülü LinuxEmbedded
  3. Linux kernel'de kesme işleme neden top half ve bottom half olarak ikiye ayrılır? Softirq, tasklet, workqueue ve threaded IRQ arasındaki farklar nelerdir?ZorGömülü LinuxEmbedded
  4. Cross-compilation nedir? Bir cross toolchain hangi bileşenlerden oluşur ve sysroot ne işe yarar?KolayGömülü LinuxEmbedded
  5. Yocto Project ile Buildroot arasındaki farklar nelerdir? Bir ürün için hangisini seçersiniz?OrtaGömülü LinuxEmbedded
  6. Device tree nedir, neden kullanılır? .dts, .dtsi, .dtb ve overlay kavramlarını açıklayın.OrtaGömülü LinuxEmbedded

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle