Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux 共享中斷處理技巧:request_irq SA_SHIRQ、dev_id 唯一性、硬體支援與處理程式判斷邏輯

編輯:關於 Linux

PCI 總線裝置常共享中斷線 (IRQ),核心透過 request_irq() 建立中斷處理鏈表。本文詳述共享中斷的三大強制條件:SA_SHIRQ 標誌、dev_id 唯一性、硬體可區分中斷來源,並說明驅動程式如何在處理函式中判斷「是否為我的中斷」。

共享中斷鏈表

共享中斷 vs 獨佔中斷 差異

條件獨佔共享
flags0SA_SHIRQ (舊) / IRQF_SHARED (新)
dev_id可為 NULL必須唯一 (通常傳 &dev 結構體指標)
硬體需求無裝置需提供「中斷狀態暫存器」供驅動讀取判斷

驅動程式實作要點


// 註冊
request_irq(irq, my_isr, IRQF_SHARED, "mydev", &my_dev);

// 中斷處理函式
irqreturn_t my_isr(int irq, void *dev_id) {
    struct my_dev *dev = (struct my_dev *)dev_id;

    // 1. 讀取硬體中斷狀態暫存器
    u32 status = readl(dev->regs + INT_STATUS);

    // 2. 判斷是否為本裝置產生的中斷
    if (!(status & MY_INT_MASK))
        return IRQ_NONE;   // 非我中斷,讓鏈表下一個處理

    // 3. 清除中斷 (硬體要求)
    writel(MY_INT_MASK, dev->regs + INT_CLEAR);

    // 4. 處理實際工作 (可排程 tasklet/workqueue)
    tasklet_schedule(&dev->tasklet);

    return IRQ_HANDLED;
}

核心註冊邏輯 (kernel/irq/manage.c)

  • 若 IRQ 線未被註冊 → 直接掛載。
  • 若已有處理器,檢查所有現有處理器是否皆設定 IRQF_SHARED,否則註冊失敗返回 -EBUSY。
  • 2.6 核心後允許共享處理器混用 SA_INTERRUPT (快速中斷) 與 SA_SHIRQ。

除錯技巧


cat /proc/interrupts       # 查看共享計數
watch -n1 'cat /proc/interrupts | grep eth0'

遵循三大條件,即可安全實作共享中斷驅動,避免中斷風暴或裝置誤判導致系統掛起。

Copyright © Windows教程網 All Rights Reserved