Linux 為什么中斷不允許休眠?
所謂的睡眠,就是調(diào)用 schedule 讓出 CPU,調(diào)度器選擇另外個進程繼續(xù)執(zhí)行,這個過程涉及進程棧空間的切換。
1、假如中斷上下文中調(diào)用 schedule ,此時獲取的 struct thread info 數(shù)據(jù)結(jié)構(gòu)是發(fā)生中斷時該進程棧信息,而不是中斷上下文調(diào)用 schedule 時任何信息。這就導致再也無法返回中斷上下文中調(diào)用 schedule 的地方。
2、中斷上下文處于關(guān)中斷中,需要發(fā)送個 EOI 通知 GIC 中斷處理結(jié)束,GIC 和CPUinterface 才會進入下一次中斷處理。如果中途 schedule,那么整個系統(tǒng)的中斷都會被屏蔽掉。
一般進入中斷后,需要關(guān)中斷,也會關(guān)搶占,同時注意不可以調(diào)用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參數(shù)(noirqdebug)來控制開關(guān)該功能。
當發(fā)生了一個中斷,但是沒有被處理(有兩種可能,一種是根本沒有注冊的 specific handler,第二種是有 handler,但是 handler 否認是自己對應的設(shè)備觸發(fā)的中斷),怎么辦?毫無疑問這是一個異常狀況,那么 kernel 是否要立刻采取措施將該 IRQ disable 呢?也不太合適,畢竟 interrupt request 信號線是允許共享的,直接 disable 該 IRQ 有可能會下手太狠,kernel 采取了這樣的策略:如果該 IRQ 觸發(fā)了 100,000 次,但是 99,900 次沒有處理,在這種條件下,我們就是 disable 這個 interrupt request line。
中斷線和中斷號是一個意思。
相關(guān)的控制數(shù)據(jù)在中斷描述符中,如下:
structirq_desc{
……
unsignedintirq_count;--------記錄發(fā)生的中斷的次數(shù),每100,000則回滾
unsignedlonglast_unhandled;-----上一次沒有處理的IRQ的時間點
unsignedintirqs_unhandled;------沒有處理的次數(shù)
……
}
-
cpu
+關(guān)注
關(guān)注
68文章
11015瀏覽量
215374 -
Linux
+關(guān)注
關(guān)注
87文章
11430瀏覽量
212444 -
中斷
+關(guān)注
關(guān)注
5文章
902瀏覽量
42412
發(fā)布評論請先 登錄
為保醫(yī)療質(zhì)量不允許開展互聯(lián)網(wǎng)醫(yī)療診治?
NgdBuild:486不允許屬性“SIM_MODE”
請問SPI不允許在main函數(shù)中對SD卡操作嗎?
電壓互感器二次側(cè)為什么不允許短路
電流互感器與電壓互感器二次側(cè)為什么不允許開路
FreeRTOS的某些內(nèi)容是不允許MDMA讀取內(nèi)存嗎?
不允許32位傳輸?shù)膇.MX 8是否有限制?
網(wǎng)絡(luò)電視不允許直播世界杯?
AVR單片機外部中斷實例及下載燒錄的方法

為什么中性線不允許單獨斷開

評論