当两个或多个设备使用同一条中断线(以及同一个 IRQ 号)时,这要么是“中断共享”,要么是“中断冲突”。PCI 总线允许所有 PCI 设备彼此共享中断,因此这被称为“共享”。但是,如果一个 ISA 设备(或一个 LPC 设备??)与某个其他设备(无论是 PCI、ISA 还是 LPC ??)使用相同的中断 (IRQ),则通常会发生中断冲突。
上述说法存在例外情况。一些非常老的 PCI 设备(1995 年之前??)不允许中断共享。相反,少数 ISA 设备被设计为共享中断(在两个 ISA 设备之间??),但这两个 ISA 设备都必须以这种方式设计,并且必须由了解中断共享的软件驱动。主板也必须支持它。以下讨论适用于具有 ISA 总线的 PC。
冲突意味着当发生中断时,可能不会调用任何设备驱动程序(或错误的驱动程序),并且会发生糟糕的事情,例如缓冲区溢出(数据丢失)。当设备不发送中断时,它可能会几乎将其中断线接地,从而阻止任何其他设备使用该中断线。如果只有该设备使用该中断,那没问题。但是,如果第二个设备尝试使用同一条中断线,则它无法这样做。如果第二个设备在不发送中断时也几乎将线路接地,那么这两个设备都无法使用中断。但是 Linux 和这两个设备都不知道这种冲突,并且仍然愉快地发出中断,但这些中断大多毫无用处,因此丢失了。
当 IRQ 通过卡上的跳线(ISA 总线)设置时,中断冲突很常见,因为内核通常不知道这些跳线是如何设置的。ISA 即插即用(卡上没有跳线)有所帮助,因为软件可以更改 IRQ。ISA 被 PCI 取代几乎消除了 IRQ 冲突。尽管如此,您的 PC 可能在主板(不在插件卡上)上具有 ISA 总线、LPC 总线或 X 总线上的设备。但是 BIOS 和内核应该知道这些是如何设置的,从而避免将它们用于 PCI 设备,从而避免中断冲突。但是,PCI 仍然可能存在中断问题,因为它可能会耗尽可用的中断,尤其是在只有 16 个中断的旧 PC 上。
但是,PCI 总线上的 IRQ 共享虽然消除了冲突问题,但也引入了另一个不太严重的问题:IRQ 平衡问题。如果过多的高中断发出设备共享同一个 IRQ,则可能会导致中断服务延迟,甚至可能导致缓冲区溢出和其他错误。这不是由于中断线路上的拥塞造成的,而是由于软件确定哪个设备发出中断的方式造成的。PCI 中断共享
中断冲突有两种类型。一种是如上所述的真实冲突。在这种情况下,中断不起作用,设备驱动程序不断尝试控制其设备,但没有意识到中断不起作用。第二种类型的中断冲突是设备驱动程序启动,但发现它需要的中断已被占用,因此它会发出错误消息并退出。该消息可能会说“资源忙”,但没有明确说明是中断问题。
BIOS 和内核都不会有意允许任何中断冲突,那么它们是如何发生的呢?一种方式是如果有人在配置文件中放入了不正确的 IRQ,例如给模块一个参数,例如:irq=9。在这个例子中,假设设备的 irq 实际上是 irq5。那么当另一个设备驱动程序启动时,其设备设置为 irq5,您就有两个真实设备使用 irq5,并且发生了真实冲突。内核批准让第二个设备使用 irq5,因为它错误地认为第一个设备正在使用 irq9,并且 irq5 是空闲的。
还有其他类似的情况,内核未能知道某个 irq 正在使用中。一种情况是当存在一个通过跳线设置 irq 的旧 ISA 卡时,但它的驱动程序尚未启动(或者它甚至可能没有驱动程序)。另一种情况是 BIOS 在硬件中设置了一个 irq,但该硬件的 Linux 驱动程序从未启动,并且 Linux 不知道该 irq。这种情况甚至可能发生在 PCI 卡上,并且 irq 将显示在 lspci -v 中,但不会出现在 /proc/interrupts 目录中,因此内核不知道。这是内核中的错误吗?
中断冲突的症状是什么?人们可能会认为设备根本无法工作,但由于地址是已知的,因此驱动程序确实会进行通信。中断通常用于控制设备之间的数据流,如果没有中断,则无法控制数据流。这可能意味着缓冲区溢出,甚至完全没有数据流,因为中断用于启动数据流。对于串行调制解调器,结果是流量极慢,并伴有长时间的停顿和频繁的错误。对于声卡,这可能意味着听到一两个字,然后就什么也没有了。
这是指设备驱动程序启动但立即退出以避免中断冲突的情况。它应该显示或记录一条错误消息,例如“资源忙”。
一种情况是 ISA 设备被激活,但无法分配中断 (IRQ),因为没有可用的中断。或者可能有可用的中断,但由于需要中断的设备的硬件不支持可用的中断号(或者主板由于“路由”问题而不支持它,请参阅 PCI 中断)。如果 ISA 设备用完了所有中断,那么一个或多个 PCI 卡可能会发生冲突,因为它们无法获得任何 IRQ。
通常,BIOS 会分配中断,并且不会产生冲突。但是,如果 IRQ 用完,它可能会被迫产生冲突。如果有人设置 BIOS 为非 PnP 的传统 ISA 设备保留某些 IRQ,则可能会发生这种情况。这些设置可能是错误的,应该检查出来,尤其是在您遇到问题时。例如,有人可能为早已从 PC 中移除的 ISA 卡保留了一个 IRQ。如果您取消保留此 IRQ,则此 IRQ 可用,并且冲突消失。
有时,BIOS 会通过使用它所谓的 IRQ 0 来解决 IRQ 短缺的问题。由于真正的 IRQ 0 永久分配给计算机的定时器,因此没有这样的 IRQ 可用。但是这里的 IRQ 0 意味着驱动程序应该使用轮询而不是 IRQ。这意味着驱动程序频繁检查设备(轮询它),以查看设备是否需要中断服务例程进行服务。当然,这会浪费计算机时间,并且设备内部发生缓冲区溢出的可能性更大,因为它可能无法及时得到驱动程序的响应。