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

| 條件 | 獨佔 | 共享 |
|---|---|---|
| flags | 0 | SA_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;
}
IRQF_SHARED,否則註冊失敗返回 -EBUSY。SA_INTERRUPT (快速中斷) 與 SA_SHIRQ。
cat /proc/interrupts # 查看共享計數
watch -n1 'cat /proc/interrupts | grep eth0'
遵循三大條件,即可安全實作共享中斷驅動,避免中斷風暴或裝置誤判導致系統掛起。
Linux VPS SSH 安全防護實戰:修改連接埠與禁用 Root 登入
Linux 系統安裝與使用 Trickle 限制應用程式頻寬
Linux 用 rsync 秒刪海量小檔案:--delete-before 參數實戰教學
Linux 丢失 /etc/inittab 导致无法启动:救援模式修复全记录
Linux 7-Zip (p7zip) 完整安裝與使用指南:Debian/Ubuntu/CentOS/Fedora 全平台支援
Linux 使用 clock_gettime 函數獲取奈秒級精確時間測量程式效能