下一篇 上一篇 目录

8. 其他。

任何其他相关的、不适合放在其他地方的东西都放在这里。它可能不相关,也可能不具有普遍意义,但无论如何它都在这里。

8.1 发射 FIFO 缓冲区和欠载错误

Donald 写了一篇关于 Tx FIFO 的作用以及何时发生错误的精彩描述。内容如下:

如果硬件支持,我的驱动程序具有动态 Tx FIFO 调整代码。典型的以太网芯片具有 Tx FIFO,用于在数据在线路上发送之前保存来自总线的数据。控制此 FIFO 的方式对于性能至关重要。

理想情况下,您希望在第一个 Tx 数据包数据到达芯片时立即开始传输。“Tx FIFO 阈值”是一个参数,用于指定“当 N 字节到达 NIC 芯片时开始传输”。此参数最初针对典型配置设置。但是,如果视频卡或 SCSI 控制器正在进行长时间的 PCI 突发传输,则 NIC 芯片将在再次获得总线访问权限之前耗尽缓冲数据。这会导致 FIFO 欠载。

驱动程序通过将 Tx FIFO 阈值更改为更高的值来响应 FIFO 欠载。如果这种情况发生得足够频繁,最终芯片将进入存储转发模式,在这种模式下,它在整个数据包传输完成之前不会开始传输。

某些设计,例如 Adaptec Starfire,更进一步,提供 FIFO 几乎耗尽数据的指示。这允许驱动程序调整设置,而不会冒 Tx 错误的风险。

看到超过一到两个 Tx FIFO 欠载的情况应该很少见。要么是芯片具有非常粗略的 Tx 阈值设置,要么是驱动程序以大块增加设置,以使 PCI 突发传输保持在自然边界上。

8.2 将以太网参数传递给内核

以下是两个通用的内核命令,可以在启动时传递给内核(etherreserve)。这可以使用 LILO、loadlin 或任何其他接受可选参数的启动实用程序来完成。

例如,如果命令是 `blah' 并且它期望 3 个参数(例如 123、456 和 789),那么使用 LILO,您将使用

LILO: linux blah=123,456,789

这些启动时参数可以永久化,这样您就不必每次都重新输入它们。通常,这就像在您的 /etc/lilo.conf 文件的顶部添加 append="blah=123,456,789" 一样简单。有关更多详细信息,请参阅 LILO 文档。

有关启动时参数的更多信息(和完整列表),请参阅 BootPrompt-HOWTO

ether 命令

ether= 参数与直接构建到内核中的驱动程序结合使用。 ether= 参数对模块化驱动程序绝对无效。在其最通用的形式中,它看起来像这样

ether=IRQ,BASE_ADDR,PARAM_1,PARAM_2,NAME

所有参数都是可选的。第一个非数字参数被视为 NAME。

IRQ: 显而易见。 IRQ 值 `0'(通常是默认值)表示 autoIRQ。IRQ 设置首先出现而不是 base_addr 是一个历史偶然事件 —— 当其他内容发生变化时,这将得到修复。

BASE_ADDR: 也显而易见。值 `0'(通常是默认值)表示探测特定于卡类型的地址列表以查找以太网卡。

PARAM_1: 它最初用作共享内存以太网卡(如 WD80*3)的内存起始地址的覆盖值。一些驱动程序使用此值的低四位来设置调试消息级别。 0 -- 默认,1-7 -- 级别 1..7,(7 是最大详细程度)8 -- 级别 0(无消息)。此外,LANCE 驱动程序使用此值的低四位来选择 DMA 通道。否则,它使用 auto-DMA。

PARAM_2: 3c503 驱动程序使用它来选择内部和外部收发器。 0 -- 默认/内部,1 -- AUI 外部。Cabletron E21XX 卡也使用 PARAM_2 的低 4 位来选择输出介质。否则,它会自动检测。

NAME: 选择值引用的网络设备。标准内核使用名称 `eth0'、`eth1'、`eth2' 和 `eth3' 用于总线连接的以太网卡,使用 `atp0' 用于并行端口“袖珍”以太网适配器。arcnet 驱动程序使用 `arc0' 作为其名称。默认设置是探测单个以太网卡作为 `eth0'。只能通过使用这些 LILO 参数显式设置其基地址来启用多张卡。1.0 内核将基于 LANCE 的以太网卡作为特殊情况处理。LILO 参数被忽略,LANCE 卡始终被分配 `eth<n>' 名称,从 `eth0' 开始。额外的非 LANCE 以太网卡必须显式分配给 `eth<n+1>',并且通常的 `eth0' 探测被禁用,例如 `ether=0,-1,eth0'。(是的,这是一个错误。)

reserve 命令

下一个 lilo 命令的使用方式与上面的 `ether=' 类似,即它附加到 lilo.conf 中指定的启动选择的名称。

reserve=IO-base,extent{,IO-base,extent...}

在某些机器中,可能需要阻止设备驱动程序在特定区域中检查设备(自动探测)。这可能是由于设计不良的硬件导致启动冻结(例如某些以太网卡)、硬件被错误识别、硬件的状态被较早的探测更改,或者仅仅是不希望内核初始化的硬件。

reserve 启动时参数通过指定不应探测的 I/O 端口区域来解决此问题。该区域在内核的端口注册表中被保留,就好像在该区域中已经找到了设备一样。请注意,这种机制在大多数机器上是不必要的。只有当出现问题或特殊情况时,才需要使用它。

指定区域中的 I/O 端口受到保护,免受设备探测。这是为了在某些驱动程序挂起在 NE2000 上,或将其他设备错误识别为自己的设备时使用。正确的设备驱动程序不应探测保留区域,除非另一个启动参数明确指定它这样做。这意味着 reserve 最常与其他启动参数一起使用。因此,如果您指定 reserve 区域来保护特定设备,则通常必须为该设备指定显式探测。大多数驱动程序在给定显式地址时会忽略端口注册表。

例如,启动行

LILO: linux reserve=0x300,32 ether=0,0x300,eth0

使除以太网卡驱动程序之外的所有设备驱动程序都无法探测 0x300-0x31f。

与启动时说明符一样,参数限制为 11 个,因此您每个 reserve 关键字只能指定 5 个保留区域。如果您有异常复杂的请求,则可以使用多个 reserve 说明符。

8.3 将以太网驱动程序用作模块

现在大多数 Linux 发行版都发布了内置驱动程序非常少的内核。驱动程序而是作为一组独立的动态可加载模块提供。这些模块化驱动程序通常由管理员使用 modprobe(8) 命令加载,或者在某些情况下,它们由内核通过 `kerneld'(在 2.0 中)或 `kmod'(在 2.1 中)自动加载,然后调用 modprobe

您的特定发行版可能会提供漂亮的图形配置工具,用于设置以太网模块。如果可能,您应该首先尝试使用它们。以下描述提供了有关任何花哨的配置程序的底层信息,以及这些程序更改的内容。

控制要使用哪些模块以及为每个模块提供哪些选项的信息通常存储在文件 /etc/modules.conf 中。此文件中使用的两个主要感兴趣的选项(对于以太网卡)是 aliasoptionsmodprobe 命令会查阅此文件以获取模块信息。

实际的模块本身通常存储在名为 /lib/modules/`uname -r`/net 的目录中,其中 uname -r 命令给出内核版本(例如 2.0.34)。您可以在其中查看哪个模块与您的卡匹配。

您在 modules.conf 文件中需要的第一件事是告诉 modprobe 要为 eth0(以及 eth1 和...)网络接口使用哪个驱动程序。您使用 alias 命令来执行此操作。例如,如果您有一个使用 smc-ultra.o 驱动程序模块的 ISA SMC EtherEZ 卡,则需要通过添加以下行将此驱动程序 aliaseth0

        alias eth0 smc-ultra

重要提示:上面的别名仅供模块实用程序使用,以将通用设备名称(例如 eth0)转换为特定于硬件的驱动程序模块名称。当驱动程序加载时,它甚至看不到此别名;相反,它将简单地选择第一个可用的空闲 ethN (N=0,1,2,...) 设备名称。因此,如果加载了多个以太网模块,则内核分配给驱动程序的 ethN 可能与别名行上给出的名称相同或不同,具体取决于模块的加载顺序。如果您需要确保为特定卡分配特定 IP 地址,请读取站地址并基于该地址分配您的 IP 地址。如果您正在为此编写自己的 shell 脚本,则只需解析 ifconfig 输出;如果使用 C,则可以使用 ioctl(ethfd, SIOCGIFHWADDR, &ifreq)

您可能需要的另一件事是 options 行,指示要将哪些选项与特定模块(或模块别名)一起使用。继续上面的示例,如果您仅使用单个 alias 行而没有 options 行,则内核会警告您(请参阅 dmesg),自动探测 ISA 卡不是一个好主意。要消除此警告,您需要添加另一行,告诉模块该卡配置的 I/O 基地址,在本例中,例如十六进制地址 0x280

        options smc-ultra io=0x280

大多数 ISA 模块在 insmod 命令行上接受像 io=0x340irq=12 这样的参数。需要或者至少强烈建议您提供这些参数以避免探测卡。与 PCI 和 EISA 设备不同,对于大多数 ISA 设备来说,没有真正的安全方法来进行自动探测,因此在使用驱动程序作为模块时应避免这样做。

每个模块接受的所有选项的列表都可以在文件

/usr/src/linux/Documentation/networking/net-modules.txt

中找到。建议您阅读该文件,以了解可以为您的特定卡使用的选项。请注意,某些模块支持逗号分隔的值列表,用于具有从单个模块处理多个设备的能力的模块,例如所有基于 8390 的驱动程序和 PLIP 驱动程序。例如


        options 3c503 io=0x280,0x300,0x330,0x350 xcvr=0,1,0,1

上面将有一个模块控制四张 3c503 卡,其中卡 2 和卡 4 使用外部收发器。不要在 `=' 或逗号周围放置空格。

另请注意,繁忙的模块无法删除。这意味着您必须先 ifconfig eth0 down (关闭以太网卡),然后才能删除模块。

命令 lsmod 将显示已加载的模块、它们是否正在使用,而 rmmod 将删除它们。

8.4 相关文档

此信息的大部分来自 comp.os.linux 新闻组的已保存帖子,这表明它是有价值的信息资源。其他有用的信息来自 Donald 本身编写的一堆小文件。当然,如果您要设置以太网卡,那么您将需要阅读 NET-2 Howto,以便您可以实际配置将要使用的软件。此外,如果您认为自己有点黑客,您也可以始终从驱动程序源文件中搜寻一些其他信息。在任何实际代码开始之前,通常都会有一两段描述任何要点的段落。

对于那些寻找在任何方面都不特定于 Linux 的信息(即什么是 10BaseT,什么是 AUI,集线器是做什么的等)的人,我强烈建议使用新闻组 comp.dcom.lans.ethernet 和/或 comp.sys.ibm.pc.hardware.networking。新闻组存档,例如 dejanews.com 的那些,也可以是宝贵的信息来源。您可以从 RTFM(其中包含所有新闻组 FAQ)在以下 URL 获取新闻组 FAQ

Usenet 常见问题解答

您也可以查看所谓的“以太网主页”,其 URL 如下

以太网主页

8.5 免责声明和版权

本文档不是绝对真理。但是,它可能是您能够找到的最新信息。没有人对您的硬件发生的事情负责,除了您自己。如果您的以太网卡或任何其他硬件冒烟(……几乎不可能!),我们概不负责。即,对于因根据本文档中包含的信息采取的行动而造成的任何损害,作者概不负责。

本文档版权归 Paul Gortmaker (c) 1993-2000 所有。允许制作和分发本手册的完整副本,前提是在所有副本上保留版权声明和本许可声明。

允许在完整复制的条件下复制和分发本文档的修改版本,前提是本版权声明与原始版本完全相同地包含在内,并且整个由此产生的衍生作品根据与本许可声明相同的许可声明的条款分发。

允许在上述修改版本的条件下复制和分发本文档到另一种语言的翻译版本。

给考虑进行翻译的人员的提示。首先,翻译 SGML 源代码(可通过 FTP 从 HowTo 主站点获得),以便您可以生成其他输出格式。请务必保留您从中翻译的原始英文 SGML 源代码的副本!当发布更新的 HowTo 时,获取该版本的新 SGML 源代码,然后一个简单的 diff -u old.sgml new.sgml 将向您准确显示已更改的内容,以便您可以轻松地将这些更改合并到您翻译的 SMGL 源代码中,而无需重新阅读或重新翻译所有内容。

如果您打算将本文档纳入已出版的作品中,请联系(通过电子邮件),以便您可以获得可用的最新信息。过去,Linux HowTo 文档的过时版本已出版,这给开发人员带来了不应有的麻烦,因为他们被已经在新版本中回答的问题所困扰。

8.6 结束语

在 Linux 的早期,大约十年前,驱动程序不多,用户也不多。我有时间关注个别驱动程序的开发、阅读新闻组中常见的错误,并回答发布的和通过电子邮件发送的问题。现在情况大不相同了。驱动程序数量巨大,用户数量也巨大,我根本无法跟上每个新的开发!这就是我需要您帮助的地方。如果您发现此处未提及的新驱动程序,或本文档中的任何明显的错别字或过时的信息,请发送电子邮件。它很大,很容易忽略内容。如果您已通过电子邮件发送有关更改的信息,但它尚未包含在下一个版本中,请不要犹豫再次发送,因为它可能已丢失在我收到的通常如海啸般的垃圾邮件中。

谢谢!

Paul Gortmaker, p_gortmaker @ yahoo.com


下一篇 上一篇 目录