中斷與異常是 CPU 響應非同步/同步事件的核心機制,Linux 核心通過中斷描述符表(IDT)統一管理 256 個向量,實現設備驅動、系統調用、錯誤處理等關鍵功能。
| 特性 | 中斷(外部中斷) | 異常(內部中斷) |
|---|---|---|
| 來源 | 外部硬體設備(網卡、磁碟、鍵盤等) | CPU 內部執行指令時檢測到的異常狀態 |
| 觸發時機 | 非同步,隨時可能發生 | 同步,由當前指令直接導致 |
| 可屏蔽性 | 可屏蔽中斷(INTR)、不可屏蔽中斷(NMI) | 不可屏蔽,不經中斷控制器 |
| 典型用途 | I/O 完成通知、定時器、設備熱插拔 | 缺頁、除零、調試斷點、系統調用(int 0x80/syscall) |
| 分類 | — | 故障、陷阱、終止 |
x86 架構支援 256 個中斷向量(0~255),每個向量佔用 IDT 中一個 8 字節的門描述符。Linux 分配如下:
int 0x80 系統調用入口;其餘保留或供 KVM、Xen 等虛擬化用途。實模式使用 4 字節的中斷向量表(IVT),保護模式擴展為 8 字節的 中斷描述符表(IDT),每項為 門描述符,包含段選擇子、偏移量、DPL(特權級)、類型碼等字段。門描述符三大類型:
IF 位(屏蔽可屏蔽中斷),用於大多數硬體中斷 ISR。IF,允許嵌套中斷,用於系統調用、調試斷點。int 0x80 進入核心,現代系統改用 syscall/sysret 或 sysenter/sysexit。IF、當前特權級。entry_INTERRUPT),核心通用入口保存寄存器,調用 do_IRQ() → 具體驅動 handler。iret 返回,恢復被打斷上下文。現代核心採用 線程化中斷(IRQF_ONESHOT + request_threaded_irq),將耗時處理移至內核線程,降低中斷上下文延遲,提升實時性。