作者 :Daniel Robbins
驱动程序、IRQ 与 PCI 等待时间
Linux 之所以声誉卓著是它拥有非凡的稳定性。但如果硬件有缺陷或配置不当,即便是世界上最稳定的操作系统,也不能发挥其优越之处。在本文中,Daniel Robbins 分享他在让 NVIDIA TNT 图形卡使用 NVIDIA 的加速驱动程序在 Linux 下工作方面的经历。如同他所做的那样,向您演示如何诊断以及解决 IRQ 和 PCI 等待时间计时器问题 -可以使用这些技术,来确保系统不会经历死锁、不一致行为或数据丢失。
不稳定性的诸多原因
稳定性问题通常不是由有缺陷的硬件所引起的,但硬件配置不当或选择异常的驱动程序会造成这类问题。当我试图在 Linux 下让我的帝盟 Viper V550(一种基于 NVIDIA TNT 芯片的 AGP 图形卡)使用 NVIDIA 自己的加速驱动程序时,就开始了这方面的经历。
NVIDIA 有它们自己的 Linux 显示驱动程序,它们是 NVIDIA、SGI 和 VA Linux 的合作结晶。与包括在 Xfree86 4.0 中的标准的仅 2D NVIDIA 驱动程序相比,这些驱动程序有许多优越之处。例如,它们有完全加速的 3D 支持。而且,这些驱动程序的特色是以 OpenGL 1.2 为实现,而不只是 Mesa 的增强版。所以,总而言之,若您有基于 NVIDIA 的图形卡,则这些加速驱动程序是您希望使用的,至少理论上如此。我让这些驱动程序正常工作的尝试,最终转变成一次极佳的学习经历,至少可以这么说。
在安装完加速 Linux NVIDIA 驱动程序之后(请参阅本文后面的参考资料),启动 Xfree86,开始摆弄所有 3D 应用程序,现在,有应该有的出色加速。到那时为止,以前我必须重新引导到 Windows NT 才能利用 3D 加速。现在,虽然我不介意 NT,但必须重新引导才能使用 3D 应用,就有点让人恼火了,我非常高兴又少了一个要离开 Linux 而重新引导机器的原因。然而,在大约摆弄了一小时左右,我对于Linux 3D 渴望,经历了一次致命挫折 -机器死锁了。鼠标完全一动不动,屏幕冻结,并且必须重新引导系统。
是的,遇到了某种稳定性问题。但我无法确切知道是什么造成这一问题。是异常的硬件,还是图形卡配置不当呢?或者可能是驱动程序有问题- 是它不喜欢基于 VIA KT133 芯片的 Athlon 主板吗?无论什么问题,我希望尽快解决它。在本文中,我将分享如何解决硬件稳定性问题的过程。虽然,您所碰到的问题不一定与这完全相同,但我用来诊断和(大多数)解决问题的步骤在本质上是大同小异的,并且也可应用到许多不同类型的 Linux 硬件问题。
首先,硬件
我首先想到,可能是异常或需要冷却的硬件。一方面,帝盟 Viper V550 好象在 Windows NT 下没有问题。另一方面,可能是 Linux 使芯片有些过载,然后引起与发热相关的死锁。V550 确实极烫,它的 OEM 散热片似乎来不及散热。死锁和图形卡不够冷却的事实合在一起说服我转向 PC Power and Cooling(请参阅参考资料),为我的 V550 购买了一个迷你集成的散热片/风扇。
所以,在我收到 Video Cool 后,将显示卡上的 OEM 散热片去掉(造成质保无效),清洁 TNT 芯片,然后将 Video Cool 固定在芯片上。结果呢?显示卡不烫了,但死锁仍然存在。我从这段特殊的经历所吸取的教训是-如果一开始就确定系统冷却充足,那么根本不必担心由于不充足冷却引起的元件故障。这本身就是要投入时间和精力来确保工作站和服务器凉爽运行的极佳理由。既然已经考虑了发热问题,我知道死锁问题不太可能由异常的硬件引起,并且开始查看其它地方。
新驱动程序 -以及可能的解决方案?
我对 NVIDIA 驱动程序本身是否是问题所在,有点半信半疑。幸运的是,新版本的驱动程序刚刚发布,所以我立即升级,希望它能解决稳定性问题。遗憾的是,它没有,在 openprojects.net 上的 #nvidia 频道,我与其他人讨论之后,发现不是每个人都能够使驱动程序稳定运行,然而,对于许多人,它是稳定运行的。
在 #nvidia 上,有人建议我确保 V550 没有与另一块卡共用一个 IRQ。与标准的 XFree86 驱动程序不同,加速 NVIDIA 驱动程序需要一个 IRQ 来正常运行。要查看它是否有自己的专用 IRQ,输入 "cat /proc/interrupts",您瞧,V550 与 IDE 控制器共用一个中断。在我解释这个问题之前,先讲述一点有关 IRQ 的简要背景。
PC 通常使用 IRQ 以及硬件中断,来允许外设,如视频卡和磁盘控制器,用信号通知 CPU,它们准备处理数据。在 PCI 总线出现以前,机器中的每个设备都有自己专用的 IRQ,这一点是很重要的。如果您的机器仍然使用 ISA 外设,那么这仍然是一个事实 - 所有非 PCI 设备都应该有自己专用的 IRQ。
IRQ 与 PCI
然而,PCI 总线有点不同。在系统中,PCI 分配了四个 IRQ 可供 PCI/AGP 卡使用。通常,多个设备可以共享这些 IRQ。(如果是这种情况,要确保共享 IRQ 的所有设备是 PCI 和 AGP。)尤其对于在可能有五个 PCI 和一个 AGP 插槽的现代机器,共享 IRQ 技术是非常重要的。没有共享 IRQ 技术,系统中使用 IRQ 的卡不可能超过四个。
但是,PCI IRQ 共享有一些限制。现代主板的 BIOS 和 Linux 内核通常支持 PCI IRQ 共享技术,但也有某些 PCI 卡在与另一个设备共享 IRQ 时,会直接拒绝正常工作。如果遇到系统随机死锁,特别是死锁发生与使用某个特定的硬件设备相关时,不妨尝试让 PCI 设备使用自己的 IRQ。第一步是查看系统中是否有任何设备共享 IRQ。可以遵循以下步骤来做到:
使用系统中的各种设备,如,磁盘、声卡、显示卡、SCSI 卡等等。这确保 Linux 会处理这些设备的中断。
用 "cat /proc/interrupts" 命令,会显示 Linux 内核到目前为止处理的所有中断的列表及其数目。查看该列表的最右栏。如果同一行中列有两个或更多设备,那么这些设备共享那个特定的 IRQ。
如果遇到有问题的设备是非 PCI 设备(ISA 或其它旧卡),那么您会发现 IRQ 冲突,可以尝试通过 BIOS、isapnptools 包或者对外设进行物理跳线来解决。请注意,如果设备是集成在主板上,即使它不占用物理 PCI 插槽,它也是 PCI 设备。
如果有问题的所有设备是 PCI 或 AGP 设备,那么是否有问题取决于硬件。通过以下步骤使所有的 PCI/AGP 设备有自己的 IRQ:
进入系统 BIOS,禁用所有不用的外设(USB、并行端口等等)。这可以释放一些 IRQ, 让每个设备尽可能的分配它自己的唯一的 IRQ。
进入 BIOS 的 PnP 部分,确保 BIOS 被配置成“非 PnP”操作系统。选中 "Reset ESCD data" 选项。这会强制 BIOS 在下次重新引导系统时给所有硬件设备重新分配 IRQ。
重新引导 Linux,使用硬件,用 "cat /proc/interrupts" 命令查看结果。现在,希望所有设备都使用自己的 IRQ。
如果仍有两个受怀疑的设备共享 IRQ,那么还有两种额外选项。有些 BIOS 设置程序可以允许您将确定的某个 IRQ 分配给特定的 PCI 插槽。很少见这种 BIOS 设置程序,如果您有其中之一,可以使用这种功能来消除冲突。如果 BIOS 中没有这个选项(大多数情况下没有),那么还有一种方法可以确保解决这种问题-关机,关闭电源,从插座上拔掉电源,并等几分钟。然后,打开系统机箱, 将 PCI 卡换一个插槽。这种办法好象不常见,但绝对管用,特别是当系统中有多余的 PCI 插槽时,这种办法特别有用(但您要花一些时间来给每一块卡找正确的插槽。)
我使用了这个“PCI 调换诀窍”,能够使系统中的所有设备都使用唯一的 IRQ。差不多了。正如您所见,有两个 IDE 设备仍然共享一个 IRQ:
# cat /proc/interrupts
CPU0
0: 52063600 XT-PIC timer
1: 616810 XT-PIC keyboard
2: 0 XT-PIC cascade
5: 89084 XT-PIC ide2, ide3
7: 1515741 XT-PIC eth0
8: 155928 XT-PIC rtc
9: 1139761505 XT-PIC nvidia
10: 164000 XT-PIC Ensoniq AudioPCI
12: 4458823 XT-PIC PS/2 Mouse
14: 664176 XT-PIC ide0
15: 38661 XT-PIC ide1
NMI: 0
ERR: 0
但这是正常的,因为 ide2 和 ide3 设备是集成在 Promise FastTrak IDE 卡的同一芯片上。
现在(几乎)所有设备都有唯一的 IRQ,我尝试加速驱动程序,并且……仍然在不到一个小时内经历了一次死锁。显然,共享的 PCI IRQ 根本不是问题所在。唉……得花些时间看看其它地方(再一次)。
解决一个问题,发现另一个
一段时间后,我发现禁用 AGP 可以使 NVIDIA 驱动程序运行正常,但有一点慢。尽管不想这样做,但目前驱动程序的版本允许关闭 AGP,这可以在 XF86Config 中简单地添加一行来实现。关闭 AGP,我将视频的内存带宽降低了 4x,但是相当慢的 3D 仍然比根本无硬件 3D 加速快很多。在禁用 AGP 后,终于有了一个稳定的系统!然而,这种临时解决方案又造成另一个问题。每当运行 3D OpenGL 动画,声音回放会变得极端扭曲并且断断续续。唷!
幸运的是,能够找到解决声音问题的方案。用 setpci 实用程序为 PCI 设备设置较理想的等待时间。过一会儿,我会向您演示具体的解决方案 -但首先介绍一些背景知识。
您可能知道,PCI 总线是共享资源 - 所有 PCI 卡通过总线轮流进行通信,通常情况下,一切都正常。但由于 PCI 总线是具有有限带宽(虽然通常情况下足够)的共享资源,某个 PCI 卡可能会对系统中的其它 PCI 卡产生负面影响。例如,如果