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.
| Mekanizma | Bağlam | Uyuyabilir mi? | Tipik kullanım |
|---|---|---|---|
| Softirq | Interrupt context, derleme anında sabit sayıda | Hayır | Ağ (NET_RX), block, timer; çok yüksek frekanslı işler |
| Tasklet | Softirq üzerine kurulu, aynı tasklet aynı anda tek CPU'da | Hayır | Eski sürücüler; yeni kodda önerilmiyor |
| Workqueue | Kernel thread (process context) | Evet | Mutex, I2C/SPI transferi, bellek ayırma gereken işler |
| Threaded IRQ | Her IRQ için özel kernel thread | Evet | Modern 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.
İlgili Gömülü Linux soruları
- Linux'ta user space'den GPIO kontrol etmek için sysfs mi libgpiod mu kullanılmalı? Neden?
- 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?
- Cross-compilation nedir? Bir cross toolchain hangi bileşenlerden oluşur ve sysroot ne işe yarar?
- Yocto Project ile Buildroot arasındaki farklar nelerdir? Bir ürün için hangisini seçersiniz?
- 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?
- Device tree nedir, neden kullanılır? .dts, .dtsi, .dtb ve overlay kavramlarını açıklayın.
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.