中断嵌套
linux2.4.0內(nèi)核中斷嵌套處理,可能性分析如下:
1,同一中斷線:是否可嵌套,取決于ack是否發(fā)屏蔽中斷線信號給硬件?
可嵌套中斷:
場景:[cpu0 A進程 i ii] [cpu1 B進程] ,先i中斷執(zhí)行后執(zhí)行ii。若有iii,同理。
兩中斷(i及ii)被中斷控制器分配到同一核cpu0處理,此時使用的堆棧空間均為A的
i ii中斷嵌套處理使用邊緣觸發(fā)方式,即i在可中斷環(huán)境 handle_IRQ_event中處理未返回,ii中斷進入do_IRQ流程,發(fā)現(xiàn)此時i未完成(簡單這樣理解),不做handle_IRQ_event處理即刻返回,多嵌套同理。返回i中斷處理時,判斷當前中斷線是否有pending,因該場景pending者ii,為保證所有中斷都得到處理機會,會觸發(fā)再遍歷處理一次,ii得以處理。
場景:[cpu0 A進程 i] [cpu1 B進程 ii]
兩中斷(i及ii)分別被中斷控制器分配到cpu0 cpu1中處理 此時各自使用命中進程的堆棧空間,此時無中斷嵌套。
不可嵌套中斷:
在進入do_IRQ時便ack屏蔽了該中斷線,使得同一中斷線上中斷無法嵌套。
場景:[cpu0 A進程 i ii] [cpu1 B進程]
嚴格串行化處理
場景:[cpu0 A進程 i] [cpu1 B進程 ii]
處理等同于可嵌套中斷的場景:[cpu0 A進程 i] [cpu1 B進程 ii]
2,混合中斷線:不同中斷線定是可以中斷嵌套的
若同線可嵌套:
場景:[cpu0 A進程 i ii iii] [cpu1 B進程],其中:i ii iii同線。
i 先中斷 后ii中斷嵌套 又i與iii中斷嵌套
iii可邊緣觸發(fā)對本端cpu0 ii(未處理直接返回了)的處理。
場景:[cpu0 A進程 i ii iii] [cpu1 B進程 iiii],其中:i ii iiii同線。
i 先中斷 后ii中斷嵌套 又i與iii中斷嵌套
iiii可邊緣觸發(fā)對對端cpu0 ii(未處理直接返回了)的處理。
若同線不可嵌套:
場景:[cpu0 A進程 i ii iii] [cpu1 B進程 iiii],其中:i iii iiii同線
i 先中斷 后ii中斷嵌套 又ii與iii中斷嵌套 iiii最后中斷。
iiii可邊緣觸發(fā)對iii(未處理直接返回了)的處理。
無所謂對本端cpu中斷的邊緣觸發(fā)
linux2.4.0 vs linux2.6.37(其實2.6以上基本相同了)
1>、后者只允許不同線的嵌套中斷,在檢測到來自同一中斷線的中斷時會發(fā)送ack屏蔽該中斷線,前者若不管是相同中斷線還是不同中斷線都允許中斷嵌套。引出問題:若存在256中斷號,則對于后者來說,極端情況也就被中斷嵌套255次,而前者會是無限次。
2>、前者中斷處理占用命中進程的堆棧空間,后者在中斷處理時有堆棧環(huán)境的切換動作,有獨立的中斷棧。問題:中斷多時前者會出現(xiàn)堆棧溢出。
總結(jié)
- 上一篇: 时间间隔频率计数器及其主要参数
- 下一篇: pytorch 调参