当两个中断同时发生在Linux内核中会发生什么?

12

当两个中断同时发生在Linux内核中会发生什么情况?

如果处理器有多个CPU,这些中断可以同时运行在不同的CPU核心上。

2个回答

10

中断信号总是有优先级的。CPU首先处理最高优先级的中断信号,然后再处理下一个最高优先级的中断信号。可能会出现其他更高优先级的第三个中断信号已到达,因此它将按顺序处理,这就是“优先级”的含义。

Linux支持中断亲和力,以便将一个IRQ始终路由到特定的CPU或一组CPU。在/proc/interrupts中查找相关信息。


1
非常感谢您的输入。但是我不明白如何设置中断的优先级,因为在request_irq()中我们没有设置任何关于优先级的标志。 - Adi
我正在学习内核和设备驱动程序编程,你能推荐一些好的读物吗? - Adi
1
@Phineas:IRQ优先级由硬件确定。对于x86处理器,IRQ0最高,IRQ1次之,依此类推。 - wallyk
如果第一个信号处理程序调用系统调用,那么第二个信号处理程序可以中断第一个信号处理程序。 - suzuiyue

7
当处理器响应中断时,受保护的中断处理敏感阶段会受到其他中断的干扰。一般情况下,中断处理程序的大部分执行过程本身是可中断的,这意味着中断处理程序的执行可能会被暂停以便接收另一个中断,其处理程序必须在原始处理程序重新启动之前运行完成(返回):中断嵌套。
通常有一个优先级方案:特定的中断可以中断特定其他中断的处理程序,而其他中断则被阻止。 (从历史上看,有许多方案:从固定数字优先级到完全灵活的掩码。)通常,在其自己的处理程序执行期间阻止同一中断是有意义的;但是在某些情况下(例如,物理中断线路或中断号被多个设备共享),这种方法无效。
当同时引发两个未屏蔽的中断请求时,给定的处理器只能响应其中一个。从历史上看,这通过某些硬件(可能称为“中断控制器”)来处理,该硬件复用中断线并根据某种优先级方案(可能是可编程的,也可能是固定的)做出关于哪个中断可通过的决策。不能同时服务两个中断:服务中断的关键部分至少需要串行化:处理器确认中断并调度处理程序的部分。在某个时刻,CPU可以准备好处理其余挂起的中断。
在一些实时操作系统中,中断被分配给实时线程。当接收到中断时,内核会调度与该中断相应的线程;然后线程会对其进行服务。一旦调度了线程,系统就准备好接受下一个中断,它将调度另一个线程,依此类推。线程被优先级排序,因此如果较高优先级的中断调度了较高优先级的线程,则会抢占较低优先级中断的低优先级线程。在这种系统中,如果只有一个处理器,则仍未同时处理中断:这仅仅是抢占式多任务处理。
在多个处理器或核心上,可以在不同核心上独立执行中断服务例程。某些中断只能在特定的核心上执行,因为它们涉及到核心:例如告诉处理器它有来自另一个处理器的重要消息的中断,或者完全本地生成的东西,例如与特定核心绑定的本地可编程中断计时器。设备特定的中断可以编程为转到特定的CPU或以某种方式被指示到任意CPU。这是非常硬件特定的:细节取决于系统的设计。可能有一个系统,其中所有外部中断都与某个特定处理器绑定在硬件级别,并且Linux可以支持这样的系统。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接