Linux 為什么中斷不允許休眠?
所謂的睡眠,就是調(diào)用 schedule 讓出 CPU,調(diào)度器選擇另外個(gè)進(jìn)程繼續(xù)執(zhí)行,這個(gè)過程涉及進(jìn)程棧空間的切換。
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 才會進(jìn)入下一次中斷處理。如果中途 schedule,那么整個(gè)系統(tǒng)的中斷都會被屏蔽掉。
一般進(jìn)入中斷后,需要關(guān)中斷,也會關(guān)搶占,同時(shí)注意不可以調(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就是進(jìn)行unhandled interrupt和spurious interrupt處理的。對于這類中斷,linux kernel有一套復(fù)雜的機(jī)制來處理,你可以通過command line參數(shù)(noirqdebug)來控制開關(guān)該功能。
當(dāng)發(fā)生了一個(gè)中斷,但是沒有被處理(有兩種可能,一種是根本沒有注冊的 specific handler,第二種是有 handler,但是 handler 否認(rèn)是自己對應(yīng)的設(shè)備觸發(fā)的中斷),怎么辦?毫無疑問這是一個(gè)異常狀況,那么 kernel 是否要立刻采取措施將該 IRQ disable 呢?也不太合適,畢竟 interrupt request 信號線是允許共享的,直接 disable 該 IRQ 有可能會下手太狠,kernel 采取了這樣的策略:如果該 IRQ 觸發(fā)了 100,000 次,但是 99,900 次沒有處理,在這種條件下,我們就是 disable 這個(gè) interrupt request line。
中斷線和中斷號是一個(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文章
10905瀏覽量
213035 -
Linux
+關(guān)注
關(guān)注
87文章
11345瀏覽量
210418 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41760
發(fā)布評論請先 登錄
相關(guān)推薦
為保醫(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單片機(jī)外部中斷實(shí)例及下載燒錄的方法
![AVR單片機(jī)外部<b class='flag-5'>中斷</b>實(shí)例及下載燒錄的方法](https://file.elecfans.com/web1/M00/8D/A8/o4YBAFysRcWAHSjaAADI552Giic618.png)
為什么中性線不允許單獨(dú)斷開
![為什么中性線<b class='flag-5'>不允許</b>單獨(dú)斷開](https://file.elecfans.com/web1/M00/B1/BE/pIYBAF38er2ADTdtAABtDLLjELY117.jpg)
評論