中斷為何會丟失

2021-06-18 07:10:19 字數 2431 閱讀 2000

正在讀ulk3,第四章中斷中關於__do_irq()的**中涉及中斷丟失的部分有點迷惑。**如下:

spin_lock(&(irq_desc[irq].lock));

irq_desc[irq].handler->ack(irq);

irq_desc[irq].status &= ~(irq_replay | irq_waiting);

irq_desc[irq].status |= irq_pending;

if (!(irq_desc[irq].status & (irq_disabled | irq_inprogress))

&& irq_desc[irq].action) while (irq_desc[irq].status & irq_pending);

irq_desc[irq].status &= ~irq_inprogress;

}irq_desc[irq].handler->end(irq);

spin_unlock(&(irq_desc[irq].lock));

複製**

按照我對ulk3的理解,假設有兩個cpu分別稱為a和b。b正在執行中斷服務程式handle_irq_event(),此時同型別的中斷在a上發生,那麼a將進入__do_irq()執行上面的**片段。如果在a確認中斷之前,b執行了disable_irq()遮蔽了irq線並置irq_disabled標誌,那麼a執行到第5行時由於irq_disabled標誌置位,a直接從__do_irq()返回,這就是中斷的丟失。我有兩個地方不明白:

1. 這裡ulk3為什麼要強調在a確認中斷之前?難道確認中斷之後就不會丟失中斷嗎?

2. 這種情況下,中斷真的會丟失嗎?a在進入do_irq()函式之後,在第三行將irq_pending置位了,所以雖然a從do_irq()返回,但b在執行完handle_irq_event()後迴圈條件成立(irq_pending置位),所以仍然會再次呼叫handle_irq_event來處理,所以我覺得這裡中斷不會丟失呀。

當中斷處理期間同乙個cpu上同型別的中斷不會再次發生。但是其他cpu上的同型別中斷卻會再次發生,這也是中斷丟失的必要條件。我不理解的是中斷如何丟失,**中的那個迴圈應該可以保證不會丟失中斷的。

> 1. 這裡ulk3為什麼要強調在a確認中斷之前?難道確認中斷之後就不會丟失中斷嗎?

a確認中斷時,已經獲得了irq_desc[irq].lock,而disable_irq必須也要獲取到該鎖,所以,當a確認中斷之後,b已經沒有機會disable_irq了,必須要等到a執行完之後,才可以;

> 2. 這種情況下,中斷真的會丟失嗎?a在進入do_irq()函式之後,在第三行將irq_pending置位了,所以雖然a從do_irq()返回,但b在執行完handle_irq_event()後迴圈條件成立(irq_pending置位),所以仍然會再次呼叫handle_irq_event來處理,所以我覺得這裡中斷不會丟失呀。

英文版上說的是「a hardware device raises the irq line, and the multi-apic system selects our cpu for handling the interrupt. before the cpu acknowledges the interrupt,the irq line is masked out by another cpu;」,這裡很微妙,是的你說的很對,do_irq()本身可以確保中斷不丟失,但是為什麼disable_irq不能被核心的其他函式呼叫呢?如果那裡只是單純的成對使用disable_irq和enable_irq,那就會有中斷丟失了,不是嗎?呵呵,這裡說的不清楚,只是說明了by another cpu, 而沒有說by another cpu who's  not executing __do_irq().

> 首先,外部中斷源能否在上一次中斷未被處理的情況下,再一次發出中斷訊號,是個問題;

這可能與中斷控制器有關,我記得8259a可以通過程式設計使它在前乙個中斷沒有確認的情況下不會接受同型別的下乙個中斷。此時,對應的irq線和裝置都無法繼續。我也一直有個問題:pic是如何阻塞乙個裝置的,pic是否也需要對裝置做確認?

> 其次,即使可以,那是否可以多次中斷,一次處理呢?只記錄了pending的狀態,而沒有記錄pending的》 次數,所以只會而且一定會呼叫一次isr。一般的情況都好理解,假設網絡卡收到乙個包,發出中斷,並把包》 存放在某處,繼續接受下乙個包,接收到之後,有發出中斷。。。這樣,呼叫isr的時候,只需要去存包的》 地方取包就可以了,pending的包都可以取到。

> 我疑惑的是時鐘中斷丟失的情形,但是查資料發現,6.4.1 找回遺失的時鐘中斷》說明,對於需要特殊處理的中斷,核心是考慮到並》 做了處理的。

是的,網絡卡的例子應該適用許多裝置對資料處理的情況,因為資料都是被緩衝的。而時間流逝過去就無法找回來,所以核心對它特別關照了。不論何種裝置,辦法似乎不是在從核心中斷機制本身防止中斷丟失,而是依靠具體的中斷服務例程的補充。例如,時鐘中斷與tsc比照來做修正。網絡卡乙個收多個包也可以認為是一種修正。

linux中斷巢狀以及中斷丟失

在linux核心裡,如果驅動在申請註冊中斷的時候沒有特別的指定,do irq在做中斷響應的時候,是開啟中斷的,如果在驅動的中斷處理函式正在執行的過程中,出現同一裝置的中斷或者不同裝置的中斷,這時候新的中斷會被立即處理,還是被pending,等當前中斷處理完成後,再做處理。在2.4和2.6核心裡,關於...

linux中斷巢狀以及中斷丟失

在linux核心裡,如果驅動在申請註冊中斷的時候沒有特別的指定,do irq在做中斷響應的時候,是開啟中斷的,如果在驅動的中斷處理函式正在執行的過程中,出現同一裝置的中斷或者不同裝置的中斷,這時候新的中斷會被立即處理,還是被pending,等當前中斷處理完成後,再做處理。在2.4和2.6核心裡,關於...

ls會丟失檔案嗎?

在unix linux下,ls是乙個簡單的基本命令,它可以顯示某個目錄下的檔案列表,如果不指定特定目錄的話,它將顯示當前路徑下的檔案列表。那麼,ls是可靠的嗎?不,當然不是,有些檔案它不會列舉出來。你可能會這樣說。不錯,在shell命令列上簡單的打ls,有一些檔案我們是看不到的 那就是隱藏檔案。和w...