为什么我们在一个系统中有多个中断处理程序而不是一个?

Why do we have multiple Interrupt Handlers in a system rather than just one?

在操作系统的内核中,我们有一个中断 table,它包含许多处理来自 I/O 设备和进程的中断的中断处理程序。但是为什么我们不能只有一个中断处理程序呢?中断处理程序彼此之间有什么不同吗?

如果您有一个中断处理程序,则应在 代码 中而不是在 硬件 中决定如何处理中断。

而且有很多东西可以触发中断 - 因此代码几乎肯定会降低整体性能。

原则上,没有理由不为所有中断调用一个中断处理程序。这样的处理程序必须检查每个中断源。由于大多数时间只有一小部分可能的中断源处于活动状态,因此许多周期会浪费在检查触发了哪个中断上。由于 ISR 例程通常是非常频繁调用的代码,因此您的性能会受到很大(可能无法接受)的影响。

特定中断控制器处理中断的方式可能会有很大差异。要获得非常扎实的理解,您必须阅读各种不同体系结构中断控制器实现的手册。

但是,一些中断控制器最终会共享一个通用的 ISR 例程。通用 ISR 将读取中断控制器中的寄存器以确定触发了哪个向量(基本上是中断源)。然后,通用 ISR 调用另一个函数(通常也称为中断服务例程),该函数根据向量值处理该特定中断源。然后,当向量特定例程 returns 控制公共 ISR 时,取决于中断控制器的实现,公共 ISR 将解除断言中断控制器上的中断,将执行返回到代码中的中断位置。因此,通过从中断控制器中的 a 寄存器读取向量可以节省周期,因为公共 ISR 知道是什么导致了中断,而不是检查每个可能的中断源。

另一个问题是,使用一个中断处理程序,确定中断的优先级变得非常混乱。

通常,一旦中断被处理它的 CPU 确认,硬件中的中断就会被禁用,因此可以防止对同一中断的多次重入调用以及 data/buffer 覆盖的任何问题可能随之而来。中断处理程序提示重新启用更高优先级的中断也很常见,因此可以改善对这些中断的响应(然后它们可以中断较低优先级的中断)。

如果可能的话,只使用一个中断处理程序会使中断的优先级排序变得非常混乱:(

让中断处理程序和驱动程序和谐协作已经够困难了!

Are interrupt handlers any different from each other?

嗯,是的。它们可能都被OS设计强制符合一组rules/constraints,但是是的,它们通常是不同的。管理来自磁盘 DMA 控制器的中断的处理程序肯定具有与键盘输入处理程序不同的代码。他们管理不同的硬件,首先是:)