在操作系统的内核中,我们有一个中断表,其中包含许多处理来自I / O设备和进程的中断的中断处理程序。但为什么我们只能拥有一个中断处理程序呢?中断处理程序是否彼此不同?
答案 0 :(得分:1)
如果您有一个中断处理程序,则应在代码而不是硬件中决定如何处理中断。
并且有很多东西可以触发中断 - 因此代码几乎肯定会降低整体性能。
答案 1 :(得分:1)
原则上,没有理由不能为所有中断调用一个中断处理程序。这样的处理程序必须检查每个中断源。由于大多数时间只有一小部分可能的中断源处于活动状态,因此会浪费许多周期来检查触发了哪个中断。由于ISR例程通常被称为代码,因此您可能会遇到大量(可能是不可接受的)性能损失。
特定中断控制器处理中断的方式可能会有很大差异。为了获得非常可靠的理解,您必须阅读各种不同架构中断控制器实现的手册。
但是,某些中断控制器最终会共享一个共同的ISR例程。通用ISR将读取中断控制器中的寄存器,以确定触发了哪个向量(基本上是中断源)。然后,公共ISR调用另一个函数(通常也称为中断服务例程),该函数根据向量值处理该特定中断源。然后,当向量特定例程将控制返回到公共ISR时,根据中断控制器的实现,公共ISR将使中断控制器上的中断无效,从而将执行返回到代码中的中断位置。因此,通过从中断控制器中的寄存器读取向量,可以保存周期,因为公共ISR知道导致中断的原因,而不是检查每个可能的中断源。
答案 2 :(得分:1)
另一个问题是,使用一个中断处理程序,优先处理中断会非常麻烦。
通常,一旦处理中断的CPU确认中断,就会在硬件中禁用中断,从而防止对同一中断进行多次,可重入的调用以及可能发生的数据/缓冲区覆盖的任何问题。中断处理程序通常会重新启用更高优先级的中断,因此改善对这些中断的响应(然后它们可以中断较低优先级的中断)。
只使用一个中断处理程序,如果可能的话,优先处理中断非常麻烦:(
让中断处理程序和驱动程序和谐地合作是非常困难的!
中断处理程序是否彼此不同?
嗯,是的。它们可能都被OS设计强制遵守一套规则/约束,但是,它们通常是不同的。管理来自磁盘DMA控制器的中断的处理程序肯定会有与键盘输入处理程序不同的代码。他们管理不同的硬件,首先:)