Linux内核支持Nested interrupt,但是不支持reentrant interrupt。处理某一中断时,同类型的中断在所有CPU上被禁止,因此ISR不必设计成可重入的。但是新的其它类型的中断可以打断正在处理的中断,这就是中断嵌套,isr需要支持nested interrupt。
中断相关的API
local_irq_disable() 禁止本地中断
local_irq_enable() 激活本地中断
local_irq_save() 保存本地中断的当前状态,然后禁止本地中断
local_irq_restore() 恢复本地中断到给定的状态。
disable_irq() 禁止给定中断,并且保证函数返回时,该中断的ISR运行完毕。
disable_irq_nosync() 禁止给定中断
enable_irq() 激活给定中断
irqs_disable() 本地中断是否被禁止
in_interrupt() 是否在中断上下文(包括软中断)
in_irq() 内核是否在执行中断处理程序
Linux Kernel Development
Linux中的中断处理程序是无需重入的,当一个给定的中断处理程序正在执行时,相应的中断在所有处理器上都会被屏蔽掉,以防止在同一中断线上接收另一个新的中断。通常情况下,所有其它的中断是打开的,所以这些不同中断线上的其它中断都能被处理。
曾经,中断处理程序没有自己的栈,使用被中断的进程的栈,后来进程栈大小从2个page,减小到1个page,即4K。为了应对进程栈减小,中断有了自己的栈,大小为1页。