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