1

处理器的上半部分可以完成或需要完成的事情是什么?我发现中断首先被禁止,但是当这样做完成后,在处理当前中断时不要错过中断(在同一个IRQ线路上)?Linux中的并行中断处理

还是有人跟踪丢失的中断,以便在ISR结束时启用中断后可以处理这些中断?

回答

2

关于共享中断的一句话:共享中断线应始终使用电平敏感设备,它们应该都是相同的电平(hi和low)。在边沿触发中断的情况下,无法保证在一个器件触发后,但在恢复到稳态之前,其他器件不会触发。它变成了一个无法避免的竞争条件。

另一方面,电平触发的中断一直处于激活状态,直到设备上触发它的标志被清除。在处理第一个设备时,如果第二个设备触发,那么它将等待IRQ线保持激活状态,直到处理程序再次启用IRQ线。

1

中断处理程序应该尽可能小。

并不总是需要禁用中断。一些体系结构与嵌套中断一起工作。无论如何,如果你禁用中断,你应该做一两个命令,而不是更多。这会造成延迟并可能会中断中断。

当我处理中断时,我通常会做两件事情。一种是清除导致中断的标志。第二种是在之后触发某些功能(tasklet,workqueue等)

请注意,在可能睡眠的中断处理程序中不使用任何方法,如printf或获取mutex

2

您应该正确地确认中断以避免IRQ风暴。 处理中断本身 - 如果你有一个大的工作要做,卸载到下半部分。

中断禁用时会发生什么情况:在x86上,cli指令禁用当前运行ISR的CPU上的中断。一个IRQ被缓冲,所以当中断通过sti被恢复时,它被交付。

当使用API​​C中断时,缓冲发生在内核本身。内核确认APIC中断,并在调用enable_irq时再次触发它。