中斷是作業系統與硬體互動的核心機制。本文基於 Linux 2.4.0 核心(i386 架構),從 CPU 異常/中斷分類、IDT 結構、8259A PIC 級聯原理、中斷向量分配、中斷門/陷阱門/任務門區別,到核心中斷處理流程、request_irq() 註冊機制、上半部/下半部處理,進行系統性剖析。
| 類別 | 類型 | 來源 | 特徵 |
|---|---|---|---|
| 異步中斷 | 可屏蔽中斷 | 外設 → INTR 腳位 | 可由 IF 標誌關閉 |
| 不可屏蔽中斷 | 硬體故障 → NMI 腳位 | IF 無效,最高優先級 | |
| 同步異常 | 故障 | CPU 偵測到錯誤 | EIP 指向錯誤指令,可重試(如缺頁) |
| 陷阱 | INT 指令、除零 | EIP 指向下一指令,用於除錯/系統呼叫 | |
| 中止 | 嚴重硬體錯誤 | EIP 無意義,通常導致進程終止 | |
| 編程異常 | 軟中斷 | INT n 指令 | 系統呼叫、除錯斷點 |
#define FIRST_EXTERNAL_VECTOR 0x20 // IRQ0 向量
#define SYSCALL_VECTOR 0x80 // 系統呼叫向量
Master (IRQ0–7) Slave (IRQ8–15) IRQ2 ──────────→ INT (級聯)
init_IRQ())IRQn_interrupt 入口(組合語言)do_IRQ()do_IRQ():
irq_desc[irq].action 鏈表handler()(驅動註冊的 ISR)iret
int request_irq(unsigned int irq,
void (*handler)(int, void *, struct pt_regs *),
unsigned long flags,
const char *dev_name,
void *dev_id);
flags:SA_INTERRUPT(快速中斷,關中斷執行)、SA_SHIRQ(共享中斷)、SA_SAMPLE_RANDOM(熵池貢獻)dev_id:共享中斷時識別裝置實例,free_irq() 時必須相同tasklet/softirq/workqueue,中斷開啟時延遲執行,處理耗時工作task_queue、bh;2.6+:softirq/tasklet/workqueueSMP 系統可透過 /proc/irq/N/smp_affinity 設定中斷由哪個 CPU 處理,提升快取命中率。