关于pci

由 wheel 在 11-22-2002 12:02 发表:

关于pci

保 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。)使用系统中的各种设备,如,磁盘、声卡、显示卡、SCSI 卡等等。这确保 Linux 会处理这些设备的中断。

用 "cat /proc/interrupts" 命令,会显示 Linux 内核到目前为止处理的所有中断的列表及其数目。查看该列表的最右栏。如果同一行中列有两个或更多设备,那么这些设备共享那个特定的 IRQ。

如果有问题的所有设备是 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 卡产生负面影响。例如,如果 PCI 卡 A 正在通过总线发送数据,同时,PCI 卡 B 也想发送数据,这会发生什么情况?卡 A 是优雅地让出总线,还是继续进行数据传输 -如果这样,要多长时间?

PCI 等待时间计时器

回答这个问题与每个 PCI 设备的配置设置,PCI 总线等待时间计时器,密切相关。通常,Linux 驱动程序为系统中的每个 PCI 设备设置了合适的 PCI 总线等待时间计时器值,大多数情况缺省设置是足够的(如果不是最优),所有设备相处融洽,系统工作正常。PCI 总线等待时间计时器可以取 0~248 之间的值。如果某个设备的设置为 0,那么当另一个设备要传输数据时,它会立即释放总线。如果设备的设置为 248,那么在停止之前会持续使用总线较长时间,而另一个设备等待轮到。

如果所有设备都有相对较高的 PCI 总线等待时间计时器设置,并且有大量数据正在通过总线发送,那么 PCI 卡通常在取得总线控制权且开始发送数据前,会等待较长一段时间。然而,一旦取得总线控制权后,在将总线释放给其它设备之前,它们会通过总线突发传输大量数据。这正是高的 PCI 总线等待时间计时器设置不但增加了等待时间(通过总线发送数据时的延迟)而且也 增加了有效带宽的原因。由于每个设备可以不中断地通过总线突发地传输大量数据,所以可以更加有效地使用 PCI 总线,并且 PCI 设备可以传输更多的数据。

另一方面,如果所有 PCI 设备具有低的 PCI 总线等待时间设置,那么当另一块卡需要传输数据时,它们会很高兴地放弃总线。这导致相当低的数据传输等待时间,因而没有设备会长期控制总线,造成其它设备等待。所有这些的负面影响是当两个或多个 PCI 设备同时要使用总线时,低的 PCI 总线等待时间设置减少了有效的 PCI 总线带宽。这种现象的发生是由于突发的大量数据传输很少发生,而且总线控制权切换频繁,增加了开销。

大多数 Linux 分发版包含称为 pci-utils 的工具,该工具允许您查看和改变 PCI 设备的等待时间设置。要查看当前 PCI 设备的等待时间设置,请输入:

lspci -v

输入该命令将显示所有 PCI 设备的非常详细的信息。每个设备的 PCI 等待时间设置在第 3 行上列出,正好在 IRQ 设置之前。

PCI 等待时间方法

这与扭曲声音的问题有什么联系?唔,扭曲的声音是由于缺省的 PCI 等待时间设置,当运行 3D 加速时,V550 控制了 PCI 总线。这就是原因。V550 是 AGP 2X 卡,当关闭 AGP(以增加稳定性)后,到主存的卡的带宽减少了 75%!现在,当 V550 试图通过较慢的 PCI 总线获取与原来同样数量的数据时,几乎 100% 占用 PCI 总线,这是造成声音设备有问题的原因。由于音频设备的数据缓冲区通常较小,需要及时地将音频数据发送给它们以避免缓冲区欠载运行,因而它们特别易受 PCI 等待时间问题的影响。使用当前设置,V550 使用如此之多的 PCI 带宽,以至于没有留给声卡足够带宽用来传输数据

Published At
Categories with 服务器类
Tagged with
comments powered by Disqus