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 核心中斷機制深度分析:從 IDT 到裝置驅動 ISR

編輯:Linux 教學

中斷是作業系統與硬體互動的核心機制。本文基於 Linux 2.4.0 核心(i386 架構),從 CPU 異常/中斷分類、IDT 結構、8259A PIC 級聯原理、中斷向量分配、中斷門/陷阱門/任務門區別,到核心中斷處理流程、request_irq() 註冊機制、上半部/下半部處理,進行系統性剖析。

一、中斷與異常分類

類別類型來源特徵
異步中斷可屏蔽中斷外設 → INTR 腳位可由 IF 標誌關閉
不可屏蔽中斷硬體故障 → NMI 腳位IF 無效,最高優先級
同步異常故障CPU 偵測到錯誤EIP 指向錯誤指令,可重試(如缺頁)
陷阱INT 指令、除零EIP 指向下一指令,用於除錯/系統呼叫
中止嚴重硬體錯誤EIP 無意義,通常導致進程終止
編程異常軟中斷INT n 指令系統呼叫、除錯斷點

二、i386 中斷向量分配

  • 0–31:異常與 NMI(固定)
  • 32–47:可屏蔽中斷(IRQ 0–15,對應雙 8259A)
  • 48–255:軟中斷(Linux 僅用 0x80 系統呼叫)

#define FIRST_EXTERNAL_VECTOR 0x20  // IRQ0 向量
#define SYSCALL_VECTOR 0x80         // 系統呼叫向量

三、IDT(中斷描述符表)

  • 256 項,每項 8 bytes(64 bits)
  • 四種描述符:任務門、中斷門、陷阱門、呼叫門
  • Linux 僅使用中斷門(硬體中斷,自動關 IF)與陷阱門(系統呼叫,不關 IF)

四、8259A PIC 級聯原理

Master (IRQ0–7)          Slave (IRQ8–15)
   IRQ2  ──────────→  INT (級聯)
  • Master IRQ2 接 Slave INT,共 15 可用 IRQ
  • 核心初始化時重新映射向量(init_IRQ())
  • EOI (End of Interrupt) 需對 Master/Slave 分別發送

五、核心中斷處理流程

  1. CPU 依向量查 IDT,跳轉至對應 IRQn_interrupt 入口(組合語言)
  2. 保存暫存器、呼叫 do_IRQ()
  3. do_IRQ():
    • acknowledge PIC
    • 查找 irq_desc[irq].action 鏈表
    • 遍歷呼叫每個 handler()(驅動註冊的 ISR)
    • 處理共享中斷、屏蔽/解除屏蔽
  4. 返回組合語言出口,恢復暫存器、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() 時必須相同

七、上半部/下半部機制

  • 上半部:ISR 本體,中斷關閉期間執行,越快越好
  • 下半部:tasklet/softirq/workqueue,中斷開啟時延遲執行,處理耗時工作
  • 2.4 核心:task_queue、bh;2.6+:softirq/tasklet/workqueue

八、中斷親和性與 SMP

SMP 系統可透過 /proc/irq/N/smp_affinity 設定中斷由哪個 CPU 處理,提升快取命中率。

Copyright © Windows教程網 All Rights Reserved