12

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

如果该处理器具有多个 CPU,则中断可以同时在不同的 cpu 内核上运行。

4

2 回答 2

10

中断信号总是有层次结构的。最高优先级是 CPU 最先看到并采取行动的。完成后,将处理下一个最高优先级的中断。有可能之后第三个比前两个优先级更高的中断信号已经到来,所以会乱序处理,这就是优先级

Linux 支持中断关联,因此一个 IRQ 总是被路由到一个特定的 CPU 或一组 CPU。戳进来/proc/interrupts

于 2014-03-25T20:56:08.487 回答
7

当处理器响应中断时,中断处理的某些敏感阶段受到保护,不会被另一个中断中断。但是,一般而言,中断处理程序的大部分执行本身是可中断的,这意味着可以暂停处理程序的执行以接受另一个中断,其处理程序必须在原始处理程序之前运行完成(返回)重新启动:中断嵌套。

通常有一个优先级方案:某些中断可以中断某些其他中断的处理程序,而其他中断则被阻塞。(从历史上看,有很多方案:从固定的数字优先级到完全灵活的掩码。)通常在其自己的处理程序执行时阻塞同一个中断是有意义的;但这在某些情况下不起作用(例如物理中断线或在多个设备之间共享的中断号)。

当同时提出两个中断请求并且都未屏蔽时,给定的处理器只能响应其中一个。从历史上看,这是由一些硬件(可能称为“中断控制器”)处理的,该硬件多路复用中断线并根据某种优先级方案(可能是可编程的或固定的)决定哪个中断通过。不能同时服务两个中断:服务中断操作的至少某些关键部分必须串行化:CPU 确认中断并调度处理程序的部分。在某些时候,CPU 可以准备好处理另一个未决的中断。

在一些实时操作系统中,中断被分配给实时线程。当收到中断时,内核调度与该中断对应的线程;然后线程为它服务。一旦线程被调度,系统就准备好处理下一个中断,它将调度另一个线程,依此类推。线程是有优先级的,所以如果一个较高优先级的中断调度一个较高优先级的线程,它将抢占一个较低优先级的中断的较低优先级的线程。在这种系统中,如果只有一个处理器,仍然不会同时处理中断:它只是抢占式多任务处理。

对于多个处理器或内核,可以在不同的内核上独立执行中断服务例程。某些中断只能在特定的内核上执行,因为它们与内核有关:例如,一个中断告诉处理器它有来自另一个处理器的重要消息,或者完全在本地生成的东西,例如本地可编程中断计时器绑定到一个特定的核心。可以对特定于设备的中断进行编程,使其转到特定的 CPU 或以某种方式定向到任意 CPU。这都是非常特定于硬件的:细节取决于系统的设计方式。可能有一个系统,其中所有外部中断都在硬件级别绑定到一个特定的处理器,Linux 可以支持这样的系统。

于 2014-03-26T01:42:06.917 回答