下一页 上一页 目录

10. 中断共享和中断冲突

10.1 简介

当两个或多个设备使用同一条中断线(以及同一个 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 中断共享

中断冲突有两种类型。一种是如上所述的真实冲突。在这种情况下,中断不起作用,设备驱动程序不断尝试控制其设备,但没有意识到中断不起作用。第二种类型的中断冲突是设备驱动程序启动,但发现它需要的中断已被占用,因此它会发出错误消息并退出。该消息可能会说“资源忙”,但没有明确说明是中断问题。

10.2 真实中断冲突

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 目录中,因此内核不知道。这是内核中的错误吗?

中断冲突的症状是什么?人们可能会认为设备根本无法工作,但由于地址是已知的,因此驱动程序确实会进行通信。中断通常用于控制设备之间的数据流,如果没有中断,则无法控制数据流。这可能意味着缓冲区溢出,甚至完全没有数据流,因为中断用于启动数据流。对于串行调制解调器,结果是流量极慢,并伴有长时间的停顿和频繁的错误。对于声卡,这可能意味着听到一两个字,然后就什么也没有了。

10.3 没有可用的中断

这是指设备驱动程序启动但立即退出以避免中断冲突的情况。它应该显示或记录一条错误消息,例如“资源忙”。

一种情况是 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。这意味着驱动程序频繁检查设备(轮询它),以查看设备是否需要中断服务例程进行服务。当然,这会浪费计算机时间,并且设备内部发生缓冲区溢出的可能性更大,因为它可能无法及时得到驱动程序的响应。


下一页 上一页 目录