linux支持中断嵌套吗?了解linux对硬件中断的处理吧!
《linux kerneldevelopment》中有一段话相当经典:
Reentrancy and InterruptHandlers
Interrupt handlers in linux need notbe reentrant.When a given interrupt handler is executing,thecorresponding interruupt line is masked out on all processors,preventing another interrupt on
the same line from beingreceived,Normally all other interrupts are enabled,so otherinterrupts are serviced,but the current line is always disabled.Consequently, the same interrupt interrupt hander is nerver invokedconcurrently to service a nested interrupt.
This greatly simplifieswriting your interruupt handler
意思是:linux中的中断处理程序是无需重入的。当一个给定的中断处理程序正在执行时, 相应的中断线在所有处理器上都会被屏蔽掉,以防止在同一中断线上接收另一个新的中断。 通常情况下,所有其他的中断都是打开的,所以这些不同中断线上的其他中断都能被处理,但当前中断线总是被禁止的。由此可以看出,同一个中断处理程序绝对不会被同时调用以处理嵌套的中断这极大的简化了中断处理程序的编写。
说明:
linux会把处理硬件中断的过程分为两个部分叫做top halves 和Bottom halves上半部分做的工作是时间要求比较紧,操作硬件,或不能被别的中断打断的的重要工作,这时会在所有处理器上屏蔽当前中断线,如果这个中断处理是SA_INTERRUPT标记的,那么所有的本地中断都会全局的被屏蔽掉。下半部分则会恢复响应所有中断,这就使系统处于中断屏蔽状态的时间尽可能的短了,中断响应能力自然也就高了。下半部分完成的工作对时间也不那么敏感,和硬件无关了,可以稍后点执行。
就比如本上有个例子:说的是网卡接收中断处理,上半部分:中断开始,接收,进入中断处理程序,应答网卡,拷贝网络数据包到内存sk_buff,之后就是下半部了。
我个人的理解:当在处理当前中断时,不能再处理相同的中断,但是别的中断还是可以响应的,如果当前中断线上相同中断再来的话就成了死循环。
几天前一个学生问我ARM中断嵌套的问题,我才发现原在我心中理所当然的事对学生来说理解实属不易。
ARM有七种模式,我们这里只讨论SVC、IRQ和FIQ模式。
我们可以假设ARM核心有两根中断引脚(实际上是看不见的),一根叫
irq pin, 一根叫fiq pin.
在ARM的cpsr中,有一个I位和一个F位,分别用来禁止IRQ和FIQ的。
&nbs