1. irq_desc陣列
kernel/irq/irqdesc.c
struct irq_desc irq_desc[nr_irqs] __cacheline_aligned_in_smp =
};每乙個中斷號(或者叫一條中斷線),對應乙個陣列元素。
不同裝置,可能共用同乙個中斷號
2. 中斷到來後,cpu會根據中斷號,找到相應的中斷門,進而跳到對應的中斷處理例程執行。這個過程完全由硬體完成。
當然,中斷門已由os在啟動時做了妥善的初始化。
3. 所有的中斷處理例程,均獲取並儲存一下中斷號(當然還有別的一些系統方面的工作),然後執行do_irq。
do_irq再呼叫handle_irq
handle_irq根據中斷號,索引到irq_desc中的對應元素desc,然後呼叫desc->handle_irq完成中斷處理。
desc->handle_irq可能是如下的一些函式
handle_level_irq
handle_edge_irq
當然,也可能是別的函式,反正我沒有理全。
這些函式,最終會呼叫handle_irq_event,進而進入handle_irq_event_percpu。
後者,會遍歷desc->action指向的乙個struct irqaction型別的鍊錶(每乙個共享此同一中斷線的裝置對應乙個action),嘗試呼叫其handler完成中斷的處理。
Linux中斷處理
裝置管理過程中,中斷號的申請是乙個非常重要的操作。當裝置發出中斷之後,硬體裝置根據intel cpu的通用處理過程,跳轉到了該中斷號對應的中斷相應函式處。在linux作業系統中,必定要跳到do irq函式處。在do irq 函式中,進行了一部分公共的中斷響應處理之後,根據已經入棧了的中斷號查詢裝置中...
Linux中斷和中斷處理
眾所周知,處理器的速度跟外圍的硬體裝置的速度往往不在乙個數量級上,因此,如果核心採取讓處理器傳送乙個請求,然後專門等待回應的辦法,顯然差強人意。既然硬體處理的這麼慢,那麼核心就應該在這期間去處理其他事務,等待硬體真正完成了請求的操作後,再回過頭來對它進行處理。輪詢 polling 可能會是一種解決辦...
Linux中斷處理之共享中斷處理初探
在看lkd 第二版 第六章 中斷和中斷處理程式 的時候,剛開始接觸到中斷線號和共享中斷線的時候半天愣是沒有想明白,原來理解的中斷和中斷和中斷處理程式就是通過中斷線號來進行關聯,硬體發生中斷,然後通過中斷線號查詢對應的中斷處理程式,最後中斷處理程式返回,此次中斷則處理完畢,沒想到冒出來個共享中斷線,呵...