以下是一些关于在 Linux 中使用以太网连接的常见问题。一些更具体的问题按“每家制造商”分类。您想要答案的问题很可能已经被其他人问过(并解答!),所以即使您在这里找不到答案,您也可能从新闻存档中找到您想要的答案,例如 Dejanews。
对于大多数 Linux 发行版,驱动程序以可加载模块的形式存在,这些模块是在运行时与操作系统合并的小型二进制文件。模块为操作系统(内核)提供有关如何控制特定以太网卡的信息。每个模块的名称都列在本文档中每张卡的章节标题中。一旦您知道模块的名称,您必须将其添加到文件 /etc/modules.conf
中,以便 Linux 知道为您的网卡加载哪个模块。语法通常如下所示。
alias eth0 module_name options module_name option1=value1 option2=value2 ...
选项行通常仅适用于较旧的 ISA 硬件。对于多网卡系统,通常需要带有 eth1
、eth2
等的附加行。
模块文件通常位于目录 /lib/modules/
中,该目录进一步按内核版本(使用 uname -r
)和子系统(在本例中为 net
)细分。这些是由发行版构建者放置在那里的,或者由个别用户在构建自己的内核和模块后运行 make modules_install
时放置在那里的(有关构建自己的内容的更多详细信息,请参阅内核 howto)。
如果您构建自己的内核,您可以选择将所有驱动程序直接合并到内核中,而不是作为单独的文件存在。完成此操作后,驱动程序将在启动时检测硬件。驱动程序的选项由启动前的内核命令行提供(有关更多详细信息,请参阅 BootPrompt Howto)。用户在构建内核的 make config
步骤中选择使用哪些驱动程序(再次参见内核 howto)。
这个问题的答案在很大程度上取决于您打算用网络连接做什么,以及它将看到的流量有多少。
如果您只期望单个用户进行偶尔的 ftp 会话或 WWW 连接,那么即使是旧的 ISA 网卡也可能会让您满意(假设是 10Mbps,而不是 100)。
如果您打算建立服务器,并且您需要将通过网络移动数据的 CPU 开销保持在最低限度,您可能需要考虑使用带有总线主控功能的芯片的 PCI 网卡之一。此外,现在有些网卡实际上可以在网卡上完成数据校验和的一些处理开销,从而为 CPU 提供更多的休息时间。有关更多详细信息,请参阅
如果您介于上述两者之间,那么任何带有稳定驱动程序的低成本 PCI 网卡都可以为您完成工作。
我听说有适用于我的网卡的更新或初步/alpha 驱动程序。我在哪里可以得到它?
最新的“新”驱动程序可以在 Donald 的 WWW 站点上找到:www.scyld.com
- 这里的东西变化很快,所以四处看看就行了。或者,在 WWW 浏览器上使用
来找到您正在寻找的驱动程序可能会更容易。(注意那些静默地修改源代码的 WWW 浏览器,例如用空格替换 TAB 等 - 如果不确定,请使用 ftp,或者至少使用 FTP URL 进行下载。)
现在,如果它真的是 alpha 或 pre-alpha 驱动程序,那么请将其视为如此。换句话说,不要抱怨您无法弄清楚如何使用它。如果您无法弄清楚如何安装它,那么您可能不应该测试它。此外,如果它导致您的机器崩溃,请不要抱怨。相反,请向我们发送一份文档完善的错误报告,甚至更好的,一个补丁!
请注意,一些“可用”的实验性/alpha 驱动程序已包含在标准内核源代码树中。当运行 make config
时,您将被问到的第一件事是是否“提示开发和/或不完整的代码/驱动程序”。您必须在此处回答“Y”才能被询问是否包含任何 alpha/实验性驱动程序。
需要做些什么才能使 Linux 可以运行两个或多个以太网卡?
这个问题的答案取决于驱动程序是作为可加载模块使用还是直接编译到内核中。大多数 Linux 发行版现在都使用模块化驱动程序。这节省了分发大量内核的麻烦,每个内核都内置了不同的驱动程序集。相反,使用单个基本内核,并在系统启动到足以访问驱动程序模块文件(通常存储在 /lib/modules/
中)后加载特定用户系统所需的各个驱动程序。
对于 PCI 网卡,PCI 驱动程序/模块应自动检测到它支持的所有已安装网卡。除非个别驱动程序文档明确指示这样做以支持某些非标准机器,否则用户不应提供任何 I/O 基地址或 IRQ 信息。
早期的一些内核对启动时可以检测到的以太网卡数量限制为 16 个,而一些 ISA 模块对每个加载的模块的网卡数量限制为 4 个。如果这是一个限制,您可以始终加载同一模块的另一个副本并使用不同的名称来支持另外四个网卡,或者重新编译模块以支持您需要的数量。
对于 ISA 网卡,探测网卡不是一个安全的操作,因此您通常需要提供网卡的 I/O 基地址,以便模块知道在哪里查找。此信息存储在文件 /etc/modules.conf
中。
例如,考虑一个用户有两个 ISA NE2000 网卡,一个在 0x300
,另一个在 0x240
,以及他们在 /etc/modules.conf
文件中应该有的行
alias eth0 ne alias eth1 ne options ne io=0x240,0x300
它的作用:这表示如果管理员(或内核)执行 modprobe eth0
或 modprobe eth1
,则应该为 eth0
或 eth1
加载 ne.o
驱动程序。此外,当加载 ne.o
模块时,应该使用选项 io=0x240,0x300
加载它,以便驱动程序知道在哪里查找网卡。请注意,0x
很重要 - 像 300h
这样在 DOS 世界中常用的东西不起作用。切换 0x240
和 0x300
的顺序将切换哪个物理网卡最终成为 eth0
和 eth1
。
大多数 ISA 模块驱动程序都可以像此示例一样使用多个逗号分隔的 I/O 值来处理多个网卡。但是,一些(较旧的?)驱动程序,例如 3c501.o 模块,目前每个模块加载只能处理一张网卡。在这种情况下,您可以加载两次模块以检测到两张网卡。在这种情况下,/etc/modules.conf
文件将如下所示
alias eth0 3c501 alias eth1 3c501 options eth0 -o 3c501-0 io=0x280 irq=5 options eth1 -o 3c501-1 io=0x300 irq=7
在此示例中,使用了 -o
选项为模块的每个实例提供唯一的名称,因为您不能加载两个名称相同的模块。irq=
选项也用于指定网卡的硬件 IRQ 设置。(此方法也可以用于接受逗号分隔 I/O 值的模块,但效率较低,因为模块最终会被加载两次,而实际上没有必要。)
作为最后一个示例,考虑一个用户,他有一张 3c503 网卡,地址为 0x350
,另一张 SMC Elite16 (wd8013) 网卡,地址为 0x280
。他们将拥有
alias eth0 wd alias eth1 3c503 options wd io=0x280 options 3c503 io=0x350
对于 PCI 网卡,您通常只需要 alias
行将 ethN
接口与相应的驱动程序名称关联起来,因为可以安全地检测到 PCI 网卡的 I/O 基地址。
可用的模块通常存储在 /lib/modules/`uname -r`/net
中,其中 uname -r
命令给出内核版本(例如 2.0.34)。您可以在那里查看哪个模块与您的网卡匹配。在 modules.conf
文件中设置正确的设置后,您可以使用以下命令进行测试
modprobe eth0 modprobe eth1 ... modprobe ethN-1
其中“N”是您拥有的以太网接口的数量。请注意,内核分配给驱动程序的接口名称(ethX
)与别名行上使用的名称无关。有关此内容的更多详细信息,请参阅:将以太网驱动程序用作模块
由于某些 ISA 网卡探测可能会使机器挂起,因此直到包括 2.4 的内核默认情况下仅自动探测一个 ISA 以太网卡。由于不再有内置大量 ISA 驱动程序的发行版内核,因此 2.6 和更新版本中不再存在此限制。
从 2.2 和更新版本的内核开始,启动探测已分类为安全和不安全,以便所有安全(例如 PCI 和 EISA)探测都将自动找到所有相关网卡。具有多个以太网卡的系统,其中至少有一个是以太网 ISA 网卡,仍需要执行以下操作之一。)
有两种方法可以启用第二个(以及第三个,等等)网卡的自动探测。最简单的方法是将启动时参数传递给内核,这通常由 LILO 完成。可以通过使用像 ether=0,0,eth1
这样简单的启动时参数来实现第二个网卡的探测。在这种情况下,eth0
和 eth1
将按照启动时找到网卡的顺序分配。假设您希望地址为 0x300
的网卡为 eth0
,地址为 0x280
的网卡为 eth1
,那么您可以使用
LILO: linux ether=5,0x300,eth0 ether=15,0x280,eth1
ether=
命令接受的不仅仅是上面显示的 IRQ + I/O + 名称。请查看 传递以太网参数... 以获取完整语法、特定于网卡的参数和 LILO 提示。
第二种方法(不推荐)是编辑文件 Space.c
并将 I/O 地址的 0xffe0
条目替换为零。0xffe0
条目告诉它不要探测该设备 - 将其替换为零将启用该设备的自动探测。
ether=
命令对我没有任何作用。为什么?
如上所述,ether=
命令仅适用于编译到内核中的驱动程序。现在大多数发行版都以模块化形式使用驱动程序,因此 ether=
命令很少再使用。(一些较旧的文档尚未更新以反映此更改。)如果您想为模块化以太网驱动程序应用选项,您必须更改 /etc/modules.conf
文件。
如果您正在使用编译的驱动程序,并且已将 ether=
添加到您的 LILO 配置文件中,请注意,在您重新运行 lilo
以处理更新的配置文件之前,它不会生效。
问题: PCI NE2000 克隆卡在 v2.0.x 启动时未检测到。
原因: 直到 v2.0.30 的 ne.c
驱动程序仅知道基于 RealTek 8029 的克隆卡的 PCI ID 号。从那时起,其他几家公司也发布了具有不同 PCI ID 号的 PCI NE2000 克隆卡,因此驱动程序无法检测到它们。
解决方案: 最简单的解决方案是升级到 v2.0.31(或更新版本)的 Linux 内核。它知道大约五个不同的 NE2000-PCI 芯片的 ID 号,并且将在启动时或模块加载时自动检测到它们。如果您升级到 2.0.34(或更新版本),则有一个仅限 PCI 的特定 NE2000 驱动程序,它比原始 ISA/PCI 驱动程序更小、更高效。
问题: PCI NE2000 克隆卡在启动时或当我为 v2.0.x 加载 ne.o 模块时,报告为 ne1000(8 位卡!),因此无法工作。
原因: 一些 PCI 克隆卡不实现字节宽度访问(因此不是真正的 100% NE2000 兼容)。这导致探测认为它们是 NE1000 网卡。
解决方案: 您需要升级到 v2.0.31(或更新版本),如上所述。驱动程序现在检查此硬件错误。
问题: PCI NE2000 网卡性能非常差,即使在降低性能提示部分中描述的窗口大小也是如此。
原因: 十多年前设计和销售的原始 8390 芯片的规格表指出,为了获得最大的可靠性,每次写入操作之前都需要从芯片进行虚拟读取。驱动程序具有执行此操作的功能,但自 v1.2 内核时代以来,默认情况下已禁用此功能。一位用户报告说,重新启用此“错误功能”有助于他们使用廉价 PCI NE2000 克隆卡的性能。
解决方案: 由于只有一个人报告说这是一个解决方案,所以不要抱太大的希望。重新启用写入前读取修复程序只需编辑 linux/drivers/net/
中的驱动程序文件,取消注释包含 NE_RW_BUGFIX
的行,然后根据需要重新构建内核或模块即可。如果这有帮助,请发送电子邮件描述性能差异以及您拥有的网卡/芯片类型。(对于 ne2k-pci.c
驱动程序也可以这样做)。
问题: ne2k-pci.c
驱动程序报告错误消息,例如 timeout waiting for Tx RDC
,并且 PCI NE2000 网卡无法正常工作。
原因: 您的网卡和/或网卡到 PCI 总线的链接无法处理此驱动程序中使用的长字 I/O 优化。
解决方案: 首先,检查 BIOS/CMOS 设置中可用的设置,看看是否有任何与 PCI 总线时序相关的设置对于可靠运行来说过于激进。否则,使用 ISA/PCI ne.c
驱动程序(或从 ne2k-pci.c
中删除 #define USE_LONGIO
)应该可以让您使用该网卡。
问题: ISA 即插即用 NE2000(例如 RealTek 8019)未检测到。
原因: 原始 NE2000 规范(以及旧内核中的 Linux NE2000 驱动程序)不支持即插即用。
解决方案: 要么使用带有 PnP 的 NE2000 驱动程序的 2.4 或更新版本的内核,要么使用网卡随附的 DOS 配置磁盘禁用 PnP,并将网卡设置为指定的 I/O 地址和 IRQ。在 /etc/modules.conf
中添加一行,例如 options ne io=0xNNN
,其中 0xNNN
是您将网卡设置为的十六进制 I/O 地址。(这假设您使用的是模块化驱动程序;如果不是,则在启动时使用 ether=0,0xNNN,eth0
参数)。您可能还需要进入 BIOS/CMOS 设置并将 IRQ 标记为 Legacy-ISA 而不是 PnP。
问题: NE*000 驱动程序在启动探测期间报告“not found (no reset ack)”。
原因: 这与上述更改有关。在初步验证 8390 是否在探测的 I/O 地址之后,执行重置。当网卡完成重置时,它应该确认重置已完成。您的网卡没有这样做,因此驱动程序假定不存在 NE 网卡。
解决方案: 您可以通过在启动时使用另一个未使用的 mem_end
十六进制值 0xbad
来告诉驱动程序您有一个坏网卡。当使用 0xbad
覆盖时,您必须还为网卡提供非零 I/O 基地址。例如,地址为 0x340
且不确认重置的网卡将使用类似这样的内容
LILO: linux ether=0,0x340,0,0xbad,eth0
即使您的网卡不 ACK 重置,这也将允许网卡检测继续进行。如果您将驱动程序用作模块,那么您可以像提供 I/O 地址一样提供选项 bad=0xbad
。
问题: NE*000 网卡在首次网络访问时使机器挂起。
原因: 从 1.1.57 到现在的内核都报告了这个问题。它似乎仅限于少数软件可配置的克隆卡。似乎他们希望以某种特殊方式进行初始化。
解决方案: 几个人报告说,在暖启动(即 loadlin 或“三指礼”)进入 Linux 之前运行随附的 DOS 软件配置程序和/或随附的 DOS 驱动程序使网卡能够工作。这表明这些网卡需要以一种特定的方式进行初始化,这与当前的 Linux 驱动程序所做的略有不同。
问题: 地址为 0x360
的 NE*000 以太网卡未被检测到。
原因: 您的 NE2000 网卡在 I/O 空间中为 0x20
宽,这使其与地址为 0x378
的并行端口冲突。可能在那里存在的其他设备是地址为 0x370
的第二个软盘控制器(如果配备)和地址为 0x376--0x377
的辅助 IDE 控制器。如果端口已由另一个驱动程序注册,则内核将不允许进行探测。
解决方案: 要么将您的网卡移动到像 0x280, 0x340, 0x320
这样的地址,要么在编译时不包含并行打印机支持。
问题: 每次我打印东西时,网络“消失”(NE2000)
原因: 与上述问题相同,但您有一个较旧的内核,它不检查重叠的 I/O 区域。使用与上述相同的修复程序,并在您执行此操作时获取一个新的内核。
问题: NE*000 以太网卡在 0xNNN 处的探测:00 00 C5 ... 未找到。(无效签名 yy zz)
原因: 首先,您在地址 0xNNN 处有 NE1000 还是 NE2000 网卡?如果是这样,报告的硬件地址看起来是有效的地址吗?如果是这样,那么您有一个糟糕的 NE*000 克隆卡。所有 NE*000 克隆卡都应该在网卡上的 SA PROM 的字节 14 和 15 中具有值 0x57
。您的网卡没有 - 它有“yy zz”代替。
解决方案: 有两种方法可以解决这个问题。最简单的方法是使用 0xbad
mem_end 值,如上文针对“no reset ack”问题所述。只要还给出了非零 I/O 基地址,这将绕过签名检查。这样就不需要重新编译内核。
第二种方法(适用于黑客)涉及更改驱动程序本身,然后重新编译您的内核(或模块)。驱动程序 (/usr/src/linux/drivers/net/ne.c) 在大约第 42 行有一个“耻辱堂”列表。此列表用于检测不良克隆卡。例如,DFI 网卡在 PROM 的前 3 个字节中使用“DFI”,而不是像他们应该做的那样在字节 14 和 15 中使用 0x57
。
问题: 机器在启动期间在“8390...”或“WD....”消息后立即挂起。删除 NE2000 可以解决问题。
解决方案: 将您的 NE2000 基地址更改为像 0x340
这样的地址。或者,您可以将“reserve=”启动参数与“ether=”参数结合使用,以保护网卡免受其他设备驱动程序探测的影响。
原因: 您的 NE2000 克隆卡不够好。活动的 NE2000 是一个无底洞,它会捕获任何在其空间中进行自动探测的驱动程序。将 NE2000 更改为不太常用的地址将使其远离其他自动探测,从而允许您的机器启动。
问题: 机器在启动期间的 SCSI 探测期间挂起。
原因: 这与上述问题相同,更改以太网卡的地址,或使用 reserve/ether 启动参数。
问题: 机器在启动期间的声卡探测期间挂起。
原因: 不,那实际上是在静默 SCSI 探测期间,并且与上述问题相同。
问题: 启动时未检测到 NE2000 - 完全没有启动消息
解决方案: 没有“神奇的解决方案”,因为可能有多种原因导致它未被检测到。以下列表应帮助您逐步解决可能的问题。
1) 构建一个新的内核,其中仅包含您需要的设备驱动程序。验证您确实正在启动新的内核。忘记运行 lilo 等可能会导致启动旧的内核。(仔细查看启动时报告的构建时间和日期。)听起来很明显,但我们以前都做过。通过检查 System.map
文件中是否有名为 ne_probe
之类的名称,确保驱动程序实际上包含在新内核中。
2) 仔细查看启动消息。它是否甚至提到进行 ne2k 探测,例如“NE*000 probe at 0xNNN: not found (blah blah)”,还是只是静默失败。两者有很大的不同。登录后使用 dmesg|more
查看启动消息,或在启动完成并且出现登录提示后按 Shift-PgUp 向上滚动屏幕。
3) 启动后,执行 cat /proc/ioports
并验证网卡将需要的完整 iospace 是否为空。如果您位于 0x300
,则 ne2k 驱动程序将请求 0x300-0x31f
。如果任何其他设备驱动程序已注册该范围内的任何一个端口,则探测将不会在该地址发生,并将静默地继续到下一个探测地址。常见的情况是 lp 驱动程序保留 0x378
或辅助 IDE 通道保留 0x376
,这会阻止 ne 驱动程序探测 0x360-0x380
。
4) 与上面的 cat /proc/interrupts
相同。确保没有其他设备注册了您为以太网卡设置的中断。在这种情况下,探测将发生,并且以太网驱动程序将在启动时大声抱怨无法获得所需的 IRQ 行。
5) 如果您仍然对驱动程序的静默失败感到困惑,请编辑它并在探测中添加一些 printk()。例如,对于 ne2k,您可以在 linux/drivers/net/ne.c
中添加/删除行(标记为“+”或“-”),如下所示
int reg0 = inb_p(ioaddr); + printk("NE2k probe - now checking %x\n",ioaddr); - if (reg0 == 0xFF) + if (reg0 == 0xFF) { + printk("NE2k probe - got 0xFF (vacant I/O port)\n"); return ENODEV; + }
然后它将为它检查的每个端口地址输出消息,您将看到是否正在探测您的网卡地址。
6) 您还可以从 Don 的 ftp 站点(在 howto 中也提到过)获取 ne2k 诊断程序,看看它是否能够在您启动到 Linux 后检测到您的网卡。使用“-p 0xNNN
”选项告诉它在哪里查找网卡。(默认值为 0x300
,它不会像启动时探测那样在其他地方查找。)当它找到网卡时,输出将如下所示
Checking the ethercard at 0x300. Register 0x0d (0x30d) is 00 Passed initial NE2000 probe, value 00. 8390 registers: 0a 00 00 00 63 00 00 00 01 00 30 01 00 00 00 00 SA PROM 0: 00 00 00 00 c0 c0 b0 b0 05 05 65 65 05 05 20 20 SA PROM 0x10: 00 00 07 07 0d 0d 01 01 14 14 02 02 57 57 57 57 NE2000 found at 0x300, using start page 0x40 and end page 0x80.
您的寄存器值和 PROM 值可能会有所不同。请注意,对于 16 位网卡,所有 PROM 值都翻倍,并且以太网地址 (00:00:c0:b0:05:65) 出现在第一行,双 0x57
签名出现在 PROM 的末尾。
当 0x300
未安装网卡时,输出将如下所示
Checking the ethercard at 0x300. Register 0x0d (0x30d) is ff Failed initial NE2000 probe, value ff. 8390 registers: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff SA PROM 0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff SA PROM 0x10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff Invalid signature found, wordlength 2.
0xff
值之所以出现,是因为这是读取空闲 I/O 端口时返回的值。如果您碰巧在探测区域中有其他硬件,您也可能会看到一些非 0xff
值。
7) 在运行随附的 DOS 驱动程序或配置程序后,尝试从 DOS 启动软盘(通过 loadlin)暖启动到 Linux。它可能正在执行一些额外的(即非标准的)“魔法”来初始化网卡。
8) 尝试 Russ Nelson 的 ne2000.com 数据包驱动程序,看看它是否甚至可以看到您的网卡 - 如果看不到,那么情况不妙。例子
A:> ne2000 0x60 10 0x300
参数是软件中断向量、硬件 IRQ 和 I/O 基地址。您可以从 pktdrv11.zip 中的任何 msdos 存档中获取它 - 当前版本可能比 11 更新。
问题: 您收到如下消息
eth0: bogus packet size: 65531, status=0xff, nxpg=0xff
原因: 存在共享内存问题。
解决方案: 最常见的原因是 PCI 机器未配置为映射 ISA 内存设备。因此,您最终读取的是 PC 的 RAM(所有 0xff
值),而不是网卡上的 RAM,其中包含来自接收数据包的数据。
其他容易修复的典型问题是板卡冲突、为该区域启用缓存或“影子 ROM”,或者以超过 8Mhz 的速度运行 ISA 总线。以太网卡上也存在大量令人惊讶的内存故障,因此如果您有适用于您的以太网卡的诊断程序,请运行一个。
问题: SMC EtherEZ 在非共享内存 (PIO) 模式下无法工作。
原因: 较旧版本的 Ultra 驱动程序仅支持共享内存模式下的网卡。
解决方案: 2.0 及更高版本内核中的驱动程序也支持编程 I/O 模式。升级到 v2.0 或更高版本。
问题: 旧的 wd8003 和/或跳线可设置的 wd8013 始终获得错误的 IRQ。
原因: 旧的 wd8003 网卡和跳线可设置的 wd8013 克隆卡没有驱动程序可以从中读取 IRQ 设置的 EEPROM。如果驱动程序无法读取 IRQ,那么它会尝试自动 IRQ 来找出它是什么。如果自动 IRQ 返回零,则驱动程序只需为 8 位网卡分配 IRQ 5,为 16 位网卡分配 IRQ 10。
解决方案: 避免使用自动 IRQ 代码,并在您的模块配置文件中(或通过内核驱动程序的启动时参数)告诉内核您已跳线到网卡的 IRQ。
问题: SMC Ultra 网卡被检测为 wd8013,但 IRQ 和共享内存基地址错误。
原因: Ultra 网卡看起来很像 wd8013,如果内核中不存在 Ultra 驱动程序,wd 驱动程序可能会将 ultra 误认为 wd8013。ultra 探测在 wd 探测之前进行,因此通常不应该发生这种情况。ultra 将 IRQ 和内存基地址以与 wd8013 不同的方式存储在 EEPROM 中,因此报告的值是错误的。
解决方案: 重新编译内核时仅包含您需要的驱动程序。如果您的机器中混合使用了 wd 和 ultra 网卡,并且正在使用模块,则首先加载 ultra 模块。
问题: 3c503 选择 IRQ N,但某些其他设备需要 IRQ N。(例如 CD-ROM 驱动程序、调制解调器等)可以在不将其编译到内核中的情况下修复此问题吗?
解决方案: 3c503 驱动程序按顺序 {5, 9/2, 3, 4} 探测空闲 IRQ 线,它应该选择一条未被使用的线。驱动程序在将网卡 ifconfig
投入运行时选择。
如果您使用的是模块化驱动程序,则可以使用模块参数来设置各种内容,包括 IRQ 值。
以下选择 IRQ9,基地址 0x300
,<忽略值>,和 if_port #1(外部收发器)。
io=0x300 irq=9 xcvr=1
或者,如果驱动程序被编译到内核中,您可以通过 LILO 传递参数在启动时设置相同的值。
LILO: linux ether=9,0x300,0,1,eth0
以下选择 IRQ3,探测基地址,<忽略的值>,以及默认的 if_port #0(内部收发器)
LILO: linux ether=3,0,0,0,eth0
问题: 3c503: 配置的中断 X 无效,将使用 autoIRQ。
原因: 3c503 卡只能使用 IRQ{5, 2/9, 3, 4} 中的一个(这些是唯一连接到卡的线路。)如果您传入的 IRQ 值不在上述集合中,您将收到上述消息。通常,为 3c503 指定中断值是不必要的。3c503 将在 ifconfig 时自动进行 autoIRQ,并选择 IRQ{5, 2/9, 3, 4} 中的一个。
解决方案: 使用上面列出的有效 IRQ 之一,或者通过完全不指定 IRQ 线路来启用 autoIRQ。
问题: 提供的 3c503 驱动程序不使用 AUI (粗缆) 端口。如何选择它而不是默认的细缆端口?
解决方案: 3c503 AUI 端口可以在启动时为内核驱动程序选择,也可以在模块插入时为模块化驱动程序选择。选择被重载到当前未使用的 dev->rmem_start 变量的低位,因此启动参数为
LILO: linux ether=0,0,0,1,eth0
应该适用于内核驱动程序。
要在作为模块加载时指定 AUI 端口,只需将 xcvr=1
附加到模块选项行,以及您的 I/O 和 IRQ 值。
为了获得最佳效果(和最小的麻烦),建议您使用随卡提供的(通常是 DOS)程序禁用 ISA-PnP 机制,并将其设置为固定的 I/O 地址和 IRQ。确保驱动程序在启动时探测到您使用的 I/O 地址,或者如果使用模块,则在 /etc/modules.conf
中提供该地址作为 io=
选项。您可能还需要进入 BIOS/CMOS 设置并将 IRQ 标记为 Legacy-ISA 而不是 ISA-PnP(如果您的计算机有此选项)。
请注意,您通常不需要安装 DOS 即可运行基于 DOS 的配置程序。您通常只需启动 DOS 软盘并从提供的软盘运行它们。您还可以免费下载 OpenDOS 和 FreeDOS。
如果您需要启用 ISA-PnP 以与某些其他操作系统兼容,那么您必须执行的操作取决于您使用的内核版本。对于 2.2.x 和更早版本的内核,您必须使用 isapnptools 包与 linux 在每次启动时配置卡。您仍然必须确保驱动程序探测到为卡选择的 I/O 地址,或者作为 io=
选项提供。对于 2.4.x 和更新版本的内核,内核中内置了 ISA-PnP 支持(如果在构建时选择),并且如果您的特定驱动程序利用了此支持,那么您的卡将被配置为可用的 I/O 地址和 IRQ,而无需任何用户提供的选项值。您不希望同时尝试使用用户空间的 isapnptools 和内核中的 ISA-PnP 支持。
某些系统在 BIOS/CMOS 设置菜单中有一个“启用 PnP 操作系统”(或类似名称)选项,该选项与 ISA-PnP 硬件实际上没有任何关系。有关此选项的更多详细信息,请参见下文。
某些 PCI BIOS 可能不会在启动时启用所有 PCI 卡,特别是如果启用了 BIOS 选项“PnP OS”。此误功能是为了支持当前版本的 Windows,该版本仍使用一些实模式驱动程序。禁用此选项,或尝试升级到具有启用禁用卡代码的较新驱动程序。
请注意,内核版本 2.4.x 对处理此选项有更好的支持 - 特别是您应该能够启用此选项,并且内核/驱动程序应该能够自行设置和/或启用卡。
PCI 规范的第 1 版允许某些插槽成为总线主控,而某些插槽成为从属(非总线主控)插槽。为了避免人们将 BM 卡插入从属插槽相关联的问题,PCI 规范的 v2 版本规定所有插槽都应具备 BM 功能。然而,大多数 PCI 芯片组只有四个 BM 引脚,因此如果您有五个插槽的板,则两个插槽很可能共享一个 BM 引脚!这允许板满足 v2 规范的要求(但不是意图)。因此,如果您有一堆卡,并且其中两个卡无法工作,则它们可能位于共享 BM 引脚的插槽中。
/etc/conf.modules
而不是 /etc/modules.conf
。
较旧的发行版将具有 conf.modules
而不是 modules.conf
,后者是两者中更合理的名称。较新的模块实用程序程序期望使用新名称,因此如果您升级较旧的系统,请记住这一点。
通常的原因是人们正在使用不支持其特定卡的内核。对于模块化内核,通常意味着尚未请求加载所需的模块。
如果您正在使用基于模块的内核,例如大多数 linux 发行版安装的内核,请尝试使用发行版的配置实用程序来选择您卡的模块。对于 ISA 卡,最好确定卡的 I/O 地址,并在配置实用程序要求任何选项时将其添加为选项(例如 io=0x340
)。如果没有配置实用程序,那么您将必须将正确的模块名称(和选项)添加到 /etc/modules.conf
-- 有关更多详细信息,请参见 man modprobe
。
下一个主要原因是另一个设备正在使用您的卡需要的 I/O 空间的一部分。大多数卡的 I/O 空间宽度为 16 或 32 字节。如果您的卡设置为 0x300
且宽度为 32 字节,则驱动程序将请求 0x300-0x31f
。如果任何其他设备驱动程序已注册该范围内的任何一个端口,则探测将不会在该地址发生,并且驱动程序将静默地继续探测的下一个地址。因此,启动后,执行 cat /proc/ioports
并验证卡将需要的完整 I/O 空间是否为空闲。
另一个问题是您的卡跳线到默认情况下未探测的 I/O 地址。每个驱动程序的探测地址列表很容易在驱动程序源代码中的文本注释之后找到。即使您的卡的 I/O 设置不在探测地址列表中,您也可以使用 ether=
命令在启动时提供它(对于内核驱动程序),如 传递以太网参数... 中所述。模块化驱动程序可以使用 /etc/modules.conf
中的 io=
选项来指定默认情况下未探测的地址。
unresolved symbol ei_open
并且无法加载。
您正在使用许多在板上装有 8390 芯片(或克隆)的以太网卡之一。对于此类卡,驱动程序分为两部分 - 您尝试加载失败的部分(例如 ne2k-pci.o, ne.o, wd.o, smc-ultra.o
等)和 8390 部分。这些驱动程序在供应商特定信息列表中,其模块名称旁边列出了 (+8390)。( 供应商特定...)
您必须确保 8390.o
模块在加载驱动程序的后半部分之前加载,以便驱动程序的后半部分可以找到它需要的 8390.o
中的函数。
可能的原因:(1)安装新内核和模块后忘记运行 depmod,导致模块依赖关系(如这种关系)自动处理。(2)使用 insmod
而不是 modprobe
,因为 insmod 不检查任何模块排序约束。(3)模块 8390.o
不在驱动程序后半部分所在的目录旁边,而应该在那里。
ifconfig
报告卡的错误 I/O 地址。
不,它没有。您只是错误地解释了它。这不是一个错误,并且报告的数字是正确的。只是碰巧一些基于 8390 的卡(wd80x3、smc-ultra 等)的实际 8390 芯片位于距第一个分配的 I/O 端口的偏移量处。这是存储在 dev->base_addr
中的值,也是 ifconfig
报告的内容。如果您想查看您的卡使用的完整端口范围,请尝试 cat /proc/ioports
,这将给出您期望的数字。
0xffff
)
这通常会显示为读取大量 0xffff
值。除非您正确设置了 PCI ROM BIOS/CMOS SETUP 配置,否则任何类型的共享内存卡都无法在 PCI 机器中工作。您必须将其设置为允许来自 ISA 总线的共享内存访问,用于您的卡尝试使用的内存区域。如果您无法确定哪些设置适用,请咨询您的供应商或当地的计算机专家。对于 AMI BIOS,通常有一个“即插即用”部分,其中将有“ISA 共享内存大小”和“ISA 共享内存基址”设置。对于 wd8013 和 SMC Ultra 等卡,将大小从默认的“禁用”更改为 16kB,并将基址更改为您的卡的共享内存地址。
执行 cat /proc/interrupts
。您的卡生成的中断事件总数将显示在上述列表中。如果它为零和/或在您尝试使用卡时没有增加,那么可能与计算机中安装的另一个设备存在物理中断冲突(无论另一个设备是否安装/可用驱动程序)。将其中一个设备的 IRQ 更改为可用 IRQ。
Werner Almesberger 一直在致力于 Linux 的 ATM 支持。他一直在使用 Efficient Networks ENI155p 板(Efficient Networks)和 Zeitnet ZN1221 板(Zeitnet)。
Werner 说 ENI155p 的驱动程序相当稳定,而 ZN1221 的驱动程序目前尚未完成。
在以下 URL 查看最新/更新的状态
Linux 是否有千兆以太网支持?
是的,目前有几种。一位著名的 Linux 网络开发人员对带有 linux 驱动程序的卡的性能评估如下:1) Intel E1000, 2) Tigon2/Acenic, 3) SysKonnect sk-98xx, 4) Tigon3/bcm57xx。这是截至 2002 年 3 月的情况,当然可能会发生变化。
Linux 是否有 FDDI 支持?
是的。Larry Stefani 为 v2.0 编写了 Digital 的 DEFEA (FDDI EISA) 和 DEFPA (FDDI PCI) 卡的驱动程序。这已包含在 v2.0.24 内核中。目前尚不支持其他卡。
全双工会给我 20MBps 吗?Linux 是否支持它?
Cameron Spitzer 撰写了以下关于全双工 10Base-T 卡的内容:“如果您将其连接到全双工交换式集线器,并且您的系统足够快且没有做太多其他事情,它可以使链路在两个方向上都保持繁忙。不存在全双工 10BASE-2 或 10BASE-5(细缆和粗缆)。全双工的工作方式是禁用适配器中的冲突检测。这就是为什么您不能使用同轴电缆进行操作的原因;LAN 不会那样运行。10BASE-T (RJ45 接口) 使用单独的电线进行发送和接收,因此可以同时双向运行。交换集线器负责处理冲突问题。信号速率为 10 Mbps。”
因此,如您所见,您仍然只能以 10Mbps 的速度接收或发送,因此不要期望性能提高 2 倍。至于是否支持,这取决于卡,也可能取决于驱动程序。某些卡可能进行自动协商,某些卡可能需要驱动程序支持,而某些卡可能需要用户在卡的 EEPROM 配置中选择一个选项。只有认真的/重度用户才会注意到两种模式之间的差异。
如果您在多处理器 (MP) 计算机上花费了额外的钱,那么也请购买一张好的以太网卡。对于 v2.0 内核,这实际上不是问题,但对于 v2.2 内核来说绝对是问题。大多数较旧的非智能(例如 ISA 总线 PIO 和共享内存设计)卡在设计时从未考虑过在 MP 机器上使用。执行摘要是购买智能的现代设计卡,并确保驱动程序已编写(或更新)以处理 MP 操作。(这里的关键词是“现代设计” - PCI-NE2000 只是现代总线上的 10 多年前的设计。)在驱动程序源代码中查找文本 spin_lock
是驱动程序已编写为处理 MP 操作的一个很好的指示。以下是为什么您应该为 MP 使用购买好卡(以及如果不这样做会发生什么)的完整详细信息。
在 v2.0 内核中,在任何给定时间只允许一个处理器“在内核中”(即更改内核数据和/或运行设备驱动程序)。因此,从卡(和关联的驱动程序)的角度来看,与单处理器 (UP) 操作没有什么不同,并且事情继续正常工作。(这是获得 Linux 工作 MP 版本的最简单方法 - 围绕整个内核的一个大锁只允许一次一个处理器进入。这样您就知道不会有两个处理器试图同时更改同一件事!)
一次只允许一个处理器进入内核的缺点是,只有当运行的程序是独立的且计算密集型时,您才能获得 MP 性能。如果程序执行大量输入/输出 (I/O),例如读取或写入数据到磁盘或通过网络,那么除了一个处理器之外的所有处理器都将被阻塞,等待它们的 I/O 请求完成,而一个在内核中运行的处理器会拼命尝试运行所有设备驱动程序来满足 I/O 请求。内核成为瓶颈,并且由于只有一个处理器在内核中运行,因此在重 I/O、单锁情况下,MP 机器的性能会迅速降低到接近单处理器机器的水平。
由于这显然不理想(特别是对于文件/WWW 服务器、路由器等),v2.2 内核具有更细粒度的锁定 - 这意味着一次可以有多个处理器在内核中。不是围绕整个内核的一个大锁,而是有许多较小的锁来保护关键数据免受多个处理器同时操作 - 例如,一个处理器可以运行网卡的驱动程序,而另一个处理器可以同时运行磁盘驱动程序的驱动程序。
好的,考虑到所有这些,这里有一些问题:更细粒度的锁定意味着您可能有一个处理器试图通过以太网驱动程序发送数据,而另一个处理器试图访问同一驱动程序/卡来做其他事情(例如获取卡的统计信息以用于 cat /proc/net/dev
)。糟糕 - 您的卡统计信息刚刚通过电线发送出去,而您得到了统计信息的数据。是的,卡被要求同时执行两项(或更多!)任务而感到困惑,并且很可能在此过程中使您的机器崩溃。
因此,在 UP 中工作的驱动程序不再足够好 - 它需要使用锁进行更新,以控制对底层卡的访问,以便接收、发送和配置数据操作这三个任务串行化到卡稳定运行所需的程度。这里可怕的部分是,尚未更新锁以实现稳定 MP 操作的驱动程序在轻网络负载下的 MP 机器中可能看起来正在工作,但是当两个(或更多!)处理器尝试同时执行这三个任务中的多个任务时,将会使机器崩溃或至少表现出奇怪的行为。
更新的 MP 感知以太网驱动程序(至少)需要围绕驱动程序的锁,该锁将从内核进入驱动程序的入口点的访问限制为“一次一个”。有了这个,事情将被串行化,以便底层硬件应该被视为就像在 UP 机器中使用一样,因此它应该是稳定的。缺点是围绕整个以太网驱动程序的一个锁具有与围绕整个内核的一个大锁相同的负面性能影响(但在较小的范围内) - 即,您一次只能有一个处理器处理卡。[技术说明:如果需要添加的锁是 irqsave
类型并且它们被持有很长时间,则性能影响也可能包括增加中断延迟。]
可以通过两种方式改进这种情况。您可以尝试最大限度地缩短获取锁和释放锁之间的时间,和/或您可以在驱动程序内实现更细粒度的锁定(例如,如果一个或两个锁保护免受同时访问卡上几个敏感寄存器/设置就足够了,那么围绕整个驱动程序的锁将是过度的)。
但是,对于从未设计用于 MP 的较旧的非智能卡,这些改进都可能是不可行的。更糟糕的是,非智能卡通常需要处理器在卡和计算机内存之间移动数据,因此在最坏的情况下,在通过 ISA 总线移动每个 1.5kB 数据包的整个过程中,锁将被持有。
更现代的智能卡通常将网络数据直接移动到计算机内存和从计算机内存移动,而无需处理器的任何帮助。这是一个巨大的胜利,因为锁只在处理器告诉卡在内存中的哪个位置获取/存储下一个网络数据包所需的短时间内被持有。更现代的卡设计也不太可能需要围绕整个驱动程序的单个大锁。
截至 v2.0,只有 3c509、depca、de4x5、pcnet32 和所有 8390 驱动程序(wd、smc-ultra、ne、3c503 等)已被“架构独立化”,以便在基于 DEC Alpha CPU 的系统上工作。来自 Donald 的 WWW 页面的其他更新的 PCI 驱动程序也可能工作,因为这些驱动程序在编写时考虑了架构独立性。
请注意,使驱动程序架构独立所需的更改并不那么复杂。您只需要执行以下操作
-将所有与 jiffies
相关的值乘以 HZ/100,以说明 Alpha 使用的不同 HZ 值。(即 timeout=2;
变为 timeout=2*HZ/100;
)
-将任何 I/O 内存(640k 到 1MB)指针解引用替换为适当的 readb() writeb() readl() writel() 调用,如本示例所示。
- int *mem_base = (int *)dev->mem_start; - mem_base[0] = 0xba5eba5e; + unsigned long mem_base = dev->mem_start; + writel(0xba5eba5e, mem_base);
-将所有以 I/O 内存作为源或目标目的地的 memcpy() 调用替换为适当的 memcpy_fromio()
或 memcpy_toio()
之一。
有关以架构独立的方式处理内存访问的详细信息,请参阅最新内核附带的文件 linux/Documentation/IO-mapping.txt
。
有关 Sparc 内容的最新信息,请尝试以下 URL
请注意,某些 Sparc 以太网硬件从主机计算机获取其 MAC 地址,因此您最终可能会得到多个具有相同 MAC 地址的接口。如果您需要在同一网络上放置多个接口,请使用 ifconfig
的 hw
选项来分配唯一的 MAC 地址。
将 PCI 驱动程序移植到 Sparc 平台的问题与上面针对 AXP 平台提到的问题类似。此外,可能还存在一些字节序问题,因为 Sparc 是大端字节序,而 AXP 和 ix86 是小端字节序。
还有其他几个硬件平台可以运行 Linux,例如 Atari/Amiga (m68k)。与 Sparc 情况一样,最好与每个 Linux 端口到该平台的站点联系,以查看当前支持的内容。(欢迎指向此类站点的链接 - 将它们发送进来!)
我可以在没有集线器的情况下将基于 10/100BaseT (RJ45) 的系统连接在一起吗?
您可以使用交叉电缆连接 2 台机器,但不能超过 2 台,而无需额外的设备/小工具。但是,某些较新的花哨的自动协商卡可能无法在交叉电缆上工作。而且,不,您不能仅仅通过交叉一些电线和东西来拼凑一个集线器。在不复制集线器的情况下正确完成冲突信号几乎是不可能的。
我在启动时收到一堆“SIOCSIFxxx: 没有这样的设备”消息,然后是“SIOCADDRT: 网络不可达”。怎么回事?
您的以太网设备在启动/模块插入时未检测到,并且当运行 ifconfig
和 route
时,它们没有设备可以使用。使用 dmesg | more
查看启动消息,并查看是否有关于检测以太网卡的消息。
当我运行 ifconfig
时,我收到“SIOCSFFLAGS: 请重试” -- 咦?
另一个设备占用了您的以太网卡尝试使用的 IRQ,因此以太网卡无法使用 IRQ。您不一定需要重新启动来解决此问题,因为某些设备仅在需要时才抓取 IRQ,然后在完成时释放它们。例如某些声卡、串行端口、软盘驱动器等。您可以键入 cat /proc/interrupts
来查看当前正在使用的中断。大多数 Linux 以太网卡驱动程序仅在通过“ifconfig”打开以供使用时才抓取 IRQ。如果您可以让另一个设备“释放”所需的 IRQ 线路,那么您应该能够使用 ifconfig “请重试”。
当我运行不带参数的 ifconfig 时,它报告 LINK 为 UNSPEC(而不是 10Mbs 以太网),并且它还说我的硬件地址全为零。
这是因为人们正在运行比其内核版本更新版本的“ifconfig”程序。当与较旧的内核一起使用时,这个新版本的 ifconfig 无法报告这些属性。您可以升级您的内核,“降级” ifconfig,或者干脆忽略它。内核知道您的硬件地址,因此 ifconfig 是否可以读取它真的无关紧要。
如果您使用的 ifconfig
程序比您使用的内核版本旧得多,您也可能会获得奇怪的信息。
当我运行不带参数的 ifconfig 时,它报告我在接收和发送的数据包中都有大量的错误计数。一切似乎都运行正常 -- 怎么回事?
再看一遍。它说 RX packets
大数字 暂停 errors 0
暂停 dropped 0
暂停 overrun 0
。TX
列也是如此。因此,您看到的大数字是您的机器已接收和发送的数据包总数。如果您仍然感到困惑,请尝试键入 cat /proc/net/dev
。
/dev/
中的条目我将 /dev/eth0 作为指向 /dev/xxx 的链接。这正确吗?
与您听到的相反,不使用 /dev/* 中的文件。您可以删除任何 /dev/wd0, /dev/ne0
和类似的条目。
如何在 linux 中访问原始以太网设备,而无需通过 TCP/IP 和朋友?
int s=socket(AF_INET,SOCK_PACKET,htons(ETH_P_ALL));
这为您提供了一个接收每种协议类型的套接字。对其进行 recvfrom()
调用,它将使用 sa_family 中的设备类型和 sa_data 数组中的设备名称填充 sockaddr。我不知道谁最初为 Linux 发明了 SOCK_PACKET(它已经存在很久了),但它是非常棒的东西。您也可以使用它通过 sendto()
调用原始发送东西。您必须具有 root 访问权限才能执行任何一项操作。