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?

Cevap

Hard IRQ handler (top half) çalışırken o hat ve çoğu zaman o CPU'daki diğer işler bekler; ayrıca handler uyuyamaz (sleep edemez). Bu yüzden top half sadece acil işi yapar (donanımı onayla, veriyi al, işi planla), zaman alan iş ise bottom half'e ertelenir.

MekanizmaBağlamUyuyabilir mi?Tipik kullanım
SoftirqInterrupt context, derleme anında sabit sayıdaHayırAğ (NET_RX), block, timer; çok yüksek frekanslı işler
TaskletSoftirq üzerine kurulu, aynı tasklet aynı anda tek CPU'daHayırEski sürücüler; yeni kodda önerilmiyor
WorkqueueKernel thread (process context)EvetMutex, I2C/SPI transferi, bellek ayırma gereken işler
Threaded IRQHer IRQ için özel kernel threadEvetModern sürücüler için önerilen yol

Threaded IRQ örneği

static irqreturn_t sensor_hardirq(int irq, void *dev_id)
{
    /* Çok kısa: sadece işin bize ait olduğunu kontrol et */
    return IRQ_WAKE_THREAD;
}

static irqreturn_t sensor_thread(int irq, void *dev_id)
{
    struct sensor *s = dev_id;
    /* Burada uyuyabiliriz: I2C üzerinden veri oku */
    s->val = i2c_smbus_read_word_data(s->client, REG_DATA);
    return IRQ_HANDLED;
}

ret = devm_request_threaded_irq(dev, irq, sensor_hardirq, sensor_thread,
                                IRQF_ONESHOT, "sensor", s);

IRQF_ONESHOT, thread işini bitirene kadar hattı maskeli tutar; level-triggered ve I2C üzerindeki cihazlarda gereklidir. Primary handler NULL verilirse kernel varsayılan bir handler kullanır.

Seçim kuralı

  • Uyumanız gerekiyorsa (mutex, I2C, kmalloc(GFP_KERNEL)): threaded IRQ veya workqueue.
  • Mikrosaniye seviyesinde ve yüksek frekanslı, uyumayan iş: softirq tabanlı mekanizmalar (çoğu sürücü bunu doğrudan kullanmaz, NAPI gibi alt sistemler kullanır).
  • Tasklet'ler kernel topluluğu tarafından kaldırılmak isteniyor; yeni kodda BH workqueue veya threaded IRQ tercih edilmeli.

PREEMPT_RT yaması (kernel 6.12 ile mainline'a alındı) çoğu IRQ handler'ını zaten thread olarak çalıştırır; bu da gerçek zamanlı davranışı iyileştirir.

  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. Cross-compilation nedir? Bir cross toolchain hangi bileşenlerden oluşur ve sysroot ne işe yarar?KolayGömülü LinuxEmbedded
  4. Yocto Project ile Buildroot arasındaki farklar nelerdir? Bir ürün için hangisini seçersiniz?OrtaGömülü LinuxEmbedded
  5. 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?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