Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux 中斷子系統架構與處理流程全景分析

編輯:Linux 系統常見問題解答

硬件層:GIC / 舊版中斷控制器寄存器

以 ARM Cortex-A9/A15 的 GIC-400 為例(早期 GIC-390/PL190 類似):

GIC 邏輯圖

  • 外部中斷:EXTINT0-2 配置觸發模式(電平/邊沿),EINTPEND 掛起寄存器(寫 1 清除),EINTMASK 屏蔽。
  • 內部中斷:SUBSRCPND/INTSUBMSK(子源),SRCPND/INTMSK(主源),INTMOD 選擇 IRQ/FIQ,PRIORITY 優先級,INTPND 仲裁後最高優先級中斷,INTOFFSET 記錄其位號。

軟件抽象三層架構

中斷數據結構關系

  1. High-level ISR:驅動註冊的 irqaction->handler,處理設備具體邏輯。
  2. Interrupt Flow Handling:handle_irq 入口,根據中斷類型調度 handle_level_irq/handle_edge_irq 等,控制 mask/ack/end 流程。
  3. Chip-Level Hardware Encapsulation:irq_chip(舊 hw_interrupt_type),封裝 mask/unmask/ack/set_type 等寄存器操作。

核心數據結構

  • irq_desc[NR_IRQS]:全局描述符數組,每中斷源一個。包含 irq_data(硬件屬性)、handle_irq(流程入口)、irq_chip(芯片操作)、action 鏈表(共享中斷)。
  • irqaction:設備中斷描述符,handler、dev_id(共享中斷區分設備)、next 鏈接下一個共享動作。

中斷處理流程

流程圖1 流程圖2 流程圖3

  1. CPU 接收 IRQ → asm_do_IRQ 保存現場。
  2. handle_irq(desc) → generic_handle_irq_desc → desc->handle_irq(如 handle_level_irq)。
  3. Flow handler:
    handle_level_irq:mask → ack → 處理 → unmask(防電平重入)。
    handle_edge_irq:ack → 處理(邊沿不需 mask)。
  4. handle_irq_event 遍歷 action 鏈表調用各 handler(dev_id)。共享中斷時每個 handler 必須自行判斷中斷源(讀設備狀態寄存器),非本設備立即返回 IRQ_NONE。
  5. 返回 IRQ_HANDLED/IRQ_NONE,flow handler 執行 end 回調,恢復 CPU 現場。

多核與共享中斷注意點

  • irqd_irq_inprogress() 檢測 IRQD_IRQ_INPROGRESS 避免並發處理同一中斷。
  • 共享中斷不可單獨 disable/enable,會影響同線其他設備。
  • 內核不傳遞 dev_id 給硬件,純軟件約定,驅動必須輪詢設備狀態確認歸屬。
Copyright © Windows教程網 All Rights Reserved