目前正在除錯msix
中斷,在測試過程中發現會概率性的丟失中斷。msix中斷預設是
edge
觸發的中斷,
edge
觸發的中斷是在中斷對應
pin發生電平訊號跳變的時候,會發出乙個中斷請求。因為跳變是一瞬間的,不會像
level
觸發中斷那樣一直保持電平不變,這樣就可能會漏掉某乙個跳變的瞬間,表現就是丟失了乙個中斷。
核心中處理edge
觸發中斷的函式為handle_edge_irq,此函式有do_irq
函式呼叫而來。
void
handle_edge_irq
(unsigned int
irq,
struct
irq_desc *
desc)
} kstat_incr_irqs_this_cpu
(irq
, desc
);/*process/interrupts中對應
irq計算加
1*//*cpu對此
irq的回應,表示準備接收此
irq的下乙個中斷
*/desc
->irq_data.chip->irq_ack(&
desc
->irq_data
); do
/*irq處於中斷掛起狀態*/
if(unlikely
(desc
->istate &
irqs_pending))
/*處理中斷
*/handle_irq_event
(desc);
}while
((desc
->istate &
irqs_pending
) &&
/*有掛起的中斷需要處理*/!
irqd_irq_disabled(&
desc
->irq_data
));/*irq沒有禁止
*/istate成員剛開始在irq_desc結構體中沒找到,其實它的定義如下
#define istate core_internal_state__do_not_mess_with_it
istate對應的是
core_internal_state__do_not_mess_with_it
成員。
irqs_replay標誌是用來挽救丟失的中斷。此標誌在check_irq_resend
函式中設定
,通過中斷控制器apic上的中斷訊號重新向cpu發中斷,而不是通過外設硬體來重發中斷。這裡進入到了
handle_edge_irq
函式表示已經收到了中斷,不需要重發,所以清除此標誌。
irqs_waiting標誌表示中斷的到來,這裡收到了中斷,因此也清除此標誌。此標誌在handle_
***_irq
函式的開始都會清除掉。
如果<1>
當前irq
被禁止,<2>
當前irq
正在處理中
,<3>
當前irq
沒有掛接處理函式
,則我們不處理接收到的此irq
。如果滿足上面的條件,我們就設定此
irq為irqs_pending掛起狀態,並遮蔽中斷,然後返回。放棄中斷的處理過程,留給正在處理此irq
中斷的cpu
來處理此次
pending
的中斷。
irq_ack函式的底層實現是寫eoi
暫存器,是
cpu對此
irq的回應,表示
irq希望清除此
irq的
pending
狀態(用於清除
apic irr
的pending
位),準備接收下乙個中斷。這樣其他的
cpu就可以接收此
irq進行處理了。
程式接下來是乙個while
迴圈,迴圈的條件是
此irq
沒有被禁止並且有
pending
的待處理的中斷
。因為在處理中斷的過程中,因為ack
了,可能其他的
cpu又接收到了此
irq新的中斷。
如果此irq
沒有掛接中斷處理函式,就直接遮蔽此
irq,返回。
如果irq
處於irqs_pending狀態,中斷沒有被禁止但是被遮蔽的情況下,呼叫unmask_irq取消遮蔽。想想為什麼會處於irqs_pending狀態,並這樣處理?前面講到當此irq
正在處理中,新接收到的中斷,就會設定irqs_pending狀態,並遮蔽此irq。
edge觸發方式的中斷容易丟中斷,因此在處理中斷時候不能長時間的遮蔽
irq。在handle_edge_irq函式一上來就判斷在irq
沒用被禁止,沒用正在處理的情況下,只是
ack回應了硬體,沒用遮蔽
irq,表示另外的
cpu可以接收此
irq的中斷。
ARM Linux 中斷分析
在具體的 arm 晶元中會有很多的中斷型別,每一種型別的中斷用以上結構來表示 struct irqdesc irq desc nr irqs nr irqs 根據不同的 mcu 會有所區別 在通過request irq 函式註冊中斷服務程式的時候,將會把中斷向量和中斷服務程式對應起來。我們來看一下 ...
中斷分析(五)
中斷分析 五 初始化中斷描述符表的具體實現 一 中斷描述符表的預初始化 用256個指向ignore int中斷門的入口位址填充中斷描述符表。它不是真正的初始化idt,等到分頁和核心跳轉到page offset處時才真正的進行初始化。確定所有相關的準備都已就緒之後,中斷可以在任何地方發生。setup ...
中斷型別分析
ibm公司的機器,通常把中斷源分為6類 1 重新啟動中斷 這是為操作人員重新啟動乙個重新用的,在一般情況下,處理機不能禁止這類中斷。2 機器檢驗錯中斷 當發生硬體或軟體故障時發生機器校驗錯中斷。用乙個64位的機器檢驗中斷碼儲存中斷的原因及其嚴重程度。在機器的檢驗儲存區中還儲存有更加詳細的中斷原因和故...