一旦您找到硬件,找到它的程序通常也会告诉您如何配置它。因此,找出配置方式通常与查找硬件的过程相同。
在这里,“配置”指的是 PnP 总线资源的分配(地址、IRQ 和 DMA)。对于每个设备,配置问题都有两个方面:
另一个问题是,当您在屏幕上查看配置消息时,您需要知道报告的配置是设备驱动程序的配置、设备硬件的配置,还是两者的配置。如果设备驱动程序已在硬件中设置了配置,或者以其他方式检查了硬件,那么驱动程序应该具有正确的信息。
但有时驱动程序被脚本、配置文件、提供给模块的不正确的资源参数提供了不正确的资源,或者可能只是没有被告知资源是什么,并尝试使用不正确的默认资源。例如,可以使用 “setserial” 来告诉串口驱动程序不正确的资源配置,而驱动程序会毫无疑问地接受它。但是串口无法正常工作(如果能工作的话)。
一个常见的问题是,软件无法检测到您的设备和/或确定适合它的驱动程序。对于 PnP 设备,通过 PnP 软件检测它们很容易,除非在硬件被禁用的不常见情况下。BIOS 有时可以设置为禁用 PnP 设备,或者物理设备本身上的跳线/开关可能会禁用它。在这种情况下,在您重新配置 BIOS 或更改跳线/开关之前,根本无法检测到硬件。
由于 PCI 总线本身是 PnP 的,因此没有隐藏的设备。即使通过 PnP 方法很容易找到 PnP 设备,但如果驱动程序不使用 PnP 方法,而是使用旧的可能地址探测方法来查找它们,则可能找不到它们。这是因为,在 PnP 设备中的资源(由 BIOS 或 Linux)设置之前,该设备可能根本没有地址,因此在可能的地址探测不会产生任何结果。对于旧的 ISA 总线,某些设备可能不是 PnP 的,因此旧的探测方法可能会找到它们。因此,许多驱动程序仍然在可能的地址进行探测,此外还使用 PnP 方法(= PnP 探测,有时也简称为“探测”)。
查找硬件设备的方法(及其配置):(点击链接查看更多详情)
通过读取计算机首次启动时屏幕上显示的来自 BIOS 和 Linux 的消息,可以获得有关配置的重要信息。这些消息通常闪烁得太快而无法阅读,但是一旦它们停止,请多次按 Shift-PageUp 以向后滚动查看它们。要向前滚动查看它们,请按 Shift-PageDown。在任何时候在 shell 提示符下键入 “dmesg” 将仅显示 Linux 内核消息,并且可能会错过一些最重要的消息(包括来自 BIOS 的消息)。来自 Linux 的消息有时可能只显示设备驱动程序认为配置是什么,可能是通过不正确的配置文件告诉它的。检查 /var/log 中的日志文件也可能很有用。
对于 PCI 总线,符号 00:1a:0 表示 PCI 总线 00(主 PCI 总线),PCI 卡(或芯片)1a,以及卡或芯片上的功能 0(第一个设备)。卡(或芯片)08 上的第二个设备将是:00:08:1。
BIOS 消息首先显示,并将显示当时的实际硬件配置,但是 isapnp、pci 实用程序或设备驱动程序稍后可能会更改它。在某些情况下,它不显示 BIOS 未配置的设备。
如果 BIOS 消息没有在您使用 Shift-PageUp 备份到 BIOS 消息的开头时显示,请尝试在它们闪烁时冻结它们,方法是在屏幕上闪烁第一个单词后立即按下 “Pause” 键。按任意键恢复。在正确的时间按下 Pause 通常很棘手。请务必在按下 “Pause” 键之前按住 “Shift” 键,因为 “Pause” 是一个 Shift 键。如果您错过,请在 Linux 开始启动时按 Ctrl-Alt-Del 重新启动并重试。一旦来自 Linux 的消息开始出现,使用 “Pause” 就太晚了,因为它不会冻结来自 Linux 的消息。
要在 BIOS 中设置诸如为传统硬件保留的 IRQ、串口地址等内容,您需要在启动时进入 BIOS (CMOS) 设置菜单。每个 BIOS 品牌都有不同的按键需要按住才能执行此操作。互联网上有列表。有时,通过冻结 BIOS 消息或观看屏幕,您需要按下的键将在消息中指示,例如 “Press DEL for setup”。但它可能会闪烁得太快以至于您错过了它。当然,您不要在 BIOS 中设置您不理解的内容,否则您的 PC 可能会被禁用。
来自 BIOS 的启动时消息告诉您当时的硬件配置。当前配置可能仍然相同,因为如果 BIOS 所做的事情是可以的,那么 Linux 应该希望接受它。来自 Linux 的消息可能来自使用内核 PnP 功能来检查和/或设置总线资源的驱动程序。这些应该是正确的,但请注意仅显示驱动程序从配置文件中获知的消息。这可能是错误的。当然,如果设备工作正常,那么它的配置可能与驱动程序相同。
从内核 2.6 开始,除了 /proc 目录树之外,还有一个 /sys 树,请参阅 /sys 树。这些树对于查找资源配置和设备很有用。其中的 “文件” 代表内核内存中的数据,根本不存在于您的硬盘驱动器上。诸如 lspci 之类的程序从 /proc 树获取其信息,因此此类程序应以比直接检查 /proc 中的 “文件” 更易读的形式显示结果。以下是 4 个 /proc “文件”,它们显示了设备驱动程序在内核中注册的资源。
由于 Linux 的即插即用通过让设备驱动程序为其设备分配资源来工作,因此如果驱动程序尚未请求保留此类资源,则可能没有列出您的某些硬件使用的资源。对于内核模块(可加载设备驱动程序)的情况,如果模块尚未加载,则内核不知道它需要的任何资源。有时,模块仅在您启动需要它的应用程序时才加载。因此,如果 /proc 中的这些 “文件” 中缺少某些硬件,则可能意味着该硬件尚未被使用。例如,即使您的软驱中装有软盘并且已准备好使用,除非正在使用,否则它的中断也不会显示出来。
/pts 显示 I/O 地址。如果存在错误(地址错误),则意味着麻烦,因为设备将不会收到发送给它的字节。
/proc/iomem 显示已注册的 IO 内存地址。
/proc/interrupts 显示当前正在使用的中断。
/proc/dma 显示 dma(直接内存访问)ISA dma 通道分配。
过去,作者观察到不存在的中断列表。在某些情况下,它表明实际发送了一些这样的中断。这可能是由于硬件缺陷导致发出错误的中断。
/proc/bus/ 具有子目录(子文件夹)input/、pci/ 和 isapnp/。此目录中大多数文件的格式都非常神秘,通常只是配置空间中字节的副本。因此,仅在万不得已时才使用它们。input/ 子目录包含有关输入设备(如键盘和鼠标)的信息。它不像 /proc/bus/ 下的其他目录那样神秘,并且可能会产生一些关于 PS2 或 LPC 总线上的输入设备的有用信息(请参阅 LPC 总线)。不幸的是,我所看到的并没有说明它在 LPC 总线上,而它很可能是在 LPC 总线上。在 /pci/00/ 中,每个 pci 设备都有一个二进制文件,其中文件名是 pci 插槽号(也称为 pci 插槽名称)。00 表示 pci 总线 0。
从内核 2.6 开始,有一个新的 /sys 目录用于 PnP 配置。它是一种 sysfs 类型的文件系统,它有点像 /proc 文件系统,因为 “文件” 代表内核内存中的信息,而不是在您的硬盘驱动器上。但它不如 /proc 文件系统有用。最初(在 2.5 内核中),它被称为 “驱动程序文件系统”,类型为 “driverfs”。
在 sysfs 中,系统上存在的每个设备都有自己的目录,其中包含显示分配给它的资源的文件。此类设备目录的名称类似于 0000:00:12.0@ 或 00:06@。这些设备是什么?第一个是 PC 的 “插槽” 12 中的 PCI 卡。插槽实际上可能在您的 PC 内部标记为 PCI2(2 而不是 12)。这是因为编号较低的 “插槽” 用于主板上的内置设备,这些设备不使用任何物理插槽。在此示例中,“插槽” 1-10 将是内置的,而实际插槽 11-14 标记为 1-4。通过键入 “lspci”,您将能够将数字(如 0000:00:12.0)与名称(如 IDE 接口)匹配。键入 “lspci -v” 或 “lspci -vv” 以查看更多信息。
那么,00:06 是什么?它是一张 ISA 卡(或内置设备),但它不是 ISA 插槽 6(像 PCI 编号一样)。当搜索 ISA-PNP 设备时,它是找到的第 6 个设备。更准确地说,它是找到的第 7 个设备,因为有一个编号为 00:00 的设备。那么如何识别它们呢?好吧,您可以键入 “cat */*” 并显示所有设备的所有文件,但即使这样您也看不到设备名称(但会看到可以从中识别它们的信息)。希望这种不便在未来能够得到解决。
这些文件不仅提供有关总线资源配置(以某种神秘的格式)和驱动程序(在 “driver” 目录中)的信息,而且在未来,您应该能够使用它们来更改资源配置。目前(2004 年 8 月)您无法使用它配置 PCI 总线。一个严重的限制是,根据当前的 “驱动程序模型”,您无法更改已分配给驱动程序的设备的资源,这可能意味着您需要卸载驱动程序模块才能使用它。如果驱动程序是内置的,则没有希望。希望这些严重的限制在未来能够消除。在内核文档中有一个文件:“pnp.txt”,告诉您如何配置。截至 2004 年 8 月,它已经非常过时了,但作者正在更新它。使用 /sys 树来配置资源被称为 “Linux 即插即用用户界面”。
“Linux 即插即用” 的另一部分是设备驱动程序使用的内核接口。从内核 2.6 开始,这已经发生了很大变化,但大多数驱动程序仍然使用旧接口(截至 2004 年 8 月)。驱动程序(或您)也可以使用 “用户界面”,这需要改进。
使用 “lspci” 和/或 “scanpci” 命令很容易找出已分配给 PCI 总线上设备的哪些总线资源。选项 -v 或 -vv 将显示更多详细信息。在某些情况下,“scanpci” 将找到 “lspci” 找不到的设备。这是因为 “scanpci” 直接在 pci 总线上搜索设备(通过配置空间),并且不使用内核获得的数据(由于内核错误,数据可能是错误的——我刚刚发现了一个这样的情况)。
更多神秘格式的信息可以在 /sys
和 /proc
树中的 “文件” 中找到。在 /sys/bus/pci/devices
中,文件 vendor
将包含供应商 ID 号,例如 0x4B8C 等。更神秘的格式是在 /proc/bus/pci
中。在 2.6 之前的旧内核中,此类信息位于 /proc/pci
(非神秘但 IRQ 为十六进制)或 /proc/buspci/devices
(神秘显示)中。
在大多数情况下,对于 PCI,您只会看到硬件现在的配置方式,而看不到需要哪些资源。在某些情况下,您只能看到基地址(范围的起始地址),而看不到结束地址。如果您看到整个范围,则可以确定需要多少字节的地址资源。
对于 ISA 总线上的卡,它不像 PCI 总线那样简单,PCI 总线本身是 PnP 的。后来的 ISA 卡是 PnP 的,但较旧的卡不是。此外,某些 PnP 卡的 PnP 已被特殊软件禁用,该软件仅在 MS 上运行。非 PnP 卡通过卡上的跳线或 MS 软件进行配置。
如果是 PnP 卡,您可以尝试运行 pnpdump --dumpregs
,但这不确定。结果可能看起来很神秘,但可以解密。不要将 pnpdump
用于与 PnP 卡通信的读取端口地址与找到设备的 I/O 地址混淆。它们是不一样的。
LPC(低引脚数)是一种类似于总线的接口,通常用于笔记本电脑,并且越来越多地用于台式机。要找出您是否具有 LPC 类型,请键入 “lspci” 并查找 “LPC”。“LPC” 旁边还有其他词,例如 “ISA Bridge ... LPC Interface Controller” 或 “LPC Bridge” 等。LPC 实际上不是 ISA,但它可以替代 ISA 总线。
旧的 ISA 总线速度很慢,需要更高速度的设备被放置在较新的 PCI 总线上。但是,不需要高速的设备通常通过主板上的芯片实现,并且即使没有任何 ISA 卡的插槽,仍然保留在 ISA 总线上。然后出现了 LPC 总线来取代 ISA 总线的剩余部分。LPC 比 ISA 小得多,并且速度一样快,因为它以 ISA 时钟速度的 4 倍运行。其用于数据/地址和控制的多路复用总线仅为 4 位宽。发送一个字节需要将字节分成 2 个半字节,然后再将它们重新组合在一起。因此,很明显为什么它是 “低引脚数” = LPC。总线中还有其他几条线路。
这种小型 LPC 接口用于慢速 “传统” 设备,如串口、并口和软驱。因此,使用 LPC 的计算机将所有快速设备放在 PCI 总线等上,而将慢速(传统)设备放在 LPC 总线接口上。所有 LPC 设备都将是板载的;没有 LPC 插槽。
LPC 没有用于即插即用配置的标准,但表示 BIOS 或 ACPI 应该进行配置。此总线上的设备有时使用 isapnp。截至 2004 年底,Linux 对 LPC 的支持非常不完整,但 Linux 对 ACPI 的配置方面有一些支持。有时 BIOS 菜单允许手动 PnP 配置 LPC 总线上的设备,但它可能不会告诉您该设备位于 LPC 上。
LPC 总线上的一个主要芯片是 superio 芯片,它包含传统 IO 设备:串口和并口、软驱控制器、键盘控制器、鼠标等。BIOS 数据也可能驻留在 LPC 总线上。键盘和鼠标(输入设备)应列在 /proc/bus/input/devices 中,但似乎显示 “isa0060/serio0 等”,而不是看到 “lpc”,即使它在 lpc 总线上而不是 isa 总线上。
在 LPC 总线普及之前,有一种 “X 总线”(本 HOWTO 中未涵盖),其用途与 LPC 总线相同,但不如 LPC 紧凑。某些 PC 同时具有 LPC 和 X 总线。
与 PnP 卡相反,非 PnP 卡始终在硬件中设置其资源。也就是说,它们始终具有地址和 IRQ,除非有用于禁用设备的跳线设置等。有时可以通过设备驱动程序完成的探测或通过其他进行探测的软件找到使用的资源。例如 “scanport”(仅限 Debian ??)探测大多数 IO 端口地址,并且可能会找到 ISA 设备。但请注意,它可能会使您的 PC 挂起。有时它会无法找到实际存在的硬件(因为硬件在其寄存器中具有默认值 0xff)。即使它找到了硬件,它也不会显示 IRQ,也不会明确识别硬件。
因此,尝试查找此类硬件的一种方法是启动驱动程序,该驱动程序可能会探测此类硬件。通过查看启动时消息,您可能会看到驱动程序启动并找到硬件。否则,您可能需要找到驱动程序并启动它(例如,通过将其作为模块加载)。
找到正确的驱动程序可能很困难。有时根本没有驱动程序,因为某些设备(尚未?)不受 Linux 支持。要确定您需要哪个驱动程序,请查看任何可能识别卡的文档。如果这失败了,请查看卡本身,包括芯片上的重要名称/编号。但是您需要的驱动程序模块的标识可能不在卡上的任何位置。您可以在卡上找到 FCC ID,然后使用 FCC ID 号搜索 Internet,以尝试查找有关该卡(或其上的芯片)的更多信息。
如果卡具有用于设置资源(配置)的跳线,则可以查看跳线的设置方式。有些卡同时具有 PnP 和跳线。如果 PnP 以某种方式被禁用,它们就像跳线卡一样工作。有时卡上有标签,显示如何设置跳线(或至少给出一些线索)。您可能需要随卡提供的文档(印刷版或软盘上)。也许您可以在互联网上找到它。
最困难的情况之一是,在 MS 下运行的软件已被用于配置非 PnP 卡或 PnP 已被相同的 MS 软件禁用的 PnP 卡。因此,您既不能通过 PnP 也不能通过跳线来配置它。在这种情况下,您唯一的希望是按照 非 PnP 卡 中所述探测地址。或尝试找到配置它的 MS 软件。
在重复的工作中,Linux 的各种主要发行版开发了自己的工具来检测和/或配置硬件。这种配置通常不仅仅是即插即用的资源类型配置。它是一般的配置,这在很大程度上超出了本 howto 的范围。
然后,其他发行版(如 Debian)可能会获得该工具的副本,并将其作为选项或作为故障排除工具提供给其用户。这些工具很可能利用标准的 Linux 工具来检测硬件,例如 “lspci”。在以下工具列表中,开发它的发行版的名称在括号中,但该工具也可能在其他发行版中可用。
有各种工具可用于查找和可能配置各种类型的设备。这种配置是一般的配置,本 howto 未涵盖。
有些人试图使用 Windows 来查看总线资源是如何设置的。不幸的是,由于 PnP 硬件在断电时会忘记其总线资源配置,因此在 Linux 下的配置可能不相同。对于非 PnP 硬件(或某人在设备内部通过跳线或 Windows 软件禁用了 PnP 的情况),那么使用 Windows 应该可以正常工作。即使对于 PnP,它通常最终也是相同的,因为在许多情况下,Windows 和 Linux 都只是接受 BIOS 设置的内容。但是,在 Windows 和/或 Linux 进行配置的地方,它们可能会以不同的方式进行配置。因此,不要指望 PnP 设备配置相同。