Linux 為什么中斷不允許休眠?
所謂的睡眠,就是調用 schedule 讓出 CPU,調度器選擇另外個進程繼續執行,這個過程涉及進程棧空間的切換。
1、假如中斷上下文中調用 schedule ,此時獲取的 struct thread info 數據結構是發生中斷時該進程棧信息,而不是中斷上下文調用 schedule 時任何信息。這就導致再也無法返回中斷上下文中調用 schedule 的地方。
2、中斷上下文處于關中斷中,需要發送個 EOI 通知 GIC 中斷處理結束,GIC 和CPUinterface 才會進入下一次中斷處理。如果中途 schedule,那么整個系統的中斷都會被屏蔽掉。
一般進入中斷后,需要關中斷,也會關搶占,同時注意不可以調用schedule。
unhandled interrupt 和 spurious interrupt
未處理中斷和虛假中斷
在中斷處理的最后,總會有一段代碼如下:
irqreturn_t
handle_irq_event_percpu(structirq_desc*desc,structirqaction*action)
{
……
if(!noirqdebug)
note_interrupt(irq,desc,retval);
returnretval;
}
note_interrupt就是進行unhandled interrupt和spurious interrupt處理的。對于這類中斷,linux kernel有一套復雜的機制來處理,你可以通過command line參數(noirqdebug)來控制開關該功能。
當發生了一個中斷,但是沒有被處理(有兩種可能,一種是根本沒有注冊的 specific handler,第二種是有 handler,但是 handler 否認是自己對應的設備觸發的中斷),怎么辦?毫無疑問這是一個異常狀況,那么 kernel 是否要立刻采取措施將該 IRQ disable 呢?也不太合適,畢竟 interrupt request 信號線是允許共享的,直接 disable 該 IRQ 有可能會下手太狠,kernel 采取了這樣的策略:如果該 IRQ 觸發了 100,000 次,但是 99,900 次沒有處理,在這種條件下,我們就是 disable 這個 interrupt request line。
中斷線和中斷號是一個意思。
相關的控制數據在中斷描述符中,如下:
structirq_desc{
……
unsignedintirq_count;--------記錄發生的中斷的次數,每100,000則回滾
unsignedlonglast_unhandled;-----上一次沒有處理的IRQ的時間點
unsignedintirqs_unhandled;------沒有處理的次數
……
}
-
cpu
+關注
關注
68文章
10854瀏覽量
211587 -
Linux
+關注
關注
87文章
11292瀏覽量
209332 -
中斷
+關注
關注
5文章
898瀏覽量
41471
發布評論請先 登錄
相關推薦
評論