Linux以太网-HOWTO <author>by Paul Gortmaker <date>v2.8, Oct 29, 2000 <abstract> 本文为以太网-HOWTO,汇集了有关哪些以太网装置可以用于Linux,以及如何进行设置的信息。请注意本文侧重于以太网卡的硬件与底层驱动方面的内容,并未涵盖诸如<tt/ifconfig/和<tt/route/等软件方面的问题。对于那些问题,请参阅Network-HOWTO。 </abstract> <toc> <sect>导言<label id="main-intro"> <p> 以太网-HOWTO包括了该买什么网卡与不该买什么网卡;如何设置网卡,怎样运行多个网卡,以及其它常见错误和问题。它包含了对目前所有能够得到的最常见网卡的支持的细节资料。 它<em/不/包含有关软件方面的内容,因为NET-3 Howto中包含了这些内容。还要注意这里不包括(或者至少不应当包括)那些非Linux特有的有关以太网的一般问题的解答。对于那些问题,可以参考<em/comp.dcom.lans.ethernet/的FAQ中的大量资料,与所有其它新闻组FAQ一样通过FTP到<tt/rtfm.mit.edu/获取。 本修订版覆盖了Linux 2.2.17及其之前的内核发行版本。 以太网-HOWTO的作者为: <quote> Paul Gortmaker, <tt/p_gortmaker@yahoo.com/ </quote> 原始的ASCII版本的以太网-HOWTO的主要资料来源为: <quote> Donald J. Becker, <tt/becker@scyld.com/ </quote> 感谢他编写了许多Linux目前使用的以太网卡驱动程序。他也是最初的NFS服务器的作者。谢谢Donald! Copyright (c) 1993-2000 本文的版权所有人为Paul Gortmaker。请阅读本文档结尾处的声明与版权信息(<ref id="copyright" name="copyright">)以了解有关分发本文及通常的“我们不对你试图破坏......的行为负责”之类的法律信息。 <sect1>本文档的新版本<label id="new-doc"> <p> 本文档的新版本可以从如下主页获得: <url url="http://metalab.unc.edu/mdw/HOWTO/Ethernet-HOWTO.html" name="Ethernet-HOWTO"> 希望采用FTP方式或者希望获取非HTML格式文档的可使用以下站点: <url url="ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/" name="Sunsite HOWTO Archive"> 这是“官方”站点——也可以在其它各种Linux WWW/ftp镜像站点找到本文档。在有了新资料或新驱动程序时本文档将进行更新。如果你阅读的文档已经存在6个月以上了,那么你需要检查一下是否已经有更新过的版本。 本文档有多种格式(postscript,dvi,ASCII,HTML,等等)。推荐用HTML格式浏览(通过WWW浏览器)或Postscript/dvi格式浏览。这两种格式都包含有普通文本ASCII格式无法提供的交叉引用功能。 <sect1>以太网-HOWTO的用法<label id="using"> <p> 由于本指南越来越大,你可能不希望花一个下午从头读到尾。而令人高兴的是你<em/不必/阅读全部内容。HTML和Postscript/dvi版本都有内容列表,可以帮助你更快地找到所需的内容。 可能你是由于无法使网卡工作,而且不知道该怎么做或者如何检查,才来阅读本文档的。下一节(<ref id="help" name="帮帮我——网卡没反应!">)就是针对Linux初学者并给出正确的指导。 经常有一些问题被不同的人问了<em/一遍又一遍/。可能你碰到的某个问题就是常见问题之一,而且在本文档的FAQ部分(<ref id="faq" name="常见问题">)已经有了答案。每个人在发文寻求帮助之前都最好先看一下这一节。 如果你还没有网卡,那么你可能想从决定买网卡开始。(<ref id="what-card" name="该为Linux买什么网卡?">) 如果你已经有了一块以太网卡,但不能确定是否可以在Linux上使用它,那么你可能想读一下包含每一个制造厂家及其网卡的特定信息的章节。(<ref id="card-intro" name="有关销售商/制造厂家/型号的信息">) 如果你对Linux设备驱动程序的一些技术细节感兴趣,那么你可以浏览有此类信息的章节。(<ref id="tech-intro" name="技术信息">) <sect1>帮帮我——网卡没反应!<label id="help"> <p> 好,别紧张。下面就告诉你如何解决问题,即使你此前对Linux或以太网硬件一无所知。 首先你需要弄清楚你的网卡类型,然后确定Linux是否有此类型网卡的驱动程序。主机在控制不同的网卡时使用的方法一般也不一样,而Linux驱动程序(如果有的话)就以允许Linux使用此卡的格式包含了这样的控制信息。如果你没有手册一类的东西让你知道网卡的类型,那么你可以尝试处理“神秘”网卡的章节(参考章节:<ref id="mystery" name="识别未知网卡">)。 现在你知道了你的网卡类型,阅读特定网卡章节中有关你的网卡的细节(参考章节:<ref id="card-intro" name="有关销售商/制造厂家/型号的信息">),那里以字母顺序列出了网卡制造厂家、各自的类型号以及是否有Linux驱动程序。如果在列表中被表明“不支持”,你就可以放弃了。如果从中找不到你的网卡,那么看一下你的网卡手册是否说它与某个已知网卡类型“兼容”。例如至少有几百种网卡与原来的Novell NE2000设计兼容。 假设你已经发现了你的网卡有Linux驱动程序,现在就找到并利用它。因为Linux有你的网卡的驱动程序并<em/不/意味著它存在每一个内核中。(内核是启动时最先载入的操作系统核心,包含各种硬件的驱动程序,以及其它等等。)可能只有很少几个预先生成的内核,和一大批较小的作为分立模块的驱动程序,或者是许多的内核,覆盖了大量内建驱动程序的组合,这都完全取决于是谁生成了你所使用的Linux发行版本。 现在的大多数Linux发行版本都提供大量较小的作为分立模块的不同驱动程序。需要的模块通常可以在启动过程的后期载入,或者在存取特定设备时以命令的形式载入一个驱动程序。你需要在内核启动后把该模块加载到内核上。查阅你所用的发行版本中有关安装和使用模块的信息,并参考本文档的有关模块章节。(<ref id="modules" name="把以太网驱动程序作为模块使用">) 如果你没有找到包含你的网卡驱动程序的已生成内核,也没有找到该驱动程序的模块形式,那么可能是你的网卡不够常见,而且需要你自己生成一个包含该驱动程序的内核。只要你已经安装了Linux,生成一个定制的内核一点儿都不难。你只要对内核需要包含些什么回答是或者不是,然后让它生成就行了。有一个Kernel-HowTo可以帮助你。 此时你还需要以某种方式启动内建了你的驱动程序的内核,或者以模块的形式载入驱动程序。大约人们碰到的问题有一半儿出在没有以这种或那种方式载入驱动程序,所以你会发现网卡现在工作了。 如果它还不工作,那么你需要证实一下内核确实检测到了网卡。要做到这一点,你需要在系统启动以及所有模块载入之后键入<tt>dmesg | more</tt>。这可以让你查看启动过程中内核所显示的启动信息。如果网卡被检测到,你可以从中找到以<tt>eth0</tt>开头的网卡驱动程序显示信息,指出网卡所使用的驱动程序名称和硬件参数(中断设置、I/O地址等等)。(注意:在启动时,Linux会列出所有系统中安装的PCI卡,无论是否有驱动程序——不要把这个误认为其后的驱动程序检测!) 如果你没看到这样的驱动程序识别信息,那么驱动程序就没有检测到你的网卡,这就是问题所在。查看FAQ(<ref id="faq" name="常见问题">)寻找网卡未检测到时该做些什么。如果你的网卡是NE2000兼容的,在FAQ中有一些有关NE2000网卡检测的技巧。 如果网卡被检测到了,但检测信息报告了一些错误,比如资源冲突,那么驱动程序可能无法正常初始化,网卡还是不可用。这一类的最常见错误信息也在FAQ中列出来了,并给出了相应的解决方案。 如果检测信息看起来没问题,那么再检查一下驱动程序报告的网卡资源是否与网卡的物理设置一致(网卡的物理设置或者是通过网卡上的跳线,或者是网卡制造厂家提供的软件工具完成。)它们必须完全一致。例如,网卡的跳线或配置为IRQ 15,而驱动程序在启动信息中报告为IRQ 10,那么就会出问题。在FAQ中讨论了最常见的驱动程序错误地检测各种网卡配置信息的情况。 现在你已经使你的网卡以正确的参数被检测到了,但愿一切正常。如果还有问题,那么或者是软件配置有错,或者是硬件配置有错。软件配置错误就是在<tt/ifconfig/和<tt/route/命令中没有设置正确的网络地址,其处理细节可以在Network HowTo和“Network Administrator's Guide”中找到,它们可能都在你用来安装的CD-ROM上。 硬件配置错误是某些资源冲突或忘记配置(即在启动时没检测到驱动程序),使网卡无法正常工作。通常可以用几种不同的方法来检查。(1) 在<tt/ifconfig/试图打开设备来使用时报告出错信息,如“SIOCSFFLAGS: Try again”。(2) 驱动程序报告<tt/eth0/出错信息(用<tt>dmesg | more</tt>查看)或者每次试图发送或接收数据时奇怪的不一致。(3) 键入<tt>cat /proc/net/dev</tt>来显示<tt/eth0/的errs、drop、fifo、frame或carrier列中的非零数字。(4) 键入<tt>cat /proc/interrupts</tt>显示网卡的零中断计数。大多数典型的硬件配置错误也在FAQ中进行了讨论。 好吧,如果你现在还有麻烦,阅读本文档的FAQ,阅读有关销售商章节中有关你的网卡的细节,<em/如果问题还没解决/,那么你只好求助于某个相应的新闻组了。在求助文章中请给出所有相关的细节资料,比如网卡商标、内核版本、驱动程序的启动信息、<tt>cat /proc/net/dev</tt>的输出、清晰的问题描述,当然还有你在试图解决问题时尝试采用的方法。 你可能会奇怪有那么多的人发出诸如“Can someone help me? My ethernet doesn't work.”而没有其它内容的无用信件。新闻组的读者一般会忽略掉这些愚蠢的信件,而详细的有内容的问题描述则会让“Linux专家”立即指出你的问题所在。当然在用电子邮件发送问题报告时这也同样成立——总是提供尽可能多的信息。 <!-- XXX - nobody cares about 100VG except those that already have it. Delete this soon, or cut it down into a FAQ. <sect1>100VG versus 100BaseT <p> 100BaseT is much more prominent than 100VG, and the following blurb from an older one of Donald's informative <tt/comp.os.linux/ postings summarizes the situation quite well: ``For those not in the know, there are two competing 100Mbs ethernet standards, 100VG (aka 100baseVG and 100VG-AnyLAN) and 100baseT (with 100baseTx, 100baseT4 and 100baseFx cable types). 100VG was on the market first, and I feel that it is better engineered than 100baseTx. I was rooting for it to win, but it clearly isn't going to. HP et al. made several bad choices: 1) Delaying the standard so that they could accommodate IBM and support token ring frames. It `seemed like a good idea at the time', since it would enable token ring shops to upgrade without the managers having to admit they made a very expensive mistake committing to the wrong technology. But there was nothing to be gained, as the two frame types couldn't coexist on a network, token ring is a morass of complexity, and IBM went with 100baseT anyway. 2) Producing only ISA and EISA cards. (A PCI model was only recently announced.) The ISA bus is too slow for 100mbs, and relatively few EISA machines exist. At the time VLB was common, fast, and cheap with PCI a viable choice. But "old-timer" wisdom held that servers would stay with the more expensive EISA bus. 3) Not sending me a databook. Yes, this action was the real reason for the 100VGs downfall :-). I called all over for programming info, and all I could get was a few page color glossy brochure from AT&T describing how wonderful the Regatta chipset was.'' --> <sect1>网卡应该支持的电缆类型<label id="cable-intro"> <p> 使用RJ-45(大的电话插头)连接器的双绞线从技术上来说叫做10BaseT。你可能听到过它被称为UTP(无屏蔽双绞线)。 使用BNC(金属的推进和旋转锁定)连接器的以太网细缆(RG-58同轴电缆)从技术上来说叫做10Base2。 只会在早期的装置上发现的老式以太网粗缆(10mm同轴电缆)被称为10Base5。在某些以太网卡上使用的15针D形插座(AUI连接器)是用来连接以太网粗缆和外部收发器的。 大多数以太网卡都有价格稍高$10-$20的“Combo”版本。它们同时提供双绞线和细缆以太网收发器,可以让你以后改变主意。 大多数装置使用10BaseT /100BaseT,因为10Base2无法升级为100Base之类的网络。10Base2对于因为某种原因不想购买HUB的爱好者建立室内网络而言是足够的。 参考<ref id="cable" name="电缆、同轴电缆......">以了解有关以太网线缆不同类型的情况。 <sect>常见问题<label id="faq"> <p> 这里是一些有关使用Linux进行以太网连接的常见问题。某些特定问题按照制造商进行分类。可能你想问的问题别人已经问过(而且被回答了!),所以即使没有在这里找到你的答案,还可能在诸如<url url="http://www.dejanews.com" name="Dejanews">之类的新闻档案中找到你所要的。 <sect1>该为Linux买什么网卡?<label id="what-card"> <p> 这个问题的答案很大程度取决于你希望用网络连接干些什么,以及会遇到多大的数据流量。 如果你只想作为一个用户偶尔使用一下FTP或WWW,那么即使是8比特的老ISA网卡都能满足你的需要。 如果你想建立一个服务器,并要求接收或发送网络数据给CPU带来的负载最小,那么你可能需要看一下使用具有总线控制能力的芯片的PCI网卡,比如DEC tulip (21xxx)芯片,或者AMD PCnet-PCI芯片。 如果你的需求在这二者之间,那么使用有稳定的驱动程序的便宜的PCI网卡或16比特的ISA网卡就可以了。 <sect1>Alpha驱动程序——获取与使用<label id="alfa"> <p> 我听说我的网卡有一个更新的或初步的/alpha驱动程序。从哪儿得到它呢? 最新的“新”驱动程序可以在Donald的FTP站点:<tt/cesdis.gsfc.nasa.gov/里面的<tt>/pub/linux/</tt>下找到。因为事情变化很频繁,可能需要四处找一找。或者使用WWW浏览器去: <url url="http://cesdis.gsfc.nasa.gov/linux/" name="Don's Linux Home Page"> 查找你想要的驱动程序更简单一些。(留神WWW浏览器会悄悄地把源码中的TABs替换为空格,等等——如果无法确定的话,使用FTP下载,至少也得用WWW浏览器的FTP URL。) 如果驱动程序确实是alpha版本,或pre-alpha版本,那么请恰当地对待它。换句话说,不要抱怨,因为你无法弄清用它能做些什么。如果弄不清如何安装,最好不要去试。同样,如果它使你的机器宕机了,不要抱怨。相反,你应该发给我们一份材料组织很好的Bug报告,如果是一个补丁,那就更好! 注意,某些“可用”的实验性/alpha驱动程序已经包含在标准的内核源码树中。在运行<tt/make config/时你首先要回答的一个问题就是“Prompt for development and/or incomplete code/drivers”。在此你要回答“Y”以包括任何alpha/实验性驱动程序。 <sect1>一台机器使用多个以太网卡<label id="two-card"> <p> 做些什么才能让Linux运行两块以太网卡? 这个问题的答案取决于驱动程序是否被用做可载入的模块或者直接编译进了内核。大多数Linux发行版本现在都使用模块化的驱动程序。这样就不用发行许多内核,每种内核设置一个不同的内建驱动程序。使用一个单一的基本内核,如果特定用户系统需要,一旦系统启动,就可以从驱动程序模块文件(通常存放在<tt>/lib/modules/</tt>)中载入个别的驱动程序。 <em/把驱动程序作为模块使用:/对于PCI驱动程序,模块通常会自动检测该品牌类型所有安装的网卡。但对于ISA网卡,探寻一个网卡是不安全的操作,因此你需要提供网卡的I/O地址以便模块知道去哪里查找。这一信息存储在文件<tt>/etc/conf.modules</tt>中。 例如,如果一个用户有两块ISA NE2000网卡,一块在<tt/0x300/,一块在<tt/0x240/,它们在<tt>/etc/conf.modules</tt>文件中显示如下: <verb> alias eth0 ne alias eth1 ne options ne io=0x240,0x300 </verb> 这几行的意义:就是说如果管理员(或内核)进行<tt/modprobe eth0/或者<tt/modprobe eth1/,那么为<tt/eth0/或者<tt/eth1/载入<tt/ne.o/驱动程序。此外,在载入<tt/ne.o/模块时,使用选项<tt/io=0x240,0x300/,这样驱动程序就知道去哪里寻找网卡。注意<tt/0x/很重要——DOS里常用的<tt/300h/在这里没有用。改变<tt/0x240/和<tt/0x300/的顺序会使哪一块物理网卡以<tt/eth0/和<tt/eth1/结尾发生改变。 同这个例子一样,大多数ISA模块驱动程序可以接受多个以逗号分隔的I/O值以处理多块网卡。但是,某些(老的?)驱动程序,比如3c501.o模块,目前载入一个模块只能处理一块网卡。这样,要检测两块网卡就必须载入两次该模块。此时,文件<tt>/etc/conf.modules</tt>将如下所示: <verb> alias eth0 3c501 alias eth1 3c501 options eth0 -o 3c501-0 io=0x280 irq=5 options eth1 -o 3c501-1 io=0x300 irq=7 </verb> 在此例中,选项<tt/-o/用来给每个模块实例一个唯一的名字,因为不能用同一个名字载入两个模块。选项<tt/irq=/也是用来指定网卡设置的硬件IRQ。(此方法也能用于可接受多个以逗号分隔的I/O值的模块,但这样会使模块被不必要地载入两次,降低了效率。) 最后一个例子,假设用户有一块在<tt/0x350/的3c503网卡和一块在<tt/0x280/的SMC Elite16 (wd8013)网卡。则应该这样: <verb> alias eth0 wd alias eth1 3c503 options wd io=0x280 options 3c503 io=0x350 </verb> 对于PCI网卡,只要用<tt/alias/语句把<tt/ethN/接口和相应的驱动程序名联系起来就行了,因为PCI网卡的I/O地址可以被安全地检测到。 可用的模块一般存放在<tt>/lib/modules/`uname -r`/net</tt>下,这里<tt/uname -r/命令可以得到内核的版本(比如2.0.34)。你可以在这里看看哪一个驱动程序适合你的网卡。一旦你在<tt/conf.modules/文件里进行了正确的设置,就可以用下面的方法检查一下: <verb> modprobe ethN dmesg | tail </verb> 这里“N”是你要检测的以太网卡的接口号。 <em/使用编译进内核的驱动程序:/如果你需要的驱动程序编译进了内核,那么处理多块以太网卡的接口已经存在了。但缺省情况下只自动检测<em/一块/以太网卡。这样就避免了启动时检测敏感网卡可能引起的麻烦。 (注意:在2.1.x之后的内核中,启动检测被分为安全和不安全的两类,所有安全的检测(如对PCI和EISA网卡)可以自动找到所有相关的网卡。在至少有一块ISA网卡的多网卡系统中还需要进行以下的处理。) 有两种方法可以启动对第二块(或第三块等等)网卡的自动检测。最简单的方法是向内核传递启动参数,由LILO完成。使用<tt/ether=0,0,eth1/这样简单的启动参数就可以完成对第二块网卡的检测。此时按照启动时找到的网卡顺序分配<tt/eth0/和<tt/eth1/。假如你想让<tt/0x300/处的网卡为<tt/eth0/,而<tt/0x280/处的网卡为<tt/eth1/,那么可以使用 <tscreen> LILO: linux ether=5,0x300,eth0 ether=15,0x280,eth1 </tscreen> 命令<tt/ether=/可以接受的参数并不仅限于如上所示的IRQ + I/O + name。请参看<ref id="lilo" name="传递以太网参数......">以了解全部的句法、网卡特定参数和LILO使用技巧。 这些启动参数可以固定,这样就不用每次都必须重新敲一遍。参看LILO手册中有关LILO的配置选项“<tt/append/”。 第二种方法(不建议使用)是编辑文件<tt/Space.c/并用零替换I/O地址中的<tt/0xffe0/入口。<tt/0xffe0/入口是用来告诉内核不要检测该设备——把它替换为零就启动了对该设备的自动检测。 <sect1>这个<tt/以太/东东不干活。为什么? <p> 如上所述,<tt/ether=/命令<em/只/对编译进了内核的驱动程序起作用。现在大多数的发行版本都用模块的方式使用驱动程序,所以很少再使用<tt/ether=/命令了。(某些早期文档需要更新以反映这一变化。)如果你想使用模块化的以太网驱动程序的选项,<em/必须/修改<tt>/etc/conf.modules</tt>文件。 如果你<em/是/使用编译的驱动程序,而且已经把<tt/ether=/加进了LILO配置文件,需要重新运行<tt/lilo/使更新后的配置文件生效。 <sect1>NE1000/NE2000网卡(及其兼容卡)的问题<label id="ne2k-probs"> <p> <bf/问题:/ 在用v2.0.x启动时没有检测到PCI NE2000兼容网卡。 <bf/原因:/ 在v2.0.30之前的<tt/ne.c/驱动程序只知道基于RealTek 8029的兼容网卡的PCI ID号。在此只后才出现了使用其它PCI ID号的PCI NE2000兼容网卡,所以驱动程序无法检测这些网卡。 <bf/解决方案:/ 最简单的方法是把Linux内核升级到v2.0.31以上版本。它可以识别五种不同的NE2000-PCI芯片的ID号,在启动或载入模块时自动检测到它们。如果你升级到了2.0.34以上版本,会有一个比原先的ISA/PCI驱动程序稍小但更高效的PCI专用NE2000驱动程序。 <bf/问题:/ 启动时PCI NE2000兼容网卡被报告为ne1000(8比特网卡!)或者在v2.0.x下载入ne.o模块不起作用。 <bf/原因:/ 某些PCI兼容网卡不支持字节存取(因此不是百分之百兼容的NE2000)。这使它在检测时被误认为NE1000网卡。 <bf/解决方案:/ 你需要升级到v2.0.31以上版本。现在的驱动程序会检测到这种硬件Bug。 <bf/问题:/ PCI NE2000网卡的性能很差,即使按照性能技巧章节所说的减小了窗口大小。 <bf/原因:/ 十多年前设计和出售的初始8390芯片的技术数据手册上提到,为了得到最高的可靠性,在每次写操作之前需要一个读操作。驱动程序能够轻易地做到这一点,但从v1.2内核时代起,缺省情况下取消了这一操作。有一个用户报告说重新启用这一“错误的特性”就可以改善廉价的PCI NE2000兼容网卡的性能。 <bf/解决方案:/ 由于只有一个用户提出报告把它作为解决方案,不要对此寄予太大的希望。重新使用写之前的读操作可以简单地编辑<tt>linux/drivers/net/</tt>下的驱动程序文件,取消包含<tt/NE_RW_BUGFIX/的那一行的注释,然后重建内核或载入相应的模块。如果这样确实有效,请给我发一封e-mail,描述性能上的差异和你所使用的网卡/芯片类型。(对<tt/ne2k-pci.c/驱动程序也可以如法炮制。) <bf/问题:/ <tt/ne2k-pci.c/驱动程序对PCI NE2000网卡报告诸如<tt/timeout waiting for Tx RDC/错误信息,无法正常工作。 <bf/原因:/ 你的网卡或网卡到PCI总线的连接无法处理该驱动程序使用的长字I/O优化。 <bf/解决方案:/ 首先,检查BIOS/CMOS设置,看看与PCI总线相关的计时对于可靠的操作是否过于严格了。否则,使用ISA/PCI的<tt/ne.c/驱动程序(或者删除<tt/ne2k-pci.c/中的<tt/#define USE_LONGIO/),使你的网卡可用。 <bf/问题:/ 没检测到ISA的即插即用NE2000网卡(如RealTek 8019)。 <bf/原因:/ 初始的NE2000特性不支持即插即用,因此Linux的NE2000驱动程序也不支持即插即用。 <bf/解决方案:/ 使用网卡所附的DOS配置盘取消PnP,并为该网卡设置一个指定的I/O地址和IRQ。在<tt>/etc/conf.modules</tt>里增加这样的一行<tt/options ne io=0xNNN/,其中<tt/0xNNN/是你为网卡设置的16进制I/O地址。(假设你使用的是模块化驱动程序;否则,在启动时使用一个<tt/ether=0,0xNNN,eth0/参数)。你也可以进入BIOS/CMOS设置,把IRQ从PnP改为Legacy-ISA。如果你需要为兼容其它的操作系统而保留PnP设置,那么你可以看一下<em/isapnptools/软件包。使用<tt/man isapnp/看看它是否已经安装在你的系统上了。如果没有,浏览一下下面的连接: <url url="http://www.roestock.demon.co.uk/isapnptools/" name="ISA PNP Tools"> <bf/问题:/ 在启动检测时NE*000驱动程序报告“not found (no reset ack)”。 <bf/原因:/ 这跟上面所说的改动有关。在证实8390处于所检测的I/O地址之后,进行重新设置。在网卡完成重新设置后,应当通知重新设置完成。你的网卡没有通知,所以驱动程序认为不存在NE网卡。 <bf/解决方案:/ 你可以在启动时使用一个未被使用的<tt/mem_end/的16进制值<tt/0xbad/,告诉驱动程序你有一个坏网卡。在使用<tt/0xbad/覆盖时你<em/必须/为网卡提供一个非零的I/O地址。例如,在<tt/0x340/的网卡不响应重新设置时,则使用如下方法: <tscreen> LILO: linux ether=0,0x340,0,0xbad,eth0 </tscreen> 这样,即使你的网卡不响应重新设置,网卡检测还能继续下去。如果你是以模块方式使用驱动程序,那么可以象提供I/O地址一样提供选项<tt/bad=0xbad/。 <bf/问题:/ NE*000网卡使机器在第一次网络访问时死机。 <bf/原因:/ 这个问题从早期的1.1.57内核到现在都出现过,而且只在有限的几种软件配置的兼容网卡上出现。看来是需要用某些特殊的方法来初始化它们。 <bf/解决方案:/ 有几个人报告在热启动(即loadlin或Ctrl-Alt-Del)Linux之前,运行提供的DOS软件配置程序或提供的DOS驱动程序可以使网卡工作。这表明这些卡需要以某种特殊的方式初始化,与当前的Linux驱动程序稍有区别。 <bf/问题:/ 在<tt/0x360/的NE*000以太网卡没有检测到。 <bf/原因:/ 你的NE2000网卡在I/O空间占据了<tt/0x20/个字节,使它与<tt/0x378/处的并口发生冲突。其它可能的设备是<tt/0x370/处的第二个软盘控制器(如果有的话),以及<tt/0x376--0x377/处的第二个IDE控制器。如果该口已被其它驱动程序注册,内核将不再进行检测。 <bf/解决方案:/ 或者把你的网卡移到<tt/0x280, 0x340, 0x320/一类的地址,或者在编译时不支持并行打印机。 <bf/问题:/ 每次打印时网络都断开(NE2000)。 <bf/原因:/ 与上一个问题相同,但你的内核比较老,不支持对重叠I/O区域的检查。使用如上的解决方案,有空时获取一个新的内核。 <bf/问题:/ 没检测到0xNNN: 00 00 C5 ... 处的NE*000以太网卡。(非法标识yy zz) <bf/原因:/ 首先,你是否在地址0xNNN处有一个NE1000或NE2000网卡?如果有,报告的硬件地址是否象一个合法地址?如果是的话,那么你的NE*000兼容网卡很差劲。所有的NE*000兼容网卡都假定网卡上的SA PROM的第14和15字节为<tt/0x57/。而你的网卡不是这样——它的值为“yy zz”。 <bf/解决方案:/ 有两种解决方法。最简单的方法就是如上所述的“no reset ack”解决方案,使用一个<tt/0xbad/的mem_end值。这样在提供一个非零的I/O地址时就可以忽略标识检查。此方法无需重新编译内核。 第二种方法(对黑客)需要修改驱动程序,并重新编译内核(或模块)。在驱动程序(/usr/src/linux/drivers/net/ne.c)的42行有一个“Hall of Shame”列表。这个表是用来检测那些差劲的兼容网卡的。例如,DFI网卡在PROM的前三个字节使用“DFI”,而不是象要求的那样在第14和15字节使用<tt/0x57/。 <bf/问题:/ 机器在启动时出现“8390...”或“WD....”信息后死机。拔掉NE2000就好了。 <bf/原因:/ 你的NE2000兼容网卡兼容性不好。一个激活的NE2000是个无底洞,会使其它的驱动程序陷在其空间内进行自动检测。把NE2000改到一个不常用的地址就可以从其它的自动检测中消除这一陷阱,机器也就可以启动了。 <bf/解决方案:/ 把你的NE2000地址改为<tt/0x340/一类的地址。此外,你可以在和“ether=”参数一起使用“reserve=”启动参数,保护网卡不受其它设备驱动程序检测的影响。 <bf/问题:/ 机器启动时在进行SCSI检测时死机。 <bf/原因:/ 这个问题跟上面的一样,改变以太网卡的地址,或使用reserve/ether启动参数。 <bf/问题:/ 机器启动时在进行声卡检测时死机。 <bf/原因:/ 不对,实际上是发生在静默方式的SCSI检测过程中,与上面的问题一样。 <bf/问题:/ 启动时检测不到NE2000 -- 根本就没有启动信息。 <bf/解决方案:/ 因为造成检测不到的原因很多,所以没有“神奇的解决方案”。下面列出了可能有所帮助的一些措施。 1) 构建一个只包含需要的设备驱动程序的内核。证实你确实是从新内核启动的。忘记运行lilo等会使你从老的内核启动。(仔细观察启动时报告的构建时间/日期。)听起来很明显,但我们以前都犯过这个错。通过检查<tt/System.map/文件里<tt/ne_probe/一类的名称,确定驱动程序已包含在新的内核里。 2) 仔细观察启动信息。看看它是否提及正在进行诸如“NE*000 probe at 0xNNN: not found (blah blah)”一类的ne2k检测,或者就是静悄悄地失败了。这里的区别很大。使用<tt>dmesg|more</tt>在登录后浏览启动信息,或者在启动完成显示登录提示符时使用Shift-PgUp卷回屏幕。 3) 启动后,执行<tt>cat /proc/ioports</tt>,证实网卡要求的全部I/O空间是空的。如果网卡在<tt/0x300/,那么ne2k驱动程序要求的空间为<tt/0x300-0x31f/。如果其它设备的驱动程序注册了其中的一个口,就不会对该地址进行检测,而是静悄悄地检测下一个要检测的地址。常见的情况是lp驱动程序保留了<CODE>0x378</CODE>,或者第二个IDE通道保留了<tt/0x376/,这就使ne驱动程序停止检测<tt/0x360-0x380/。 4) 与上面一样执行<tt>cat /proc/interrupts</tt>。确定没有其它设备注册了你为以太网卡设置的中断。这种情况下,检测可以进行,以太网卡驱动程序会在启动时大声抱怨无法得到所要求的IRQ中断线。 5) 如果你还为驱动程序静悄悄地失败而苦恼,那么编辑并给检测增加一些printk()。比如,对于ne2k,你可以在<tt>linux/drivers/net/ne.c</tt>中增加/删除某些行(用“+”或“-”表示),如下所示: <code> 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; + } </code> 那么它就会输出检查的每一个口地址信息,你可以看到你的网卡地址是否被检测了。 6) 你还可以从Don的ftp站点(在howto中也提及了)获取ne2k的诊断程序,看看你在启动进入Linux后能否用它检测你的网卡。使用“<tt/-p 0xNNN/”选项告诉它在哪里寻找你的网卡。(缺省情况下只检测<tt/0x300/,与启动时的探测不同,不会检测其它的地址。)在找到网卡时的输出如下: <code> 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. </code> 你的注册值和PROM值可能会不一样。注意,对16比特网卡,所有PROM值都增加一倍,以太网卡地址(00:00:c0:b0:05:65)出现在第一行,加倍后的<tt/0x57/标识出现在PROM的结尾。 在<tt/0x300/处没有安装网卡时的输出如下: <code> 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. </code> 出现值<tt/0xff/的原因是在读取空I/O口时返回的就是该值。如果在检测的区域内有其它硬件,你可以看到一些非<tt/0xff/的值。 7) 尝试在运行提供的DOS驱动程序或配置程序之后,从DOS启动软盘(通过loadlin)热启动进入Linux。这可能会进行一些额外的(即非标准的)“魔法”来初始化网卡。 8) 试一下Russ Nelson的ne2000.com包驱动程序,看它能否看见你的网卡——如果还不行,事情就不大妙了。例如: <tscreen> A:> ne2000 0x60 10 0x300 </tscreen> 所用参数为软件中断向量、硬件IRQ和I/O地址。你可以从任意的msdos档案文件中的pktdrv11.zip里找到它——现在的版本大概是11以上了。 <sect1>SMC Ultra/EtherEZ和WD80*3网卡的问题<label id="8013-probs"> <p> <bf/问题:/ 你得到了如下信息: <verb> eth0: bogus packet size: 65531, status=0xff, nxpg=0xff </verb> <bf/原因:/ 是共享内存的问题。 <bf/解决方案:/ 最普遍的原因是配置的PCI机器没有映射到ISA内存设备里。因此你读到的是PC的RAM(全都是<tt/0xff/值),而不是存放接收数据包数据的网卡上的RAM。 另一个容易解决的典型问题是板卡冲突,在此区域有缓存或“shadow ROM”,或者你的ISA总线运行速度高于8Mhz。以太网卡上的内存失效的数目也令人惊奇,所以如果你的以太网卡有诊断程序的话,运行一下。 <bf/问题:/ SMC EtherEZ在非共享内存(PIO)模式下不工作。 <bf/原因:/ 老版本的Ultra驱动程序只支持共享内存模式下的操作。 <bf/解决方案:/ 版本2.0以上的内核所附驱动程序就支持可编程I/O模式的操作。升级到v2.0以上版本。 <bf/问题:/ 老的wd8003或可跳线的wd8013总是得到错误的IRQ。 <bf/原因:/ 老的wd8003网卡或可跳线的wd8013兼容卡没有驱动程序可以从中读取设置的IRQ的EEPROM。如果驱动程序无法读到IRQ,就尝试用auto-IRQ发现它。若auto-IRQ返回0,那么驱动程序就给8比特网卡分配IRQ 5,或者为16比特网卡分配IRQ 16。 <bf/解决方案:/ 使auto-IRQ代码无效,并在你的模块配置文件(对于内建的驱动程序则通过启动参数)告诉内核你把网卡跳成了什么IRQ。 <bf/问题:/ SMC Ultra网卡被检测成了wd8013,但IRQ和共享内存地址是错的。 <bf/原因:/ Ultra网卡看起来跟wd8013很相象,如果内核里没有Ultra驱动程序,wd驱动程序就会把ultra误认为wd8013。ultra检测在wd之前,所以一般不会出问题。ultra在EEPROM保存的IRQ和内存地址与wd8013保存的位置不同,所以报告的值是假的。 <bf/解决方案:/ 只保留需要的驱动程序重新编译内核。如果你在同一台机器上同时使用wd和ultra网卡,并使用模块,那么首先载入ultra模块就行了。 <sect1>3Com网卡的问题<label id="3com-probs"> <p> <bf/问题:/ 3c503选择了IRQ N,但其它设备也需要IRQ N。(比如CD ROM驱动程序、modem等。)可以不编译进内核就解决这个问题吗? <bf/解决方案:/ 3c503驱动程序按照顺序{5, 9/2, 3, 4}检测空闲的IRQ线,从中找到一个未被使用的IRQ。在网卡被<tt/ifconfig/操作配置时选择中断IRQ。 如果你使用的是模块化的驱动程序,可以用模块参数设置各种情况,包括中断IRQ的值。 下面的语句选择IRQ9、基址<tt/0x300/、<ignored value>和if_port #1(外部收发器)。 <tscreen> io=0x300 irq=9 xcvr=1 </tscreen> 另外,如果驱动程序被编译进了内核,你还可以通过LILO在启动时传递参数来设置同样的值。 <tscreen> LILO: linux ether=9,0x300,0,1,eth0 </tscreen> 下面的语句选择IRQ3、检测基址、<ignored value>和缺省if_port #0(外部收发器)。 <tscreen> LILO: linux ether=3,0,0,0,eth0 </tscreen> <bf/问题:/ 3c503: configured interrupt X invalid, will use autoIRQ. <bf/原因:/ 3c503网卡只能使用中断IRQ{5, 2/9, 3, 4}中的一个(这些是网卡所能连接的中断线。)如果你使用一个不在其中的IRQ值,就会得到如上的提示。一般情况下,没必要为3c503指定中断值。3c503会在ifconfig配置时使用autoIRQ,并从IRQ{5, 2/9, 3, 4}中选择一个。 <bf/解决方案:/ 使用上述的合法IRQ值,或者不指定IRQ以启用autoIRQ。 <bf/问题:/ 提供的3c503驱动程序无法使用AUI(粗缆以太网)端口。怎样才能不使用缺省的细缆以太网端口而选择AUI端口? <bf/解决方案:/ 3c503的AUI端口对于内建驱动程序可以在启动时选择,对于模块化驱动程序可以在插入模块时选择。这一选择会覆盖未使用的dev->rmem_start变量的低比特位,所以启动参数: <tscreen> LILO: linux ether=0,0,0,1,eth0 </tscreen> 可以对内建在内核的驱动程序起作用。 要在载入模块时指定AUI端口,只需把<tt/xcvr=1/附加在模块选项包含你的I/O和IRQ值的那一行就行了。 <sect1>非特定网卡的FAQ。 <p> <sect2>Linux与ISA的即插即用以太网卡。 <p> 要获得最佳效果(问题最少),推荐使用随网卡附的程序(通常是DOS程序)取消PnP机制,并给网卡设置一个固定的I/O地址和IRQ。确定使用的I/O地址在启动时被驱动程序检测到,如果使用模块,则在<tt>/etc/conf.modules</tt>中使用<tt/io=/选项提供地址。也可以进入BIOS/CMOS设置,把IRQ从PnP改为Legacy-ISA(如果计算机有此选项的话)。 注意,运行基于DOS的配置程序一般并不需要安装DOS。可以用DOS软盘启动,然后从提供的软盘上运行它们就可以了。同样可以自由地下载OpenDOS和FreeDOS。 如果需要使用PnP以与其它操作系统兼容,就得每次启动时都使用Linux的isapnptools包配置网卡。还需要确定为网卡选择的I/O地址被驱动程序检测到,或用<tt/io=/选项提供I/O地址。 有些系统在BIOS/CMOS设置菜单中有“enable PnP OS”(或类似的名称)选项,几乎在所有情况下或网卡无法正常工作甚至检测不到的情况下都需要禁用此选项。一个用户对此描述得很好“我不知道它在屏幕后干了些什么,但看起来是在捣乱。” <sect2>启动时没有检测到以太网卡。 <p> 出现这个问题的常见原因是人们使用的内核不支持特定的网卡。对于模块化的内核,这一般说明要求的模块尚未被载入,或者需要用模块选项指定其I/O地址。 如果使用的是模块化的内核,就象大多数用Linux发行版安装的那样,试著用一下该发行版的配置工具来选择网卡所用模块。对于ISA网卡一个较好的主意是,确定网卡的I/O地址,如果配置工具要求选项则把它作为一个选项(如<tt/io=0x340/)加进去。如果没有配置工具,那么需要在<tt>/etc/conf.modules</tt>里添加正确的模块名称(及选项)——阅读<tt/man modprobe/以了解更多的细节。 如果使用的是发行版套件里的预编译内核,那么需要查看文档以确定安装的是哪一种内核,以及是否支持所用的网卡。如果不支持的话,要么试著找一个支持所用网卡的内核,要么自己生成一个内核。 只保留所需的驱动程序生成自己的内核是个聪明的主意,因为这会减小内核大小(为应用程序保留宝贵的RAM!),减少打扰敏感硬件的设备检测数目。生成内核并不象听起来那么复杂。你只需要对一些有关想要哪些驱动程序的问题回答是或不是,其它的事都由程序完成。 另一个主要原因是其它的设备占用了网卡所需的部分I/O空间。大多数网卡在I/O空间里占用了16或32个字节。如果你的网卡设在<tt/0x300/并需要32个字节,那么驱动程序就要求<tt/0x300-0x31f/。如果某个其它设备驱动程序注册了哪怕其中一个端口,驱动程序就不会对该地址进行检测,而是静悄悄地进入下一个检测地址。所以,在启动之后,运行一下<tt>cat /proc/ioports</tt>以确定网卡要求的全部I/O空间都是空的。 还有一个问题就是网卡跳到的I/O地址不是缺省检测的地址。每个驱动程序的检测地址列表可以很容易地在驱动程序源码中的文本注释里找到。即使网卡设定的I/O地址不在检测地址列表上,你也可以在启动时用<tt/ether=/命令提供(对内建驱动程序),参见<ref id="lilo" name="传递以太网参数...">。模块化的驱动程序可以在<tt>/etc/conf.modules</tt>里使用<tt/io=/选项指定一个非缺省检测的地址。 <sect2><tt/ifconfig/报告了错误的网卡I/O地址。 <p> 这不可能。你只是理解错误。这<em/不/是一个Bug,而且报告的数字是正确的。这只出现在某些基于8390的网卡上(如wd80x3、smc-ultra等),实际的8390芯片位于第一个给定I/O端口加上一个偏移量处。此偏移量保存在<tt/dev->base_addr/里,也就是<tt/ifconfig/报告的值。如果你想看到网卡使用的全部端口,试一下<tt>cat /proc/ioports</tt>以得到想要的数字。 <sect2>PCI机器探测到了网卡,但驱动程序检测失败。 <p> 某些PCI的BIOS在上电时没有启用所有的PCI卡,特别是在使用了“PNP OS”的BIOS选项情况下。这一特性是为了支持当前依然使用某些实模式驱动程序的Windows版本。或者禁用该选项,或者升级到一个可以启用被禁用网卡的新驱动程序。 <sect2>PCI机器里的共享内存ISA网卡不工作(<tt/0xffff/) <p> 这常表现为显示读出大量<tt/0xffff/值。除非你正确地设置了PCI ROM BIOS/CMOS SETUP配置,任何类型的共享内存网卡都不会在PCI机器上工作。你必须把网卡所用内存区域设置为可以从ISA总线访问共享内存。如果你不知道哪些设置有用,那么询问你的供应商或者当地的计算机大拿。对于AMI BIOS,在“Plug and Play”部分有一个“ISA Shared Memory Size”和“ISA Shared Memory Base”的设置。对于类似wd8013和SMC Ultra的网卡,把共享内存的大小从缺省的禁用改为16kB,并把基址改为网卡的共享内存地址。 <sect2>网卡看来在发送数据,但没有收到过数据。 <p> 执行<tt>cat /proc/interrupts</tt>。这样产生的列表会显示网卡产生的所有中断事件的实时数目。如果为0或在试图使用网卡时没有增加,那么可能是与计算机安装的其它设备发生物理中断冲突(无论其它的设备是否安装/提供了驱动程序)。把其中一个设备的IRQ改成未使用的IRQ。 <sect2>异步传输模式(ATM)支持 <p> Werner Almesberger在进行Linux的ATM的支持工作。他使用的是Efficient Networks的ENI155p板(<url url="http://www.efficient.com/" name="Efficient Networks">)和Zeitnet的ZN1221板(<url url="http://www.zeitnet.com/" name="Zeitnet">)。 Werner说ENI155p的驱动程序已经很稳定了,而ZN1221的驱动程序目前还没有完成。 去下面的连接查看一下最新的进展: <url url="http://lrcwww.epfl.ch/linux-atm/" name="Linux ATM Support"> <sect2>吉比特以太网支持 <p> Linux支持吉比特以太网吗? 是的,目前至少已经有了两个驱动程序。在v2.0和v2.2内核里有一个Packet Engines G-NIC PCI吉比特以太网适配器的驱动程序。驱动程序的更多细节、支持和更新可访问: <tt>http://www.scyld.com/linux/drivers/yellowfin.html</tt> v2.2内核提供的<tt/acenic.c/驱动程序可用于Alteon的AceNIC吉比特以太网卡和其它如3Com的3c985一类的基于Tigon的网卡。这个驱动程序还可以用于NetGear的GA620,但还需要证实。 <sect2>FDDI支持 <p> Linux支持FDDI吗? 是的。Larry Stefani为v2.0编写了Digital的DEFEA(FDDI EISA)和DEFPA(FDDI PCI)网卡驱动程序。它被包含进v2.0.24内核。目前还没有其它的网卡被支持。 <sect2>全双工支持 <p> 全双工能达到20MBps吗?Linux支持吗? Cameron Spitzer对全双工10Base-T网卡有如下论断:“如果你连在全双工交换HUB上,你的系统足够快而且不做太多其它的工作,它会使你的网络在两个方向上都保持忙碌。不存在什么全双工的10BASE-2或10BASE-5(细缆和粗缆)。全双工是通过取消适配器的碰撞检测来达到的。这就是为什么用同轴电缆实现不了全双工;LAN无法以全双工方式运转。10BASE-T(RJ45接口)使用不同的线进行发送和接收,所以二者可能同时进行。交换HUB处理碰撞问题。信号速率是10Mbps。” 所以,你只能以10Mbps速率接收或发送数据,无法期望得到两倍的性能提高。对于是否支持,取决于网卡和可能的驱动程序。有些网卡可以自动协商,有些需要驱动程序支持,还有的需要用户在网卡的EEPROM配置中设置选项。只有那些认真的用户会注意到全双工与半双工模式间的差别。 <sect2>SMP机器上的Linux以太网卡 <p> 如果有钱买多处理器(MP)的计算机,那么最好买一个好点儿的以太网卡。对v2.0内核这还不是个问题,但对v2.2就成问题了。大多数老式的非智能(如ISA总线的PIO和共享内存设计)网卡在设计时根本没考虑多处理器应用。简单地说就是买一个现代设计的智能网卡,并确定有能够处理多处理器操作的驱动程序。(注意这里的“现代设计” - PCI-NE2000就是在现代总线上有10多年历史的老式设计。)在驱动程序的源码里查找<tt/spin_lock/可以很好地说明该驱动程序是否能够处理多处理器操作。下面详细解释了为何要为多处理器应用购买好的网卡(以及不买会出现什么问题)。 在v2.0内核,在任意时刻只有一个处理器允许进入“内核态”(即改变内核数据或运行设备驱动程序)。所以从网卡(及相关驱动程序)的角度来看,这与单处理器操作没有什么不同,所以不会出问题。(这也是得到一个可以工作的Linux多处理器版本的最简单的办法——使用一个大锁使得一次只有一个处理器处于内核状态。这样你就知道不可能有两个处理器同时要修改同一数据!) 在任意时刻只有一个处理器允许进入内核态的不利之处在于只有运行自我控制和密集计算的程序时才会获得多处理器的优越性。如果程序进行了大量诸如向磁盘或网络读/写数据的I/O操作,在处于内核的那个处理器努力运行所有的设备驱动程序以满足I/O请求的同时,其它的处理器都必须等待自己的I/O请求被处理完成。这样内核就成为了瓶颈,由于只有一个处理器运行在内核态,多处理器机器的性能在I/O任务重、单锁的情况下迅速降级到接近单处理器的水平。 很明显这与理想情况相差太远(尤其是对于文件/WWW服务器、路由器等),v2.2的内核就使用了粒度更小的锁——也就是说同时可以有多个处理器进入内核。不再是对整个内核使用一个大锁,而是使用许多较小的锁保护关键数据,防止同时被多个处理器控制——例如,一个处理器可以运行网卡驱动程序,同时另一个处理器可以运行磁盘驱动器的驱动程序。 好的,这样就有问题了:更小的锁定就意味著可以有一个处理器试图通过以太网驱动程序发送数据,同时另一个处理器试图访问同一个驱动程序/网卡来做别的事情(比如通过<tt>cat /proc/net/dev</tt>得到网卡统计数据)。哎呦——你的网卡正在通过网线发数据,你又要用它来收数据。网卡被同时要求做两件事(或更多),会弄糊涂的,所以有可能在处理过程中网卡使你的机器死机。 因此,为单处理器写的驱动程序不再适用——它需要更新控制对网卡访问的锁,使得网卡的接收、发送和操作配置数据这三种任务以网卡稳定操作所要求的程度串行化起来。没有更新为使用稳定多处理器操作的锁的驱动程序在轻的网络负载下可能看起来会正常工作,但在两个(或更多)处理器试图同时进行多个任务时就会造成死机,或至少表现出奇怪的行为,这就是问题。 更新后的意识到多处理器的以太网驱动程序将要求一个驱动程序范围的锁,使得内核进入驱动程序的访问入口被限制为一次一个。这样,任务就被串行化,而对硬件的处理就如同在单处理器下一样,也就一定应当稳定。使用驱动程序范围的锁的不利之处在于它类似于对整个内核加锁(但规模较小)对性能的影响——也就是说,一次只可以有一个处理器处理网卡。 [技术提示:如果增加的锁是<tt/irqsave/类型的而且被持有较长时间,对性能的影响还包括增加了中断延迟。&rsqb 这里可以进行的改进有两处。可以尝试减少获得与释放锁之间所用的时间,或者在驱动程序内部实现更为细化的锁(比如满足网卡需求的前提下,把整个驱动程序的锁替换为若干保护同时访问若干敏感寄存器或设置的锁)。 但是,对于老式的非智能网卡而言,在设计时根本就没有考虑过多处理器的应用,这样的改进可能无法实现。更糟的是非智能网卡一般要求处理器在网卡和内存之间传送数据,所以在最坏的情况下,每当在ISA总线传送1.5kB数据包时,锁都被一直保持著。 现代的智能网卡一般无需处理器的帮助就可以直接在网卡和内存之间传递网络数据。这是个很大的改进,因为只需要在处理器通知网卡使用哪一块内存保存下一个网络数据包的那一小段时间持有锁。现代的网卡在设计时同样也不要求对整个驱动程序使用一个大锁。 <sect2>Alpha/AXP PCI板上的Linux以太网卡 <p> 对于v2.0,只有3c509、depca、de4x5、pcnet32和所有8390驱动程序(wd、smc-ultra、ne、3c503等等)是编写成“结构无关”的,所以它们可以运行在基于DEC的Alpha CPU系统上。其它一些从Donald的WWW主页上下载的更新过的PCI驱动程序也可以工作,因为它们也是按照结构无关的思想编写的。 注意,使驱动程序与结构无关所需要进行的改动并不很复杂。只需要如下进行: ——把所有与<tt/jiffies/有关的值都乘以HZ/100,得到Alpha使用的不同的HZ值。(即<tt/timeout=2;/变成<tt>timeout=2*HZ/100;</tt>) ——把所有I/O内存(从640k到1MB)的指针引用替换为相应的readb() writeb() readl() writel()调用,如下例所示。 <code> - int *mem_base = (int *)dev->mem_start; - mem_base[0] = 0xba5eba5e; + unsigned long mem_base = dev->mem_start; + writel(0xba5eba5e, mem_base); </code> ——把所有使用I/O内存作为源或目的地址的memcpy()调用替换为相应的<tt/memcpy_fromio()/或者<tt/memcpy_toio()/调用。 以结构无关的方式处理内存访问的细节在近期的内核所附的文件<tt>linux/Documentation/IO-mapping.txt</tt>中进行了说明。 <sect2>SUN/Sparc硬件上的Linux以太网卡。 <p> 要得到最新的Sparc信息,可以访问以下URL: <url url="http://www.geog.ubc.ca/sparc" name="Linux Sparc"> 注意,有些Sparc的以太网硬件从主机获得其MAC地址,因此可能会有多个接口具有相同的MAC地址。如果想在同一个网络上使用多个接口,可以使用<tt/ifconfig/的<tt/hw/选项以分配唯一的MAC地址。 把PCI驱动程序移植到Sparc平台上与上面提到的AXP平台相似。可能的差异出在endian上,因为Sparc是big endian,而AXP和ix86是little endian。 <sect2>其它硬件上的Linux以太网卡。 <p> 还有一些其它硬件平台可以运行Linux,比如Atari/Amiga(m68k)。就象Sparc一样,最好是访问每个Linux支持的平台主页,以了解当前都支持哪些硬件。(欢迎提供这样的站点连接——把它们发给我!) <sect2>不使用Hub连接10/100BaseT <p> 可以不使用Hub连接基于10/100BaseT(RJ45)的系统吗? 如果不使用额外的设备或机械装置,可以很容易地连接两台这样的机器, 但不可能再多。参阅<ref id="utp" name="双绞线"> ——解释了如何做到这一点。而且你不可能简单地交叉几根线或其它什么 就弄出一个Hub,不复制Hub也无法正确完成冲突信号。 <sect2>SIOCSIFxxx: No such device <p> 在启动时出现了一大堆“SIOCSIFxxx: No such device”信息,后面还有一条“SIOCADDRT: Network is unreachable”,怎么回事? 你的以太网设备在启动/插入模块时没有被检测到,当<tt/ifconfig/和<tt/route/运行时,它们没有可用的设备。使用<tt>dmesg | more</tt>来浏览启动信息,看看有没有检测以太网卡的信息。 <sect2>SIOCSFFLAGS: Try again <p> 在运行“ifconfig”时出现“SIOCSFFLAGS: Try again”——怎么回事? 某些其它的设备使用了以太网卡想用的IRQ,所以以太网卡无法使用该IRQ。你不必重新启动来解决这个问题,因为某些设备只是在需要时才获取IRQ,在完成后就释放了。例如某些声卡、串口、软盘驱动器等。你可以键入<tt>cat /proc/interrupts</tt>来看看哪些中断正在 <em/被使用/。绝大多数Linux以太网卡驱动程序只有在用“ifconfig”打开时才获取IRQ。如果你能让其它设备“放开”所需的IRQ中断线,那么你就可以用ifconfig来“Try again”了。 <sect2>使用“ifconfig”得到的连接为UNSPEC,而硬件地址是00:00:00:00:00:00 <p> 在不带参数运行ifconfig时,报告说连接为UNSPEC(而不是10Mbs以太网),而且硬件地址都是零。 这是因为运行的“ifconfig”程序版本比内核的版本高。在与老版本的内核一起运行时,新版本的ifconfig无法报告这些特性。你可以升级内核,或者“降级”ifconfig,或者干脆不理会这个错误。内核知道硬件地址,所以即使ifconfig无法读出它也没有关系。 如果使用的<tt/ifconfig/程序比使用的内核旧很多的话,也会出现一些奇怪的信息。 <sect2>大量的RX和TX错误 <p> 在不带参数运行ifconfig时,报告大量的接收和发送数据包错误。但看起来工作正常——怎么回事? 再看一遍。报告是说<tt/RX packets/ <em/big number/ <bf/停顿/<tt/errors 0/ <bf/停顿/ <tt/dropped 0/ <bf/停顿/ <tt/overrun 0/。所以你看到的那个大数字是机器接收和发送的数据包总数。如果还觉得不可思议,键入<tt>cat /proc/net/dev</tt>看看。 <sect2><tt>/dev/</tt>下的以太网卡入口 <p> /dev/eth0像是个到/dev/xxx的连接。这样对吗? 与你听过的正好相反,/dev/*下的文件没被使用。你可以删除掉任何 <tt>/dev/wd0、/dev/ne0</tt>以及类似的入口。 <sect2>Linux与“trailers” <p> 在“ifconfig”网卡时,需要禁止trailers吗? 不能禁止trailers,而且也没必要。“trailers”是避免在网络层复制数据的工具。其想法是使用一个大小为“H”的固定大小的头,把可变大小的头信息放在包的尾部,并把所有包定位在页开始之前的“H”字节。这只是个好想法,在实际中工作得并不好。如果有人建议使用“-trailers”,那不过是找个替罪羊罢了。这对解决问题没有任何意义,但如果问题真的自行解决了,那么他就可以吹嘘自己的神奇本领了。 <sect2>访问原始以太网设备 <p> 在Linux下怎样不通过TCP/IP之类的东西访问原始的以太网设备? <code> int s=socket(AF_INET,SOCK_PACKET,htons(ETH_P_ALL)); </code> 这样就可以得到一个接收所有协议类型的socket。对它执行<tt/recvfrom()/调用,它就会用sa_family里的设备类型和sa_data数组里的设备名来填充sockaddr。我不知道是谁最早在Linux里使用SOCK_PACKET,但它确实是个非常好的东西。你也可以通过<tt/sendto()/调用发送原始数据包。当然,在这样做时你必须拥有root的权限。 <sect>性能小技巧<label id="perf"> <p> 如果你的以太网吞吐量太小,或者想提高ftp传输的速度,可以使用这里的一些小技巧。 程序<tt/ttcp.c/是测试原始吞吐量大小的好实验。另一个普通的技巧是把一个大于1MB的<tt/large_file/驻留在发送机器的缓冲内存里,然后执行<tt>ftp> get large_file /dev/null</tt>。(至少要“get”两次,因为第一次是把文件驻留在发送机器的缓冲内存中。)把文件驻留在缓冲内存的原因是你对测量里混进从磁盘存取文件的速度不感兴趣。这也是把输入数据发送到<tt>/dev/null</tt>而不是磁盘上的原因。 <sect1>一般概念 <p> 即使一个8比特的网卡在接收背靠背的数据包时也没有问题。但在计算机无法迅速地从网卡接收数据包为更多进来的数据包腾出空间时,困难就出现了。如果计算机不能迅速地清除已经接收到的数据包占据的网卡内存,网卡就没有空间存放新的数据包了。 在这种情况下,网卡或者丢弃新的数据包,或者把它放在以前接收的数据包位置上。任何一个都会引起重新传送而严重地中断平滑的数据传输流,并使性能被严重降低,其降级因子甚至可以达到5! 拥有更多板上内存的网卡可以“缓冲”更多的数据包,因此可以无需丢弃就处理更大量的突发背靠背数据包。这也就意味著网卡不需要主机响应从缓存读取数据包的延迟更小以避免丢弃数据包。 大多数8比特网卡有8kB缓存,而大多数16比特网卡有16kB缓存。大多数的Linux驱动程序要保留3kB的缓存(作为两个Tx缓存),这样就只给8比特网卡剩下5kB作为接收的空间。它只够存放三个完全大小(1500字节)的以太网数据包。 <sect1>ISA网卡和ISA总线速度 <p> 在上面提到,如果从网卡移走数据包的速度足够快,即使Rx数据包缓冲内存的数量小,丢弃/覆盖的情况也不会出现。设置数据包从网卡移到计算机内存的速率的因子是连接这二者的数据通道的速度——即ISA总线的速度。(如果CPU是很慢的386sx-16,它也会起一定的作用。) 推荐的ISA总线时钟为8MHz,但很多主板和周边设备可以运行在更高的频率上。一般通过在CMOS设置里选择主板/CPU时钟频率因子,可以设置ISA总线的时钟频率。有些ISA和PCI/ISA主板可能没有这一选项,那么就只能使用制造商的缺省值了。 例如,下面是在一台40MHz的486上,不同ISA总线速度下,8比特WD8003EP网卡用TTCP程序测量得到的一些接收速度。 <code> ISA总线速度(MHz) Rx TTCP (kB/s) ------------------- -------------- 6.7 740 13.4 970 20.0 1030 26.7 1075 </code> 使用TCP/IP,对<em/任何/10Mb/s以太网卡都难以得到高于1075kB/s的结果。但是,不要期望每一个系统都可以工作在快的ISA总线速度下。大多数系统在高于13MHz的速度上无法正常工作。(同样,某些PCI系统的ISA总线速度固定在8MHz,所以用户没有机会提高它。) 另外,对于快的传输速度,可以从较短的内存和I/O周期减少CPU占用量中获益。(注意,设置在ISA总线上的硬盘和视频卡也会从提高的ISA总线速度中感受到性能的提高。) 在实验超过8MHz的ISA总线速度之前,一定要备份你的数据,并在提高速度后彻底测试所有的ISA周边设备是否工作正常。 <sect1>设置TCP的Rx窗口 <p> 再说一遍,网卡的板上RAM小以及网卡与计算机内存间的数据通道相对较慢会引起麻烦。TCP缺省的Rx窗口设置为32kB,也就是说与你在同一子网的一台较快的计算机会一下子发给你32kB的数据,而不会停下来看看你是否正常地接收到了它们。 近期版本的<tt/route/命令能够在运行过程中设置这个窗口的大小。一般它只用在需要减小该窗口的局域网,因为在若干路由器或网关后面的计算机会得到足够的“缓冲”而不造成问题。下例为一个可能的用法: <code> route add <whatever> ... window <win_size> </code> 其中的<tt/win_size/是你希望使用的窗口大小(以字节计算)。一个运行在8MHz或更低速度下的ISA总线上的8比特3c503网卡,可以在4kB大小的窗口下很好地工作。太大的窗口会导致覆盖和丢弃数据包,并严重降低以太网的吞吐量。你可以用<tt>cat /proc/net/dev</tt>检查操作状态,它会显示出现的丢弃或覆盖状况。 <sect1>增强NFS性能 <p> 有些人发现在使用8kB(Sun的原始值)的NFS数据包大小时,在NFS客户端使用8比特网卡得到的性能比预期的要差。 可能的原因在于8比特网卡与16比特网卡的板上缓存大小不同。最大的以太网数据包大小为1500字节。这样8kB的NFS数据包就成为大约6个背靠背的最大大小的以太网数据包。8比特网卡和16比特网卡在接收背靠背数据包时都没有问题。在机器无法及时从网卡缓存移走数据包时就有问题了,缓存会溢出。8比特网卡每次传送时要多占用一个ISA总线周期的事实也帮不上忙。如果用的是8比特网卡,你<em/能/做的是把NFS传送大小设置为2kB(甚至1kB),或者试著提高ISA总线速度以加快清空网卡上的缓存。我发现8MHz下(没有其它系统负载),一个旧的WD8003E网卡可以跟得上2kB大小的NFS接收,但在4kB时,性能降低的因子为3。 另一方面,如果缺省的安装选项为1kB大小,而你的网卡至少为16比特的 ISA网卡,把其大小提高到4kB(甚至8kB)会使性能显著提高。 <sect>有关销售商/制造厂家/型号的信息<label id="card-intro"> <p> 下面按照销售商名称和产品标识的字母顺序列出了许多网卡。在每个产品ID旁都标明了“支持”、“半支持”或“不支持”。 支持意味著该网卡的驱动程序存在,而且许多人在愉快地使用著此驱动程序,它看起来相当可靠。 半支持意味著该网卡的驱动程序存在,但至少下面的描述中有一个是真实的:(1) 驱动程序或硬件有Bug,会导致性能差、连接失败甚至死机。(2) 驱动程序是新的或网卡不够普及,因此驱动程序得到的使用/测试机会很少,驱动程序的作者收到很少的反馈信息。很明显(2)比(1)要好一些,在网卡/驱动程序的独立描述中会指明它属于哪种情况。对这两种情况,在运行<tt/make config/回答“Prompt for development and/or incomplete code/drivers?”时都应该回答“Y”。 不支持意味著该网卡目前还没有可使用的驱动程序。这可能是由于对很少见的硬件缺乏兴趣,也可能是销售商还没有发布编写驱动程序所需的硬件资料。 注意,“支持”和“半支持”之间的区别是相当主观的,是基于新闻组和邮件列表信息上得到的用户反馈进行区分的。(无论如何,一个人来测试每个版本内核上所有网卡的所有驱动程序是不可能的!!!)所以你可能会发现一个被标为半支持的网卡工作得很好(这样很不错),或者一个被标为支持的网卡给你带来无穷的麻烦(这样就不够好)。 在这些状态后面,列出了Linux内核中给出的驱动程序名称。这也是<tt>/etc/conf.modules</tt>模块配置文件里<tt/alias eth0 driver_name/一行所使用的驱动程序模块的名称。 <sect1>3Com<label id="3com"> <p> 如果你确定不了你的网卡是什么,但认为它是3Com网卡,你可以通过集成块编号来识别它。3Com有一本资料“通过集成块编号识别适配器”(ref 24500002),它应该能让你弄明白。参见<ref id="3com-tech" name="3Com的技术信息">以了解如何从3Com索取该资料。 注意,3Com还有个有各种好东西的WWW/FTP站点:<tt/ftp.3Com.com/,你也许想去看看。对于某些他们的网卡甚至还有Linux驱动程序,可能你想检验一下。据说他们的驱动程序不太稳定,或者在SMP和非基于ix86的机器上不稳定,所以需要记住这一点。 <sect2>3c501<label id="3c501"> <p> 状态:半支持,驱动程序名称:3c501 这种过时的石器时代的8比特网卡用起来会很头疼的。象瘟疫一样躲开它吧。不要买这种网卡,哪怕是开玩笑也不要买。它的性能很差劲,而且很容易坏掉。 对那些还不肯相信的人来说,3c501一次只能干一件事——在从其单包缓存移出一个数据包时,它不能接收另一个包,在载入一个发送包时也不能接收一个包。对于两台处理一个包并回答会花掉10毫秒的基于8088的计算机之间的网络而言,这就不错了,但现代网络几乎每次事务都会发送背靠背数据包。 AutoIRQ可以工作,没使用DMA,自动检测只能查看<tt/0x280/和<tt/0x300/,诊断级别通过第三个启动参数设置。 再说一遍,<em/强烈反对/使用3c501!更差的是在IP广播内核中,在侦听<em/所有/广播包时你会进入暂停状态。阅读源码头部的注释以得到更多的细节。 <sect2>EtherLink II, 3c503, 3c503/16<label id="3c503"> <p> 状态:支持,驱动程序名称:3c503 (+8390) 3c503没有“EEPROM setup”,所以在Linux下运行该网卡无需使用诊断/设置程序。3c503的共享内存地址是用跳线设置的,与启动PROM地址共享。熟悉其它ISA网卡的人可能会被弄糊涂,因为其它ISA网卡除非有启动PROM,都是让跳线设为“禁止”的。 因为WD80x3的总线宽度一样,这些网卡的速度也应该一样,但实际上更慢一些。这些共享内存的的以太网卡还有一种不使用8390工具的可编程I/O模式(它们的工程师发现了太多的Bug!)。Linux的3c503驱动程序也可以工作在3c503的可编程I/O模式,但不如共享内存模式可靠,而且更慢。同样,在更新驱动程序时可编程I/O模式没有很好地测试。不要使用可编程I/O模式,除非要与MS-DOS兼容。 3c503的IRQ中断线用软件设置,在EEPROM中没有其痕迹。与MS-DOS驱动程序不同,Linux的驱动程序有autoIRQ的能力:它使用{5,2/9,3,4}中第一条可用IRQ中断线,在每次运行ifconfig时进行选择。(老式的驱动程序版本在启动时选择IRQ。)如果没有IRQ中断线可用,“ifconfig”里的ioctl()调用将返回EAGAIN。 某些使用503会遇到的常见问题在<ref id="3com-probs" name="3Com网卡的问题">中进行了讨论。 如果你想把该驱动程序作为一个可载入的模块,应该阅读<ref id="modules" name="把以太网驱动程序作为模块使用">以了解有关模块的信息。 注意,一些旧的无盘386工作站有一个板上的3c503(3Com制造,但用其它名称销售,如“Bull”),但销售商ID不是3Com的ID,所以检测不出来。更多的资料可以在Etherboot软件包里找到,要启动这些无盘工作站你一定得有这些东西。 <sect2>Etherlink Plus 3c505<label id="3c505"> <p> 状态:半支持,驱动程序名称:3c505 这些网卡使用i82586芯片,但没有太多的有关这些网卡的资料。标准内核包含该驱动程序,但它被归为alpha版本的驱动程序。参见<ref id="alfa" name="Alpha驱动程序">以了解在Linux下使用alpha/测试版本以太网驱动程序的重要信息。 如果你要使用这样的网卡,还应该读一下<tt>/usr/src/linux/drivers/net/README.3c505</tt>文件。它包含了你可以使用/禁止的各种选项。 <sect2>Etherlink-16 3c507<label id="3c507"> <p> 状态:半支持,驱动程序名称:3c507 该网卡使用了一块Intel芯片,其驱动程序的开发与Intel的Ether Express驱动程序开发关系很密切。在标准的内核发行版本中包含了其驱动程序,但是是作为一个alpha版本的驱动程序。参见<ref id="alfa" name="Alpha驱动程序">以了解在Linux下使用alpha/测试版本以太网驱动程序的重要信息。 <sect2>Etherlink III, 3c509 / 3c509B<label id="3c509"> <p> 状态:支持,驱动程序名称:3c509 这种网卡相当便宜,而且对ISA的无总线控制的设计而言性能相当好。其缺点在于原始的3c509要求很低的中断延迟。3c509B有一个较大的缓存,应该没有这个问题。(见下文。)这些网卡使用PIO传输,与ne2000网卡相似,相对而言,wd8013一类使用共享内存的网卡效率更高一些。 原始的3c509有一个小的包缓存(总共4kB,2kB Rx,2kB Tx),如果中断屏蔽的时间过长,驱动程序就会丢弃数据包。要减轻这个问题,可以尝试在IDE磁盘传输过程中不屏蔽中断(参见<tt/man hdparm/),或者提高ISA总线速度使IDE传输结束得早一些。 新型号的3c509B板上缓存为8kB,并且可以把Rx/Tx划分成4/4、5/3或6/2。这一设置要用DOS配置工具来改变,并保存在EEPROM上。这会减轻上面提到原始3c509的问题。 3c509B的用户可以使用提供的DOS工具来禁止<em/即插即用/支持,<em/并/把输出媒介设置为要求的东西。目前的Linux驱动程序还<em/不/支持自动检测媒介设置,所以<em/必须/选择10Base-T、10Base-2或AUI。注意,要完全禁止PnP,需要使用<tt>3C5X9CFG /PNP:DISABLE</tt>并重新冷启动以确保设置生效。 有些人询问DOS配置工具中出现的“Server or Workstation”和“Highest Modem Speed”设置。Donald写道:“这些只不过是给驱动程序的提示,而Linux驱动程序不使用这些参数:它总是优化为高吞吐量,而非低延迟(‘Server’)。低延迟对于老式的无窗口IPX吞吐量非常关键。为了减少延迟,3c509的MS-DOS驱动程序对某些操作禁止中断,阻塞串口中断。因此需要‘modem speed’设置。Linux驱动程序只对整个包进行操作,例如在数据包完全传到网卡后才开始发送该数据包,从而避免了长时间禁止中断的需要。” 注意,ISA网卡检测使用的方法与大多数网卡不同。基本上是通过发送数据到ID_PORT(从端口<tt/0x100/到<tt/0x1ff/,间隔为<tt/0x10/)要求网卡响应。这一检测方法意味著在多ISA的3c509配置中,某个特定网卡<em/总/是首先被检测,而硬件以太网地址最低的网卡<em/总/是作为<tt/eth0/。这其实没什么问题,但有些人想为特定的接口分配一个6字节的硬件地址。如果有多块3c509网卡,最好不指定I/O端口(即使用I/O=zero)使用<tt/ether=0,0,ethN/命令,让自动检测来排列哪一块网卡作为第一块网卡。使用非零的I/O值会使该命令无法检测所有的网卡,所以不要这样做。 如果这使你感到困扰,看一下Donald的最新驱动程序,你可以在未使用的内存地址域中使用一个<tt/0x3c509/值,使检测的顺序符合你的要求。 <sect2>3c515<label id="cork"> <p> 状态:支持,驱动程序名称:3c515 这是3Com的ISA 100Mbps产品,编码名为“CorkScrew”。v2.2内核里包含了从Donald那儿得到的这些网卡的相对较新的驱动程序。要获得更新的资料,可以访问Vortex的网页: <url url="http://www.scyld.com/linux/drivers/vortex.html" name="Vortex"> <sect2>3c523<label id="3c523"> <p> 状态:半支持,驱动程序名称:3c523 这个MCA总线的网卡使用i82586,Chris Beauregard修改了ni52驱动程序用于这些网卡。在v2.2内核源码树里可以找到它的驱动程序。 更多的细节可以在MCA-Linux的网页上找到 <tt>http://glycerine.cetmm.uni.edu/mca/</tt> <sect2>3c527<label id="3c527"> <p> 状态:不支持。 对,这是另一个MCA网卡,对它没兴趣。如果你坚持用MCA,最好用3c529。 <sect2>3c529<label id="3c529"> <p> 状态:支持,驱动程序名称:3c509 这个网卡实际上使用与3c509相同的芯片组。实际上早在内核里加进对MCA的支持之前,Donald就已经在3c509的驱动程序里放了些钩子函数,在探测完EISA网卡后,开始探测ISA网卡之前,检查MCA网卡。所需的MCA探测代码被包含在与v2.2内核一起提供的驱动程序里。更多的细节可以在MCA-Linux网页上找到: <tt>http://glycerine.cetmm.uni.edu/mca/</tt> <sect2>3c562 <p> 状态:支持,驱动程序名称:3c589(独立发行) 这个PCMCIA网卡是3c589B网卡与modem的组合。对于终端用户,modem与一个标准的modem一样。唯一的麻烦是要使两个独立的Linux驱动程序共用一个中断。该卡上有一些新的寄存器和一些支持共享中断的硬件。需要使用支持共享中断的v2.0以上的内核版本。 <!-- XXX Product discontinued so this can go soon... As a side note, the modem part of the card has been reported to be not well documented for the end user (the manual just says `supports the AT command set') and it may not connect as well as other name brand modems. The recommendation is to buy a 3c589B instead, and then get a PCMCIA modem card from a company that specializes in modems. --> 再次感谢Cameron提供给David Hinds的样品和资料。请在David发行的PCMCIA软件包里寻找支持。 参见<ref id="pcmcia" name="PCMCIA支持">以了解更多的有关PCMCIA芯片组、socket启用软件等信息。 <sect2>3c575 <p> 状态:未知。 这个PCMCIA网卡的驱动程序正在开发中,但愿以后会包含在David的PCMCIA软件包里。最好检查一下PCMCIA软件包以了解目前的状态。 <sect2>3c579<label id="3c579"> <p> 状态:支持,驱动程序名称:3c509 EISA版本的509。目前的EISA版本还使用同样的16比特宽的芯片,而不是32比特的接口,所以性能上的改善并不令人惊奇。确定网卡被配置为EISA寻址模式。阅读上面的3c509一节以了解驱动程序的信息。 <sect2>3c589 / 3c589B<label id="3c589"> <p> 状态:半支持,驱动程序名称:3c589 现在这种PCMCIA网卡已经被很多人使用了相当长时间。注意对它的支持(目前)还不包括在缺省的内核源码树内。名称中“B”的含义与3c509的情况相同。 在Donald的ftp站点和David Hinds的PCMCIA软件包里都有可用的驱动程序。你还需要一套支持PCMCIA控制器的芯片组。参见<ref id="pcmcia" name="PCMCIA支持">以了解更多的有关PCMCIA芯片组、socket启用软件等信息。 <sect2>3c590 / 3c595<label id="vortex"> <p> 状态:支持,驱动程序名称:3c59x 这些“Vortex”网卡是用在PCI总线机器上的,'590是10Mbps的产品,'595是3Com的100Mbs产品。注意'595也可以象'590一样运行(即使用10Mbps模式)。驱动程序包含在v2.0内核源码中,但还在不断升级。如果在使用v2.0内核里的驱动程序时遇到问题,可以从下面的URL获取一个更新的驱动程序: <url url="http://www.scyld.com/linux/drivers/vortex.html" name="Vortex"> 注意,现在有两种不同的3c590网卡,较早的型号有32kB的板上内存,后来的型号只有8kB的板上内存。可能你买一个新的3c59x还没有多久,它就正在被3c90x所取代。如果你是买别人的二手货,想法弄到一个32kB的型号。3c595网卡有64kB板上内存,因为无法只用8kB的RAM就能达到100Mbps! 感谢Cameron Spitzer和3Com的Terry Murphy给Donald提供网卡和资料,使Donald能写出驱动程序来。 <sect2>3c592 / 3c597 <p> 状态:支持,驱动程序名称:3c59x 这些是EISA版本的3c59x系列网卡。3c592/3c597(又名为Demon)可以使用上面讨论的vortex驱动程序。 <sect2>3c900 / 3c905 / 3c905B / 3c905C <p> 状态:支持,驱动程序名称:3c59x 这些网卡(又名为“Boomerang”,或EtherLink III XL)是用来取代3c590/3c595网卡的。 对Cyclone的“B”版本的支持最近才加进来。要在v2.0之前的内核使用该网卡,必须从如下的Donald站点获取更新后的<tt/3c59x.c/驱动程序: <url url="http://www.scyld.com/network" name="Vortex-Page"> <sect2>3c985 <p> 状态:支持,驱动程序名称:acenic Jes Sorensen提供的驱动程序在v2.2内核里能找到。除了3Com的型号,它还支持几种其它的吉比特网卡。 <sect1>Accton<label id="accton"> <p> <sect2>Accton MPX <p> 状态:支持,驱动程序名称:ne (+8390) 不要被它的名字骗了。它还是NE2000兼容网卡,可以使用ne2000驱动程序。 <sect2>Accton EN1203, EN1207, EtherDuo-PCI <p> 状态:支持,驱动程序名称:de4x5, tulip或rtl8139 显然有几种修订版的EN1207(A到D),其中A、B和C是基于tulip的,而D版本的是基于RealTek 8139(驱动程序不同)。所以在购买时要确定如果出问题可以退回。 <sect2>Accton EN2209 Parallel Port Adaptor (EtherPocket) <p> 状态:半支持,驱动程序名称:? 现在有这些并口适配器的驱动程序,但还不包括在2.0或2.1版本内核源码中。可以从如下主页获取驱动程序: <tt>http://www.unix-ag.uni-siegen.de/~nils/accton_linux.html</tt> <sect2>Accton EN2212 PCMCIA Card <p> 状态:半支持,驱动程序名称:? David Hinds在编写该网卡的驱动程序,最好检查一下他的PCMCIA软件包以了解目前的状态。 <sect1>Allied Telesyn/Telesis<label id="allied-telesis"> <p> <sect2>AT1500<label id="at-1500"> <p> 状态:支持,驱动程序名称:lance 这些是使用79C960版本的AMD LANCE的系列低成本以太网卡。它们是可以控制总线的网卡,因此是一种可用的较快的ISA总线以太网卡。 DMA选择和芯片号码信息可以在<ref id="lance" name="AMD LANCE">找到。 更多有关基于AMD LANCE的以太网卡的技术信息可以在<ref id="amd-notes" name="Notes on AMD...">找到。 <sect2>AT1700<label id="at1700"> <p> 状态:支持,驱动程序名称:at1700 注意,要在<tt/make config/时访问该驱动程序依然需要先在回答“Prompt for development and/or incomplete code/drivers?”时回答“Y”。这只是因为这种网卡很少见,导致驱动程序稳定性的反馈太少。如果与内核一起提供的驱动程序出现问题,也许你会对以下的替代驱动程序感兴趣:<tt>http://www.cc.hit-u.ac.jp/nagoya/at1700/</tt> Allied Telesis的AT1700系列网卡是基于Fujitsu的MB86965芯片的。该芯片使用可编程I/O接口和一对固定大小的传输缓存。这样在发送背靠背的一小组数据包时,切换缓存带来的停顿较小。 该网卡的一个独特之处在于除了能够驱动10baseT的100欧姆UTP(非屏蔽双绞线)之外,还能够驱动一般安装在令牌环上的150欧姆STP(屏蔽双绞线)。该网卡还有一个光纤版本(AT1700FT)。 用在AT1700上的Fujitsu芯片有一个设计上的缺陷:它需要机器断电来完全重起。使用reset按钮无法重起总线接口。这也不是太坏,只不过在重起后才能可靠地被检测到。解决方法是在内核检测AT1700有问题时关机器重起。 <sect2>AT2400<label id="at2400"> <p> 状态:支持,驱动程序名称: ne, ne2k-pci (+8390) 还是PCI NE2000兼容网卡,它是基于RealTek 8029芯片的。 <sect2>AT2450<label id="at2450"> <p> 状态:支持,驱动程序名称:pcnet32 这是PCI版本的AT1500,而且没有Boca的79c970 PCI网卡那样的问题。DMA选择和芯片号码信息可以在<ref id="lance" name="AMD LANCE">找到。 更多有关基于AMD LANCE的以太网卡的技术信息可以在<ref id="amd-notes" name="Notes on AMD...">找到。 <sect2>AT2500 <p> 状态:半支持,驱动程序名称:rtl8139 该网卡使用RealTek的8139芯片——参见<ref id="rtl8139" name="RealTek 8139">一节。 <sect2>AT2540FX<label id="at2540"> <p> 状态:半支持,驱动程序名称:eepro100 该网卡使用i82557芯片,因此可能/应该能够使用eepro100的驱动程序。如果你试用过,请发给我一份报告以更新本信息。 <sect1>AMD / Advanced Micro Devices<label id="amd"> <p> AMD的Carl Ching友好地提供了非常详尽的所有有关AMD以太网产品的资料,对澄清本节内容很有帮助。 <sect2>AMD LANCE (7990, 79C960/961/961A, PCnet-ISA)<label id="lance"> <p> 状态:支持,驱动程序名称:lance 这实际上不是AMD的以太网卡。你会阅读本小节的原因是,你在网卡上只能找到AMD标记和上述数字。7990是原始的“LANCE”芯片,但大多数资料(包括本文档)都按照“LANCE”芯片对待所有这些类似的芯片。(......我可以加一句:这样是不对的。) 上面这些数字指明了作为许多以太网卡的核心的AMD芯片。例如,Allied Telesis的AT1500(参见<ref id="at-1500" name="AT1500">)和NE1500/2100(参见<ref id="ne1500" name="NE1500">)就使用了这些芯片。 7990/79c90早已被新版本所取代。79C960(又名PCnet-ISA)主要包含79c90核心以及所有其它必须的硬件支持,可作为单片以太网卡的解决方案。79c961(PCnet-ISA+)是'960的无跳线即插即用版本。ISA系列的最后一个芯片是79c961A(PCnet-ISA II),增加了全双工的功能。除了那些使用共享内存配置的原始7990的非常古老的网卡,所有使用这些芯片的网卡都可以使用lance.c驱动程序。可以通过DMA通道没有跳线来辨认出这些老网卡。 一个常见的问题是遇到“busmaster arbitration failure”消息。在固定的时间之内(50us)LANCE驱动程序无法访问总线时就会出现这一消息。这通常预示主板上的总线控制DMA被破坏,或者某些其它设备霸占了总线,或者DMA通道出现冲突。如果你的BIOS设置中有“GAT option”(保证存取时间),那么试著改变一下其设置看看有没有效。 同样要注意,对一个合法网卡,驱动程序只查看以下地址:<tt/0x300, 0x320, 0x340, 0x360/,启动参数<tt/ether=/所提供的地址被静悄悄地略过了(对此将进行修改),所以现在要确定你的网卡配置为上述的一个I/O地址。 即使安装了超过16MB的内存,该驱动程序依然工作得很好,因为必要时它会使用低端内存“bounce-buffers”(即在发送数据到网卡进行传输之前,16MB以上内存的数据会先拷贝到16MB以下的一个缓存里。) DMA通道可以用除此之外不被使用的dev->mem_start值的低位进行设置(又名PARAM_1)。(参见<ref id="ether" name="PARAM_1">)如果没有设置,那么按次序启用每个空闲的DMA通道并检查是否初始化成功来进行探测。 HP-J2405A板是个例外:在该板上很容易读出EEPROM设置的IRQ和DMA的值。 参见<ref id="amd-notes" name="Notes on AMD...">以了解更多有关这些芯片的信息。 <sect2>AMD 79C965 (PCnet-32)<label id="pcnet-32"> <p> 状态:支持,驱动程序名称:pcnet32 这是PCnet-32——用于VL总线和局部总线系统的原始LANCE芯片的32比特总线控制版本。这些芯片可以用标准的<tt/lance.c/驱动程序操作,同时还有一个不受任何ISA总线有关16MB限制的32比特版本的驱动程序(<tt/pcnet32.c/)。 <sect2>AMD 79C970/970A (PCnet-PCI)<label id="pcnet-pci"> <p> 状态:支持,驱动程序名称:pcnet32 这是PCnet-PCI——与PCnet-32相似,不过是为基于PCI总线系统设计的。请参阅上面的PCnet-32信息。这意味著需要构建一个启用PCI BIOS支持的内核。'970A在原始的'970设计上增加了全双工支持及其它一些特性。 注意,Boca制造的79C970无法用在较快的奔腾机器上。这是个硬件错误,它也会影响DOS用户。参考Boca一节以了解更多的细节。 <sect2>AMD 79C971 (PCnet-FAST) <p> 状态:支持,驱动程序名称:pcnet32 这是用于PCI系统的AMD的100Mbit芯片,也支持全双工操作。1996年6月出产。 <sect2>AMD 79C972 (PCnet-FAST+) <p> 状态:支持,驱动程序名称:pcnet32 已经证实该网卡工作情况与'971一样。 <sect2>AMD 79C974 (PCnet-SCSI) <p> 状态:支持,驱动程序名称:pcnet32 这是PCnet-SCSI——从以太网的观点来看基本上按'970处理。参看上文。不要问是否支持芯片的SCSI部分——本文是<em/以太网-HowTo/,不是SCSI-HowTo。 <sect1>Ansel Communications<label id="ansel"> <p> <sect2>AC3200 EISA <p> 状态:半支持,驱动程序名称:ac3200 注意,要在<tt/make config/时访问该驱动程序依然需要先在回答“Prompt for development and/or incomplete code/drivers?”时回答“Y”。这只是因为这种网卡很少见,导致驱动程序稳定性的反馈太少。 其驱动程序作为alpha测试驱动程序被包含在目前的内核里。该网卡是基于ne2000和wd80x3网卡上使用的普通的NS8390芯片。请参见本文的<ref id="alfa" name="Alpha驱动程序">以了解在Linux下使用alpha版驱动程序的重要信息。 如果你在使用该网卡,请让我们知道它的工作情况,虽然在v1.1.25内核里就包含了其驱动程序,但反馈信息很少。 如果你想把该驱动程序作为一个可载入的模块,应该阅读<ref id="modules" name="把以太网驱动程序作为模块使用">以了解有关模块的信息。 <sect1>Apricot <p> <sect2>Apricot Xen-II On Board Ethernet <p> 状态:半支持,驱动程序名称:apricot 这是使用i82596总线控制芯片的板上以太网卡。它的I/O地址只能是<tt/0x300/。从驱动程序的源码上得知,其IRQ也被硬件固定为10。 早期版本的驱动程序倾向于认为<tt/0x300/处存放的一定是apricot NIC。后来才对硬件地址进行检查以避免错误的检测。 <sect1>Arcnet<label id="arcnet"> <p> 状态:支持,驱动程序名称:arcnet (arc-rimi, com90xx, com20020) 由于该网卡的价格非常低廉而且以太网性能很好,可能人们会有很多机会捐献出他们的Arcnet硬件,使得很多家用系统都使用Arcnet。 Arcnet的一个优点在于所有的网卡接口都一样,所以只需要一个驱动程序。它还内建了错误处理机制,据信不会丢失数据包。(对UDP来说这可太棒了!)注意,arcnet驱动程序使用“arc0”作为自己的名字,而不是通常的以太网设备名“eth0”。 在标准内核里包含了若干设置跳线、一般提示和邮寄Bug报告地址的信息文件。 据信100Mbs的ARCnet网卡也可以同样使用该驱动程序! <sect1>AT&T <p> 注意,AT&T的StarLAN是一种孤岛技术,跟SynOptics的LattisNet一样,不能在标准的10Base-T环境里使用,没有能进行“相互交流”的Hub。 <sect2>AT&T T7231 (LanPACER+) <p> 状态:不支持。 这些StarLAN网卡使用的接口类似于i82586芯片。Matthijs Melchior(<tt/matthijs.n.melchior@att.com/)曾经试著用过3c507的驱动程序,好象差不多可以工作了。但从那之后就再没听过多少消息了。 <sect1>Boca Research<label id="boca"> <p> 不错,他们不光是制造多口串行卡。 <sect2>Boca BEN400 <p> 状态:支持,驱动程序名称:ne (+8390) 显然这是一款NE2000兼容网卡,使用VIA VT86C916芯片。 <sect2>Boca BEN (ISA, VLB, PCI)<label id="boca-ben"> <p> 状态:支持,驱动程序名称:lance, pcnet32 这些网卡都是基于AMD的PCnet芯片。需要警告一下潜在的买家,许多用户在使用这些VLB/PCI网卡时遇到了没完没了的麻烦。快的奔腾系统用户受到了特别的打击。注意这并不是驱动程序的问题,因为DOS/Win/NT用户也一样遇到麻烦。Boca的技术支持电话号码是(407) 241-8088,也可以通过<tt/75300.2672@compuserve.com/找到他们。老式的ISA网卡看来没遇到这种问题。 Boca对受影响的使用者提供“包修”服务,需要增加一个缺少的电容,虽然可以解决一些问题,但对大多数人来说并非百分之百奏效。 如果您<em/仍然/想买这种网卡,至少试著得到一个7天无条件退货的条款,这样一旦出问题你就可以退货。 有关AMD芯片更一般的信息可以在<ref id="lance" name="AMD LANCE">找到。 基于AMD LANCE的以太网卡的更多技术信息可以在<ref id="amd-notes" name="Notes on AMD...">找到。 <sect1>Cabletron<label id="ctron"> <p> Donald写道:“是的,又一个不肯提供编程资料的公司。他们要等待几个月来最终确定 所有他们的资料都是私有的,蓄意浪费我的时间。如果可以的话,象躲避瘟疫一样避免使用他们的网卡。还要注意,有人曾打电话给Cabletron,结果听到什么‘有个D. Becker在编写Linux下的驱动程序’之类的话——好象我是为他们工作的。完全不是这么回事。” <!-- If you feel like asking them why they don't want to release their low level programming info so that people can use their cards, write to support@ctron.com. Tell them that you are using Linux, and are disappointed that they don't support open systems. And no, the usual driver development kit they supply is useless. It is just a DOS object file that you are supposed to link against. Which you aren't allowed to even reverse engineer. --> 看来自从几年前Donald写了上述注释后,Cabletron改变他们对于编程资料的政策(象Xircom一样)——如果你想证实这一点或索取编程信息的话,发个e-mail给<tt/support@ctron.com/。但是,现在几乎没有人对老式的E20xx和E21xx网卡提出修改/更新驱动程序的要求了。 <sect2>E10**, E10**-x, E20**, E20**-x<label id="e10xx"> <p> 状态:半支持,驱动程序名称:ne (+8390) 这些差不多算是NEx000兼容网卡,据报告可以使用标准的NEx000驱动程序,这要感谢探测时的ctron特性检查。如果有问题,几乎不可能修复,因为没有编程资料。 <sect2>E2100<label id="e2100"> <p> 状态:半支持,驱动程序名称:e2100 (+8390) 又来了,在编程资料私有的情况下什么都做不了。E2100的设计很差劲。每次传送数据包映射它的共享内存时,它都要映射到<em/整个128K的区域!/这就意味著你<bf/无法/在此区域安全地使用另一个中断驱动的共享内存设备,包括另一个E2100。绝大多数时间它都正常工作,但时不时地会咬你一口。(对,这个问题可以通过传送数据包时关中断来避免,但那样几乎肯定会丢失时钟ticks。)同样,如果错误地对板进行了编程,或者在错误的时刻暂停机器,即使reset按钮都无法生效。你<em/必须/关机并<em/保持/30秒之后再开机。 媒介选择是自动进行的,但可以用dev->mem_end参数的低比特位来覆盖。参见<ref id="ether" name="PARAM_2">。模块用户可以在<tt>/etc/conf.modules</tt>文件里指定<tt/xcvr=N/值作为<tt/option/。 同样,不要把E2100当成NE2100的兼容网卡。E2100是采用NatSemi的DP8390的共享内存设计,大致与伤脑筋的WD8013相似,而NE2100(和NE1500)是用总线控制的AMD的LANCE设计的。 在标准内核里包含了E2100的驱动程序。但是,无法看到其编程资料,不要指望有Bug修复。除非你已经买了该网卡,不要用它。 如果你想把该驱动程序作为一个可载入的模块,应该阅读<ref id="modules" name="把以太网驱动程序作为模块使用">以了解有关模块的信息。 <sect2>E22**<label id="e2200"> <p> 状态:半支持,驱动程序名称:lance 按照Cabletron技术公告牌上的资料,这些网卡使用标准AMD的PC-Net芯片组(参见<ref id="lance" name="AMD PC-Net">)而且可以使用普通的lance驱动程序。 <sect1>Cogent <p> 下面是进行联系的地址和方法: <verb> Cogent Data Technologies, Inc. 175 West Street, P.O. Box 926 Friday Harbour, WA 98250, USA. Cogent Sales 15375 S.E. 30th Place, Suite 310 Bellevue, WA 98007, USA. 技术支持: Phone (360) 378-2929 between 8am and 5pm PST Fax (360) 378-2882 Compuserve GO COGENT Bulletin Board Service (360) 378-5405 Internet: support@cogentdata.com </verb> <sect2>EM100-ISA/EISA <p> 状态:半支持,驱动程序名称:smc9194 这些网卡使用SMC的91c100芯片,可以使用SMC的91c92驱动程序,但还没得到证实。 <sect2>Cogent eMASTER+, EM100-PCI, EM400, EM960, EM964 <p> 状态:支持,驱动程序名称:de4x5, tulip 这些是另一种DEC的21040网卡,希望可以使用标准21040驱动程序很好地工作。 EM400和EM964是使用DEC的21050桥接器和4片21040芯片的4端口网卡。 参见<ref id="dec-21040" name="DEC 21040">以了解这些网卡的更多信息和当前驱动程序的状况。 <sect1>Compaq <p> Compaq并不真正从事制造以太网卡,但他们的很多系统都在主板上嵌入了以太网控制器。 <sect2>Compaq Deskpro / Compaq XL (Embedded AMD Chip) <p> 状态:支持,驱动程序名称:pcnet32 诸如XL系列的机器在主板上有一片AMD的79c97x PCI芯片,可以使用标准的LANCE驱动程序。但在使用前,必须使用一些技巧把PCI BIOS放到可以被Linux发现的地方。Frank Maas友好地提供了其中的细节: “Compaq机器的这个问题在于其PCI目录被载入高端内存,Linux内核无法达到那一点。结果:网卡检测不到,也无法使用(另外鼠标也不工作)。其解决方法(在http://www-c724.uibk.ac.at/XL/里有详尽的描述)是载入MS-DOS,使用Compaq编写的一个小驱动程序,然后用LOADLIN载入Linux内核。好吧,你也许想说“呸、呸”,但到目前为止,这是所我知道的唯一办法。那个小驱动程序的作用只不过是把PCI目录放到其正常的存储位置(这样Linux就可以找到它了)” 更多有关AMD芯片的一般资料可以在<ref id="lance" name="AMD LANCE">找到。 <sect2>Compaq Nettelligent/NetFlex(嵌入ThunderLAN芯片) <p> 状态:支持,驱动程序名称:tlan 这些系统使用Texas Instruments的ThunderLAN芯片。有关ThunderLAN驱动程序的资料可在<ref id="tlan" name="ThunderLAN">找到。 <sect2>Compaq PCI card <p> 状态:支持,驱动程序名称:eepro100 检查你的网卡——如果它的零件登记号是323551-821或者上面有一片intel 82558芯片,那它就是另一种基于Intel EEPro100的网卡。 <sect1>Danpex <p> <sect2>Danpex EN9400 <p> 状态:支持,驱动程序名称:de4x5, tulip 又一个基于DEC的21040芯片的网卡,据报告性能挺好,价格比较便宜。 参见<ref id="dec-21040" name="DEC 21040">以了解这些网卡的更多信息和当前驱动程序的状况。 <sect1>D-Link<label id="d-link"> <p> <sect2>DE-100, DE-200, DE-220-T, DE-250<label id="de-100"> <p> 状态:支持,驱动程序名称:ne (+8390) 一些早期的D-Link网卡没有PROM的标识<tt/0x57/,但ne2000驱动程序能识别它们。对于软件配置的网卡,可以从<tt/www.dlink.com/得到配置程序。DE2**网卡曾经广为报道在早期版本的Linux下会产生传输地址不匹配的虚假错误。注意,有一些Digital (DEC)的网卡也叫做DE100和DE200,只是名称相同而已。 <sect2>DE-520<label id="de-520"> <p> 状态:支持,驱动程序名称:pcnet32 这是使用PCI版本AMD的LANCE芯片的PCI网卡。DMA选择和芯片号码信息可以在<ref id="lance" name="AMD LANCE">找到。 更多有关基于AMD LANCE的以太网卡的技术信息可以在<ref id="amd-notes" name="Notes on AMD...">找到。 <sect2>DE-528 <p> 状态:支持,驱动程序名称:ne, ne2k-pci (+8390) 很明显D-Link已经开始制造PCI NE2000兼容网卡了。 <sect2>DE-530<label id="de-530"> <p> 状态:支持,驱动程序名称:de4x5, tulip 这是一款使用DEC的21040 PCI芯片的通用网卡,据报告可以使用通用的21040 tulip驱动程序。注意,它不是DFE-530。 参见<ref id="dec-21040" name="DEC 21040">以了解这些网卡的更多信息和当前驱动程序的状况。 <sect2>DE-600<label id="de-600"> <p> 状态:支持,驱动程序名称:de600 笔记本电脑以及想让电脑快捷地联上以太网的用户可能用该网卡比较好。在缺省的内核源码树里有它的驱动程序,是Bjorn Ekwall <tt/bj0rn@blox.se/编写的。通过并口可以从该网卡获得180kb/s的传送速度。请阅读内核源码树里的README.DLINK文件。 注意,<em/现在/传递给<tt/ifconfig/的设备名为<tt/eth0/,而不是以前用的<tt/dl0/。 如果你的并口<em/不/是在标准的<tt/0x378/,那么需要重新进行编译,因为地址是直接编译到驱动程序里的。同样还要注意,某些笔记本电脑主板上的并口位于<tt/0x3bc/,某些一体化板卡的并口也是这样。 <sect2>DE-620<label id="de-620"> <p> 状态:支持,驱动程序名称:de620 与DE-600一样,只是有两种输出格式。Bjorn为1.1以上版本内核里的这种型号网卡编写了驱动程序。参见上面有关DE-600的信息。 <sect2>DE-650<label id="de-650"> <p> 状态:半支持,驱动程序名称:de650 (?) 这种PCMCIA网卡已经被有些人在他们的笔记本电脑上使用一段时间了。它是个基本的8390设计,与NE2000很相象。LinkSys的PCMCIA网卡和IC-Card的Ethernet都被认为是DE-650兼容网卡。注意,目前其驱动程序还<em/不/是标准内核的一部分,所以需要做一些打补丁的工作。参见本文档的<ref id="pcmcia" name="PCMCIA支持">。 <sect2>DFE-530TX <p> 状态:支持,驱动程序名称:via-rhine 又一款使用VIA Rhine芯片组。(参见<ref id="rhine" name="VIA Rhine">)不要把它同基于tulip的网卡DE-530相混淆。 <sect2>DFE-538TX <p> 状态:支持,驱动程序名称:rtl8139, 8139too 该网卡使用RealTek 8139芯片——参见<ref id="rtl8139" name="RealTek 8139">一节。 <sect1>DFI<label id="dfi"> <p> <sect2>DFINET-300和DFINET-400<label id="dfi-300"> <p> 状态:支持,驱动程序名称:ne (+8390) 又一款拙劣设计的NE兼容网卡——这些网卡在PROM的前三个字节使用“DFI”,而不是象所有NE1000和NE2000网卡那样在第14和15字节使用<tt/0x57/。(300是8比特的伪NE1000兼容卡,400是伪NE2000兼容卡。) <sect1>Digital / DEC<label id="dec"> <p> <sect2>DEPCA, DE100/1, DE200/1/2, DE210, DE422<label id="dec-200"> <p> 状态:支持,驱动程序名称:depca 源文件“depca.c”里的说明包含了在一台机器里如何使用多块此类网卡。注意,DE422是EISA网卡。这些网卡都是基于AMD的LANCE芯片。参见<ref id="lance" name="AMD LANCE">以了解更多信息。同时最多只能使用两块ISA网卡,因为它们的I/O基址只能设置在<tt/0x300/和<tt/0x200/。如果想这么做的话,请阅读标准内核源码树中的驱动程序源文件<tt/depca.c/里的注释。 其驱动程序也可以用在基于Alpha CPU的机器上,用户还可以使用其中的各种ioctl()函数。 <sect2>Digital EtherWorks 3 (DE203, DE204, DE205)<label id="dec-ewrk3"> <p> 状态:支持,驱动程序名称:ewrk3 这些网卡使用DEC的私有芯片,而不是象早期的DE200网卡那样使用LANCE芯片。它们支持共享内存和可编程I/O两种工作方式,但在使用PIO模式时其性能会下降50&percnt。共享内存的大小可以设置为2kB、32kB或64kB,但驱动程序只进行了2kB和32kB下的测试。在驱动程序文件<tt/ewrk3.c/的开头有更多的信息(包括如何把它作为可载入模块使用),在<tt/README.ewrk3/里也有此类信息。在发行的标准内核里包含了这两个文件。与depca.c一样,该驱动程序也支持Alpha CPU。 标准的驱动程序里有一些有趣的ioctl()调用,可以用来获取或清除数据包统计信息、读/写EEPROM、改变硬件地址等。黑客可以阅读源代码以了解更多此类信息。 除了其它工具软件,David还为这些网卡编写了一个配置工具(依照DOS程序<tt/NICSETUP.EXE/)。这些都可以在大多数Linux的FTP站点的目录<tt>/pub/Linux/system/Network/management</tt>下找到——查找文件<tt/ewrk3tools-X.XX.tar.gz/。 <sect2>DE425 EISA, DE434, DE435, DE500 <label id="dec-eisa"> <p> 状态:支持,驱动程序名称:de4x5, tulip 这些网卡是基于下面会提到的21040芯片。DE500使用21140芯片提供10/100Mbs以太网的连接。阅读下面的21040一节以了解其它信息。在非DEC网卡使用此驱动程序时还有一些编译时的选项。细节可见<tt/README.de4x5/。 所有Digital网卡都自动探测媒介(除了DE500暂时因为专利的原因还不支持这一点)。 驱动程序也支持Alpha CPU,可以被作为模块载入。用户可以通过ioctl()调用访问驱动程序的内部——参考“ewrk3”工具和de4x5.c源码以了解如何使用。 <sect2>DEC 21040, 21041, 2114x, Tulip <label id="dec-21040"> <p> 状态:支持,驱动程序名称:de4x5, tulip DEC 21040是Digital的总线控制单片以太网卡产品,与AMD的PCnet芯片类似。21040是为PCI总线结构特别设计的。显然目前不再生产这些芯片了,因为Intel购买了DEC的半导体部分,更倾向于使用他们自己的以太网卡芯片。 对基于此芯片的网卡可以在<em/两个/驱动程序之间进行选择。上面讨论了DE425驱动程序,还有一个通用的21040“tulip”驱动程序。 <bf/警告:/即使你的网卡是基于该芯片的,<em/驱动程序也可能出问题/。Davies写道: “无法保证‘tulip.c’或‘de4x5.c’可以驱动任一基于DC2114x的网卡,除非说明支持该网卡。为什么??因为一个寄存器,通用寄存器(CSR12),(1)DC21140A中的CSR12是可编程的,而各个销售商的实现各不相同;(2)DC21142/3中的CSR12现在是个SIA控制寄存器(按照DC21041的方式)。唯一的希望是SROM可以编码来帮助构建驱动程序。但这并非可以确保的解决方案,因为有些销售商(如SMC的9332网卡)并未遵从Digital Semiconductor推荐的SROM编程格式。” 从非技术的角度上说,这就意味著你无法确定一个未知的采用DC2114x芯片的网卡可以使用Linux驱动程序,所以在购买网卡<em/之前/,最好确定一下可以退货。 在很多近期的SMC EtherPower网卡中也发现21041芯片被用来代替21040。21140可以支持100Base-T,并使用21040芯片的Linux驱动程序。如果要对非DEC的网卡使用David的<tt/de4x5/驱动程序,请先看一下<tt/README.de4x5/里的细节。 如果有问题的话,请试著从Donald的ftp/WWW站点获取最新的驱动程序版本。 <url url="http://www.scyld.com/network" name="Tulip Driver"> 那里还有一个各种使用21040芯片的网卡/销售商的(非完全)列表。 <sect1>Farallon <p> Farallon销售EtherWave适配器和收发器。其设备可以把多个10baseT设备构成菊花链。 <sect2>Farallon Etherwave <p> 状态:支持,驱动程序名称:3c509 据说这是一个包含EtherWave收发器的3c509兼容网卡。可以成功地使用目前的Linux的3c509驱动程序。对于一般的应用,该网卡过于昂贵了,但在某些特殊情况下可以使用它。小Hub的价格在$125以上,Etherwave还要在板卡的价格之上增加$75-$100——如果拉一根线太少的话就物有所值,如果是缺少两个网络就不值得这么做了。 <sect2>Farallon PCI 593 <p> 状态:支持,驱动程序名称:de4x5, tulip 据说该网卡可以被<tt>de4x5</tt>驱动程序检测到。 <sect1>Fujitsu <p> 与许多网络芯片制造商不同,Fujitsu还制造和销售一些基于他们自己芯片的网卡。 <sect2>Fujitsu FMV-181/182/183/184 <p> 状态:支持,驱动程序名称:fmv18x 从驱动程序来看,这些网卡就是Fujitsu的MB86965网卡的简单改进,这使它们与Allied Telesis的AT1700网卡很相似。 <sect1>Hewlett Packard<label id="hp"> <p> 272**网卡使用可编程I/O,与NE*000板卡类似,但是数据传输端口可以在不访问的时候“关闭”,以避免自动探测驱动程序时的麻烦。 感谢Glenn Talbott帮助澄清了本节有关HP硬件版本号的疑惑。 <sect2>HP Night Director+ 10/100 <p> 状态:支持,驱动程序名称:pcnet32 看来这些网卡使用的是AMD 79C972芯片。 <sect2>27245A<label id="hp-27245a"> <p> 状态:支持,驱动程序名称:hp (+8390) 这是基于8比特8390的10BaseT网卡,出于所有8比特的缘故不推荐使用。几年前该网卡被重新设计为高度集成的,引起了一些只影响测试程序的初始化时的变化,对LAN驱动程序没有影响。(新的网卡在切换进入和退出环回模式后并不立刻处于“准备好”的状态。) 如果你想把该驱动程序作为一个可载入的模块,应该阅读<ref id="modules" name="把以太网驱动程序作为模块使用">以了解有关模块的信息。 <sect2>HP EtherTwist, PC Lan+ (27247, 27252A) <p> 状态:支持,驱动程序名称:hp+ (+8390) HP的PC Lan+与标准的HP PC Lan网卡不同。从v1.1.x开发时其驱动程序就被加入到标准内核的驱动程序列表中。它可以象ne2000一样工作在PIO模式,也可以象wd8013一样工作在共享内存模式。 47B是基于16比特8390的10BaseT w/AUI,而52A是基于16比特8390的ThinLAN w/AUI。这些网卡用于收发数据包缓冲的板上RAM为32K,而不是一般的16KB,而且都提供自动识别LAN连接器的功能。 如果你想把该驱动程序作为一个可载入的模块,应该阅读<ref id="modules" name="把以太网驱动程序作为模块使用">以了解有关模块的信息。 <sect2>HP-J2405A <p> 状态:支持,驱动程序名称:lance 这些网卡比27247/27252A便宜而且稍微快一点儿,但少了一些特性,如AUI、ThinLAN连接与启动PROM插座。这是一个相当通用的LANCE设计,但设计时的一个不起眼的决定使它与通用的“NE2100”驱动程序不兼容。感谢HP的Glenn Talbott提供的资料,使驱动程序能够包含对它的特别支持(包括从板上读取DMA通道)。 更多有关基于LANCE的网卡信息可以在<ref id="amd-notes" name="Notes on AMD...">中找到。 <sect2>HP-Vectra On Board Ethernet <p> 状态:支持,驱动程序名称:lance HP-Vectra在主板上有一个AMD的PCnet芯片。 DMA选择和芯片号码信息可以在<ref id="lance" name="AMD LANCE">找到。 更多有关基于AMD LANCE的以太网卡的技术信息可以在<ref id="amd-notes" name="Notes on AMD...">找到。 <sect2>HP 10/100 VG Any Lan Cards (27248B, J2573, J2577, J2585, J970, J973) <p> 状态:支持,驱动程序名称:hp100 该驱动程序还支持某些Compex VG产品。由于驱动程序支持ISA、EISA和PCI网卡,所以在对内核源码运行<tt/make config/时可以在ISA网卡下找到它。 <sect2>HP NetServer 10/100TX PCI (D5013A) <p> 状态:支持,驱动程序名称:eepro100 显然这只是重新标记过的Intel EtherExpress Pro 10/100B网卡。参见Intel一节以了解更多信息。 <sect1>IBM / International Business Machines<label id="ibm"> <p> <sect2>IBM Thinkpad 300<label id="thinkpad-300"> <p> 状态:支持,驱动程序名称:znet 它与基于Intel的Zenith Z-note兼容。参见<ref id="z-note" name="Z-note">以了解更多信息。 据信下面这个站点有一个新版本Thinkpad的全面的有用资料数据库。我还没有亲自去查看过。 <url url="http://peipa.essex.ac.uk/html/linux-thinkpad.html" Name="Thinkpad-info"> 对不便于使用WWW浏览器的读者,可以试试<tt>peipa.essex.ac.uk:/pub/tp750/</tt> <sect2>IBM Credit Card Adaptor for Ethernet <p> 状态:半支持,驱动程序名称:?(独立发行) 该PCMCIA网卡可以在Linux下正常使用。同样需要指出的是,笔记本电脑需要有支持PCMCIA的芯片组,而且要把支持PCMCIA的补丁加进标准内核。参见本文档中的<ref id="pcmcia" name="PCMCIA支持">。 <sect2>IBM 10/100 EtherJet PCI <p> 状态:支持,驱动程序名称:eepro100 据说该网卡与Intel EtherExpress Pro 100驱动程序兼容。 <sect2>IBM Token Ring <p> 状态:半支持,驱动程序名称:ibmtr 要支持令牌环不仅仅需要写一个设备驱动程序,还要为令牌环编写源路由例程。编写时花费时间最多的地方就是源路由。 开始的驱动程序开发是针对IBM的ISA和MCA令牌环网卡,并在MCA 16/4 Megabit令牌环板上进行过测试,但在其它基于Tropic的板上也可以工作。 <sect1>ICL Ethernet Cards <p> <sect2>ICL EtherTeam 16i/32 <p> 状态:支持,驱动程序名称:eth16i 驱动程序支持该网卡的ISA (16i)和EISA (32)两个版本。它使用的Fujitsu的MB86965芯片也被用在at1700网卡上。 <sect1>Intel Ethernet Cards<label id="intel"> <p> 注意,各种Intel网卡的命名是乱七八糟的。如果有问题,检查网卡上主要芯片的<tt/i8xxxx/号码,对PCI网卡使用<tt>/proc</tt>目录下的PCI信息,然后再与这里列出的数字进行比较。 <sect2>Ether Express <p> 状态:支持,驱动程序名称:eexpress 该网卡使用intel的i82586芯片。驱动程序的早期版本(在v1.2内核里)是alpha-测试驱动程序,大多数人在使用时会遇到麻烦。v2.0内核里的驱动程序要好得多,虽然其源码还被列为实验性的,而且在较快的机器上问题更多。 在驱动程序源码开头的注释里列出了一些与这些网卡有关的问题(并进行了修正!)。至少有一个用户报告说有死锁,使得把驱动程序里所有的<tt/outb/替换为<tt/outb_p/的工作放慢下来。同时还要检查一下驱动程序报告的RAM缓存大小与Intel配置工具报告的是否一致。 <sect2>Ether Express PRO/10 (PRO/10+) <p> 状态:支持,驱动程序名称:eepro Bao Chau Ha编写了这些网卡的驱动程序,早在1.3.x内核中就包含了它。该驱动程序也可以使用在一些基于i82595芯片的Compaq内建以太网系统上。可能需要在适当的地方使用网卡自带的配置工具禁用PnP支持。 <sect2>Ether Express PRO/10 PCI (EISA) <p> 状态:半支持,驱动程序名称:?(独立发行) 有一个在缺省内核外独立发行的PCI版本的驱动程序。这些网卡使用PLX9036 PCI接口芯片和Intel的i82596 LAN控制器芯片。如果你的网卡上有i82557芯片,那么你的网卡就<em/不/是该类型网卡,而是下面要讨论的版本,需要EEPro100驱动程序。 可以从如下站点获得PRO/10 PCI网卡的alpha驱动程序及使用指导: <url url="http://www.ultranet.com/~stalba/eep10pci.html" name="EEPro10 Driver"> 如果是EISA网卡,可能要改一下驱动程序在不同情况下(PCI与EISA)使用的检测机制。 <sect2>Ether Express PRO 10/100B<label id="eepro100"> <p> 状态:支持,驱动程序名称:eepro100 注意,该驱动程序<em/不/支持老式的100A网卡。驱动程序里列出的芯片号码是i82557/i82558。更新驱动程序或寻找支持,请访问: <url url="http://www.scyld.com/network" name="EEPro-100B Page"> <sect1>Kingston <p> Kingston制造各种网卡,包括NE2000+、基于AMD PCnet的网卡和基于DEC tulip的网卡。大多数网卡都可以使用相应的驱动程序。参见<url url="http://www.kingston.com" name="Kingston Web Page">。 <sect1>LinkSys <p> LinkSys制造少量不同的NE2000兼容网卡、一些正统的ISA网卡、一些即插即用的ISA网卡以及一些基于支持ne2000-PCI芯片组的ne2000-PCI兼容网卡。它们的型号太多,这里就不一一列出了。 LinkSys对Linux是友好的,拥有一个专门的Linux支持WWW主页,甚至在某些产品的包装盒上印有Linux字样。请访问: <tt>http://www.linksys.com/support/solution/nos/linux.htm</tt> <sect2>LinkSys Etherfast 10/100 Cards. <p> 状态:支持,驱动程序名称:tulip 注意,这些网卡有几种“修订版”(即使用不同的芯片组),都使用一样的网卡名。第一种使用DEC芯片组。第二种修订版使用Lite-On PNIC 82c168 PCI网络接口控制器,该网卡的第三种修订版使用LinkSys 82c169 NIC芯片。对后两种版本网卡的支持已经被合并到标准的tulip驱动程序里——按照当前所用驱动程序的版本,可能需要进行版本升级来支持它们。 更多的有关PNIC信息可在下面找到: <tt>http://www.scyld.com/linux/drivers/pnic.html</tt> 有关这些网卡各种版本的进一步资料可以在上面提到过的LinkSys的WWW站点得到。 <sect2>LinkSys Pocket Ethernet Adapter Plus (PEAEPP) <p> 状态:支持,驱动程序名称:de620 据说这是DE-620兼容网卡,而且据报道可以正常使用DE-620的驱动程序。参见<ref id="de-620" name="DE-620">以了解更多信息。 <sect2>LinkSys PCMCIA Adaptor <p> 状态:支持,驱动程序名称:de650 (?) 有人猜想这是重新标记过的DE-650。参见<ref id="de-650" name="DE-650">以了解更多信息。 <sect1>Microdyne (Eagle) <p> Eagle Technology(又称Novell网卡)被卖给Microdyne。如果在这里的列表上找不到你的网卡,请检查本文档的Novell一节。虽然Microdyne现在不再积极销售网卡,在他们的网站<tt/ftp.mcdy.com/上还有一些与产品相关的资料。 <sect2>Microdyne Exos 205T <p> 状态:半支持,驱动程序名称:? 这是另一款基于i82586的网卡。Dirk Niggemann <tt/dirk-n@dircon.co.uk/编写了一个自己认为属于“pre-alpha”的驱动程序,希望有人进行测试。要了解细节请写信给他。 <sect1>Mylex <p> 如果想询问有关Mylex的问题,请通过如下号码与他们联系。 <verb> MYLEX CORPORATION, Fremont Sales: 800-77-MYLEX, (510) 796-6100 FAX: (510) 745-8016. </verb> 他们也有一个WEB站点: <url url="http://www.mylex.com" name="Mylex WWW Site"> <sect2>Mylex LNE390A, LNE390B <p> 状态:支持,驱动程序名称:lne390 (+8390) 这些是相当老的使用与wd80x3相似的共享内存方式的EISA网卡。在目前的2.1.x系列内核里有它们的驱动程序。应该确定共享内存地址被设置在1MB以下,或者在机器所安装物理RAM的最高地址之上。 <sect2>Mylex LNP101 <p> 状态:支持,驱动程序名称:de4x5, tulip 这是基于DEC的21040芯片的PCI网卡。可以选择10BaseT、10Base2和10Base5输出。LNP101网卡被证实可以使用通用的21040驱动程序。 参见有关21040芯片一节(<ref id="dec-21040" name="DEC 21040">)以了解更多信息。 <sect2>Mylex LNP104 <p> 状态:半支持,驱动程序名称:de4x5, tulip LNP104使用DEC的21050芯片来处理<em/四个/独立的10BaseT端口。它应该可以使用最近的可以共享中断的21040驱动程序,但(我觉察到)这一尝试还没有人报告使用过。 <sect1>Novell Ethernet, NExxxx及其相关兼容卡。<label id="novell"> <p> 前缀“NE”来自Novell Ethernet。Novell按照最便宜的NatSemi数据手册设计并把制造权卖(扔?)给了Eagle,就是为了向市场提供价格合理的以太网卡。(目前被广泛使用的NE2000网卡。) <sect2>NE1000, NE2000<label id="ne2k"> <p> 状态:支持,驱动程序名称:ne (+8390) ne2000现在是按照NatSemi的8390芯片进行基本设计的通用名称。它们使用可编程I/O,而不是共享内存,使得安装简单,但性能有一点降低,而且带来几个问题。有关NE2000网卡的一些普遍性问题列在<ref id="ne2k-probs" name="Problems with...">里。 有些NE2000兼容卡使用National Semiconductor的“AT/LANTic”83905芯片,提供与wd8013相似的共享内存模式和EEPROM软件配置。共享内存模式比可编程I/O模式占用的CPU要少(也就是更有效)。 一般来说,把NE2000兼容卡的I/O地址放在<tt/0x300/不是个好主意,因为几乎<em/每一个/设备驱动程序启动时都探测这个地址。某些差劲的NE2000兼容卡在被探测到错误区域时处理不当会导致机器死锁。同样,<tt/0x320/也不好,因为SCSI驱动程序会探测<tt/0x330/。 Donald为所有ne2000网卡编写了一个NE2000诊断程序(ne2k.c)。参见<ref id="diag" name="诊断程序">以了解更多信息。 如果你想把该驱动程序作为一个可载入的模块,应该阅读<ref id="modules" name="把以太网驱动程序作为模块使用">以了解有关模块的信息。 <sect2>NE2000-PCI (RealTek/Winbond/Compex)<label id="ne2k-pci"> <p> 状态:支持,驱动程序名称:ne, ne2k-pci (+8390) 是的,无论相信与否,人们制造的PCI网卡是基于十多年前设计的ne2000接口。目前几乎所有这些网卡都是基于RealTek的8029芯片或Winbond的89c940芯片。显然Compex、KTI、VIA和Netvin的网卡也使用这些芯片,只是PCI ID不同。 最新的v2.0内核支持对所有这些网卡的自动检测与使用。(如果你使用v2.0.34之前的内核版本,把它升级以确保网卡被检测到。)目前有两个可选的驱动程序,一个是原始的ISA/PCI驱动程序<tt/ne.c/,另一个是相对较新的只支持PCI的驱动程序<tt/ne2k-pci.c/。 要使用原始的ISA/PCI驱动程序,在运行<tt/make config/时必须对“Other ISA cards”选项回答“Y”,与ISA网卡使用同一个NE2000驱动程序。(这会让你意识到这些网卡并不像PCNet-PCI或DEC 21040网卡一样智能......) 较新的只支持PCI的驱动程序与ISA/PCI驱动程序的区别在于去掉了对所有老式8比特网卡的支持,而且在移动网卡上的数据时使用更大的数据块,不再有老式ISA-NE2000网卡可靠操作所必需的中间暂停。这样驱动程序变得小了一些,效率也高了一些,但在普通应用中这一区别并没明显到令人激动的地步。(如果希望得到最高效率/最低的CPU占用率,那么PCI-NE2000不过是个差劲的选择。)驱动程序更新及更多信息可以在下面找到: <tt>http://www.scyld.com/linux/drivers/ne2k-pci.html</tt> 如果你的NE2000 PCI网卡<em/没有/被最新版本的驱动程序检测到,请与<tt>/usr/src/linux/MAINTAINERS</tt>里列出的NE2000驱动程序维护者联系,并附上<tt>cat /proc/pci</tt>和<tt>dmesg</tt>的输出,以便把对该网卡的支持加到驱动程序里。 还要注意,有些网卡的制造商在明知道他们的网卡完全不同时(如PCNet-PCI或RealTek的8139),依然在产品包装上写著“NE2000 Compatible”。如果有疑问的话,按照本文档查看一下主要芯片的编号。 <sect2>NE-10/100 <p> 状态:不支持。 这些是基于National Semiconductor的DP83800和DP83840芯片的ISA 100Mbps网卡。目前没有驱动程序支持它,也没听说有谁在编写这样的驱动程序。除了一个简单的PDF文件,目前还没有足以编写驱动程序的有关该芯片的资料。 <sect2>NE1500, NE2100<label id="ne1500"> <p> 状态:支持,驱动程序名称:lance 这些网卡使用AMD的原始7990 LANCE芯片,可以使用Linux的lance驱动程序。较新的NE2100兼容卡使用AMD更新后的PCnet/ISA芯片。 某些老版本的lance驱动程序在使用autoIRQ从原始Novell/Eagle 7990网卡获取中断线时会遇到麻烦。希望现在已经被修正了。如果问题没解决,就用LILO来指定IRQ,还有问题的话,请告诉我们。 DMA选择和芯片号码信息可以在<ref id="lance" name="AMD LANCE">找到。 更多有关基于AMD LANCE的以太网卡的技术信息可以在<ref id="amd-notes" name="Notes on AMD...">找到。 <sect2>NE/2 MCA <p> 状态:半支持,驱动程序名称:ne2 若干公司生产了几种NE2000微通道网卡。v2.2内核里提供的ne2驱动程序可以检测如下MCA网卡:Novell Ethernet Adapter NE/2、Compex ENET-16 MC/P和Arco Ethernet Adapter AE/2。 <sect2>NE3200<label id="ne3200"> <p> 状态:不支持。 这种老式的EISA网卡把一片8MHz的80186与一片i82586混合使用。没人为它编写驱动程序,因为没有该网卡的资料,而且也没有对其驱动程序的真正需求。 <sect2>NE3210<label id="ne3210"> <p> 状态:支持,驱动程序名称:ne3210 (+8390) 这一EISA网卡与NE3200完全不同,它使用Nat Semi的8390芯片。其驱动程序可以在v2.2内核源码树中找到。确定共享内存地址被设置在1MB以下,或者在机器所安装物理RAM的最高地址之上。 <sect2>NE5500 <p> 状态:支持,驱动程序名称:pcnet32 这些不过是AMD PCnet-PCI网卡('970A)芯片。更多有关基于LANCE/PCnet的网卡信息可以在<ref id="lance" name="AMD LANCE">找到。 <sect1>Proteon <p> <sect2>Proteon P1370-EA <p> 状态:支持,驱动程序名称:ne (+8390) 很明显这是一款NE2000兼容卡,在Linux下工作得挺好。 <sect2>Proteon P1670-EA <p> 状态:支持,驱动程序名称:de4x5, tulip 这是另一款基于DEC的Tulip芯片的PCI网卡。据说在Linux下工作得挺好。 参见有关21040芯片一节(<ref id="dec-21040" name="DEC 21040">)以了解更多信息。 <sect1>Pure Data <p> <sect2>PDUC8028, PDI8023 <p> 状态:支持,驱动程序名称:wd (+8390) PureData的PDUC8028和PDI8023系列网卡差不多就是wd80x3的兼容网卡——在<tt/wd.c/驱动程序里有特别的代码来探测这些网卡。 <sect1>Racal-Interlan <p> 可以通过WWW站点<tt/www.interlan.com/联系Racal Interlan。我认为在过去他们曾被称为MiCom-Interlan。 <sect2>ES3210 <p> 状态:半支持,驱动程序名称:es3210 这是一款基于EISA 8390的共享内存网卡。有一个实验性的驱动程序与v2.2内核一起发行,据说工作得挺好,但(至少)对早期版本网卡的EISA IRQ和共享内存地址的检测有点问题。(这个问题并不仅限于Linux......)这样就需要给驱动程序提供中断和地址。例如,网卡为IRQ 5,共享内存在<tt/0xd0000/,使用模块化驱动程序,则在<tt>/etc/conf.modules</tt>里添上<tt/options es3210 irq=5 mem=0xd0000/。或者使用编译进内核的驱动程序,在启动时提供<tt/ether=5,0,0xd0000,eth0/。I/O基址是自动检测的,所以在此使用一个零值。 <sect2>NI5010 <p> 状态:半支持,驱动程序名称:ni5010 以前需要另外寻找这些老式8比特MiCom-Interlan网卡的驱动程序,现在它被作为一个实验性的驱动程序与v2.2内核一起发行了。 <sect2>NI5210 <p> 状态:半支持,驱动程序名称:ni52 该网卡也是使用Intel的芯片。Michael Hipp编写了一个驱动程序,作为“alpha”驱动程序被包含在标准内核里。Michael希望得到该网卡用户的反馈。参见<ref id="alfa" name="Alpha驱动程序">以了解在Linux下使用alpha/测试版本以太网驱动程序的重要信息。 <sect2>NI6510 (不是EB)<label id="ni65xx"> <p> 状态:半支持,驱动程序名称:ni65 也有一个基于LANCE的NI6510网卡的驱动程序,而且也是Michael Hipp编写的。它同样也是“alpha”驱动程序。出于某些原因,该网卡与通用的LANCE驱动程序不兼容。参见<ref id="alfa" name="Alpha驱动程序">以了解在Linux下使用alpha/测试版本以太网驱动程序的重要信息。 <sect2>EtherBlaster(又名NI6510EB) <p> 状态:支持,驱动程序名称:lance 从1.3.23内核开始,通用的lance驱动程序里增加了对NI6510EB专有标识<tt/0x52, 0x44/进行的检查。但有人报告说不是所有NI6510EB网卡该标识都一样,这会导致lance驱动程序检测不出你的网卡。如果出现了这一问题,可以把探测(大约在lance.c的第322行)改为printk(),把你的网卡上的值打印出来,然后用它们来代替缺省的<tt/0x52, 0x44/。 在使用lance驱动程序时,网卡可能运行在“高性能”模式下,而不是NI6510兼容模式。 <sect1>RealTek <p> <sect2>RealTek RTL8002/8012 (AT-Lan-Tec) Pocket adaptor<label id="aep-100"> <p> 状态:支持,驱动程序名称:atp 这是一款AT-Lan-Tec与(可能的)其它一些供应商出售的通用低成本的OEM袖珍适配器。在标准内核里包含其驱动程序。注意,驱动程序源文件“atp.c”里包含了一些实质性的信息。 注意,对于早期版本的驱动程序,传递给<tt/ifconfig/的设备名<em/不/是<tt/eth0/,而是<tt/atp0/。 <sect2>RealTek 8009 <p> 状态:支持,驱动程序名称:ne (+8390) 这是一款ISA NE2000兼容网卡,据说使用Linux的NE2000驱动程序工作得挺好。程序<tt/rset8009.exe/可以从RealTek的WWW站点<tt>http://www.realtek.com.tw</tt>获取——或者用FTP从该站点下载。 <sect2>RealTek 8019 <p> 状态:支持,驱动程序名称:ne (+8390) 这是上述网卡的即插即用版本。使用DOS软件禁止PnP功能,启用无跳线配置,把网卡的I/O地址和中断设为可用值,然后就行了。(如果要把驱动程序用作模块的话,不要忘记在<tt>/etc/conf.modules</tt>里添加一个<tt/io=0xNNN/选项。)程序<tt/rset8019.exe/可以从RealTek的WWW站点<tt>http://www.realtek.com.tw</tt>获取——或者用FTP从该站点下载。 <sect2>RealTek 8029 <p> 状态:支持,驱动程序名称:ne, ne2k-pci (+8390) 这是一款NE2000兼容的PCI单芯片产品。现在各个销售商都在销售使用该芯片的网卡。参见<ref id="ne2k-pci" name="NE2000-PCI">以了解使用该网卡的有关信息。注意,这依然是附在PCI总线上的十多年前的老式设计。其性能并不比相应的ISA型号好多少。 <sect2>RealTek 8129/8139<label id="rtl8139"> <p> 状态:半支持,驱动程序名称:rtl8139 另一款RealTek的PCI单芯片以太网产品。基于该芯片的网卡的驱动程序被包括在Linux的v2.0.34发行版本中。目前在回答是否要使用v2.2内核里的实验性驱动程序时,依然要回答“Y”以获得使用该驱动程序的权利。 Donald说基于该芯片的网卡的价格与PCI NE2000兼容网卡大致相同(在有些地方甚至会便宜13美元!),虽然8139的设计并非最好的10/100板子,还是要比PCI NE2000兼容网卡好。 2.4.x内核还有一个叫做<tt>8139too</tt>的驱动程序,是基于rtl8139的,但试图处理一些人们报告的更普遍的问题,所以如果使用的是2.4内核,可以试一下。 <sect1>Sager <p> <sect2>Sager NP943 <p> 状态:半支持,驱动程序名称:3c501 这只不过是一款S.A. PROM前缀不同的3c501兼容网卡。我认为它跟原始的3c501一样伤脑筋。其驱动程序检查NP943 I.D.之后把它当成3c501来处理。参见<ref id="3c501" name="3Com 3c501">以了解为什么实际上不需要使用这些网卡。 <sect1>Schneider & Koch <p> <sect2>SK G16 <p> 状态:支持,驱动程序名称:sk_g16 其驱动程序被包含在v1.1内核中,是PJD Weichmann和SWS Bern编写的。似乎SK G16与NI6510相似,都是基于LANCE芯片的第一版(7990)。再重复一次,似乎该网卡无法使用通用的LANCE驱动程序。 <sect1>SEEQ <p> <sect2>SEEQ 8005 <p> 状态:支持,驱动程序名称:seeq8005 驱动程序里只包含了很少的网卡信息,所以这里也没有多少相关信息。如果有问题的话,最好发e-mail给源码中列出的驱动程序作者。 <sect1>SMC (Standard Microsystems Corp.) <label id="smc"> <p> 在许多年前wd8003和wd8013还是主流产品时,Western Digital的以太网部门就被SMC收购了。在那之后,SMC继续制造基于8390的ISA网卡(Elite16、Ultra、EtherEZ),并增加了几种PCI产品。 与SMC的联系方法: SMC / Standard Microsystems Corp., 80 Arkay Drive, Hauppage, New York, 11788, USA. Technical Support via phone: 800-992-4762 (USA) or 800-433-5345 (Canada) or 516-435-6250 (Other Countries). Literature requests: 800-SMC-4-YOU (USA) or 800-833-4-SMC (Canada) or 516-435-6255 (Other Countries). Technical Support via E-mail: <tt/techsupt@ccmail.west.smc.com/. FTP Site: <tt/ftp.smc.com/. WWW Site: <url url="http://www.smc.com" name="SMC">. <sect2>WD8003, SMC Elite <p> 状态:支持,驱动程序名称:wd (+8390) 这些是网卡的8比特版本。8比特的8003比较便宜,但只在流量小的用途上是划算的。注意,某些没有EEPROM的网卡(使用跳线的兼容卡,或非常<em/非常古老/的wd8003网卡)无法报告它们使用的中断线。此时,如果使用auto-irq失败,驱动程序就会静悄悄地分配IRQ 5。你可以从SMC的FTP站点获取设置/驱动程序磁盘。注意,某些较新的SMC的“SuperDisk”程序检测不到那些确实古老的无EEPROM的网卡。文件<tt/SMCDSK46.EXE/看来是个相当全面的方法。前面提到的档案中的一个ASCII文本文件里给出了所有这些网卡的跳线设置。最新(最好?)的版本可以从<tt/ftp.smc.com/得到。 这些基本上与它们的16比特对应网卡(WD8013 / SMC Elite16)是一样,所以可以从下一节了解更多的信息。 <sect2>WD8013, SMC Elite16<label id="8013"> <p> 状态:支持,驱动程序名称:wd (+8390) 若干年后,SMC在设计中添加了更多的寄存器和一个EEPROM。(第一块wd8003网卡已经面世十年了!)兼容卡一般使用的名称为“8013”,而且通常采用无EEPROM(用跳线)的设计。近期型号的SMC网卡使用SMC的83c690芯片,代替了早期网卡上的原始Nat Semi的DP8390。共享内存设计使网卡的速度比PIO网卡快了一点,尤其是对较大的数据包。更重要的是,从驱动程序的角度来看,避免了8390可编程I/O模式的几个Bug,允许多个线程安全地访问数据包缓存,而且在热启动探测时不会因为可编程I/O数据寄存器导致死机。 无EEPROM的网卡在无法读取选定的中断时会尝试auto-irq,如果失败的话,它会静悄悄地分配IRQ 10。(8比特版本分配IRQ 5。) 板上内存大小不标准的网卡可以在启动时指定内存大小(如果使用模块的话,把它作为<tt>/etc/conf.modules</tt>中的一个选项)。8比特网卡的标准内存大小为8kB,16比特网卡为16kB。例如,老式的WD8003EBT网卡可以用跳线设置为32kB内存。要完全使用这些RAM,需要如下操作(对I/O=0x280和IRQ 9): <code> LILO: linux ether=9,0x280,0xd0000,0xd8000,eth0 </code> 参见<ref id="8013-probs" name="8013问题">以了解某些常见问题。 如果你想把该驱动程序作为一个可载入的模块,应该阅读<ref id="modules" name="把以太网驱动程序作为模块使用">以了解有关模块的信息。 <sect2>SMC Elite Ultra<label id="ultra"> <p> 状态:支持,驱动程序名称:smc-ultra (+8390) 该以太网卡是基于SMC的83c790芯片,比83c690多几个新特性。虽然有一种与老式SMC以太网卡相似的模式,它无法与老的WD80*3驱动程序完全兼容。但在这种模式下,它可以与其它8390驱动程序共享大部分代码,而且操作比WD8013兼容网卡稍微快一点。 由于Ultra部分<em/看起来象/8013,所以Ultra探测应当在wd8013探测错误地识别一个Ultra网卡之前找到它。 Donald提到可以为Ultra的“Altego”模式编写一个独立的驱动程序,该模式允许把发送链接起来进行,其代价是接收缓存的利用效率会下降,但是也可能不下降。 总线控制SCSI主机适配器的用户需要注意:在与Interactive UNIX一起发行的手册里提到,SMC Ultra里的一个Bug会导致aha-154X主机适配器运行的SCSI磁盘数据损坏。这可能影响aha-154X兼容卡,如BusLogic板和AMI-FastDisk SCSI主机适配器。 SMC承认在Interactive和老式Windows NT驱动程序上会出现这个问题。它是早期版本的网卡存在的硬件冲突,可以通过驱动程序的设计解决。目前的Ultra驱动程序通过只在与网卡传递数据时才启用共享内存避免了这个问题。确定你的内核版本至少是1.1.84以上,或者启动时报告的驱动程序版本至少为<tt/smc-ultra.c:v1.12/,否则就会出问题。 如果你想把该驱动程序作为一个可载入的模块,应该阅读<ref id="modules" name="把以太网驱动程序作为模块使用">以了解有关模块的信息。 <sect2>SMC Elite Ultra32 EISA<label id="ultra32"> <p> 状态:支持,驱动程序名称:smc-ultra32 (+8390) 这个EISA网卡与其相应的ISA网卡有很多共同点。在v2.0和v2.2内核里都包含了一个可以使用(而且稳定)的驱动程序。感谢Leonard Zubkoff买了一些这样的网卡,使得Linux里能够增加对它们的支持。 <sect2>SMC EtherEZ (8416) <p> 状态:支持,驱动程序名称:smc-ultra (+8390) 该网卡使用SMC的83c795芯片并支持即插即用特性。它也有<em/SMC Ultra/兼容模式,可以使用Linux的Ultra驱动程序。要得到最佳效果,请使用SMC提供的程序(通过他们的FTP/WWW站点)禁用PnP,并把它配置为共享内存模式。参见上面有关Ultra驱动程序的说明。 对于v1.2内核,该网卡必须被配置为共享内存模式。但v2.0内核可以在共享内存或可编程I/O模式下使用该网卡。共享内存模式稍微快一点,而且对CPU资源的占用少一些。 <sect2>SMC EtherPower PCI (8432)<label id="smc-pci"> <p> 状态:支持,驱动程序名称:de4x5, tulip 先声明一点:EtherPower II是一款完全不同的网卡。往下看!这些网卡是基本的DEC 21040产品,即一个大芯片和若干收发器。Donald在开发通用21040驱动程序(又名<tt/tulip.c/)时使用了一块这样的网卡。再一次感谢Duke Kamstra提供了开发时所用的网卡。 某些近期版本的这种网卡使用较新的DEC 21041芯片,在使用早期版本的tulip驱动程序时可能会有问题。如果遇到麻烦,请确定使用的是最新发布的驱动程序,它可能还没有被包含在目前的内核源码树中。 参见<ref id="dec-21040" name="DEC 21040">以了解这些网卡的更多信息和当前驱动程序的状况。 很明显,EtherPower-II网卡的最新版本使用9432芯片。目前还不清楚它是否可以使用现在的驱动程序。同样,如果无法确信的话,在购买网卡<em/之前/,先确定如果不能使用Linux驱动程序就可以退货。 <sect2>SMC EtherPower II PCI (9432)<label id="smc-pci-II"> <p> 状态:半支持,驱动程序名称:epic100 这些网卡是基于SMC 83c170芯片,与基于Tulip的网卡完全不同。在v2.0和v2.2内核里包含支持它的新驱动程序。更多的细节请访问: <tt>http://www.scyld.com/linux/drivers/epic100.html</tt> <sect2>SMC 1211TX 10/100 <p> 状态:半支持,驱动程序名称:rtl8139 显然SMC已经不再是如Ultra和EPIC那样提供网卡的同一家公司。芯片设计部分现在叫做SMSC,而SMC的名称是与低端OEM板联系在一起的,就像这块板一样——带一块修改过的EEPROM的RealTek 8139。 <sect2>SMC 3008 <p> 状态:不支持。 这些8比特网卡是基于Fujitsu MB86950的,它是Linux at1700驱动程序所用MB86965的古老版本。Russ说可以通过阅读at1700.c代码和他自己的Tiara网卡DOS驱动程序包(tiara.asm)来编写它的驱动程序。这些网卡不是很常见。 <sect2>SMC 3016 <p> 状态:不支持。 这些是16比特的I/O映射8390网卡,与通用NE2000网卡很相似。如果你能从SMC得到说明资料,那么移植NE2000驱动程序将相当简单。这些网卡不是很常见。 <sect2>SMC-9000 / SMC 91c92/4 <p> 状态:支持,驱动程序名称:smc9194 SMC9000是基于91c92芯片的VLB网卡。91c92也出现在若干其它品牌网卡上,但相当少见。 <sect2>SMC 91c100 <p> 状态:半支持,驱动程序名称:smc9194 据说SMC 91c92驱动程序支持该款基于100Base-T芯片的网卡,但目前还未得到证实。 <sect1>Texas Instruments <p> <sect2>ThunderLAN<label id="tlan"> <p> 状态:支持,驱动程序名称:tlan 该驱动程序覆盖了许多Compaq的内建以太网设备,包括NetFlex和Netelligent系列。它还支持Olicom的2183、2185、2325和2326产品。 <sect1>Thomas Conrad <p> <sect2>Thomas Conrad TC-5048 <p> 这是基于DEC的21040芯片的另一款PCI网卡。 参见有关21040芯片一节(<ref id="dec-21040" name="DEC 21040">)以了解更多信息。 <sect1>VIA <p> 你可能没见过VIA网卡,但VIA制造的几种网络芯片被用在其它厂家的以太网卡上。他们有一个WWW站点: <tt>http://www.via.com.tw/</tt> <sect2>VIA 86C926 Amazon <p> 状态:支持,驱动程序名称:ne, ne2k-pci (+8390) 该控制器芯片是VIA提供的PCI-NE2000。你可以选择ISA/PCI驱动程序<tt/ne.c/或者只支持PCI的驱动程序<CODE><tt/ne2k-pci.c/</CODE>。参见PCI-NE2000一节以了解更多信息。 <sect2>VIA 86C100A Rhine II (and 3043 Rhine I)<label id="rhine"> <p> Status 支持,驱动程序名称:via-rhine 这一相当新的驱动程序可以在目前的2.0和2.1内核里找到。它是在86C926 NE2000芯片上的改进,支持总线控制权传递,但严格的缓存32比特字节对齐的要求限制了从中得到的好处。要了解更多细节和驱动程序更新,参见: <tt>http://www.scyld.com/linux/drivers/via-rhine.html</tt> <sect1>Western Digital <p> 请参见<ref id="smc" name="SMC">以了解有关SMC网卡的信息。(SMC在多年前就收购了Western Digital的网卡部门。) <sect1>Winbond <p> Winbond实际上并不制造和向大众销售完整的网卡——他们生产单片以太网芯片,其它公司购买并在PCI板上印上自己的名字,然后通过零售店销售。可以从下面得到一些设置程序和技术支持: <tt>http://www.winbond.com.tw</tt> <sect2>Winbond 89c840 <p> 状态:半支持,驱动程序名称:winbond-840 该芯片被描述为“NE2000网卡和Tulip兼容网卡杂交产生的突变体”——参见驱动程序的注释以了解更多 细节。该驱动程序还没有与内核一起发行,因为它还处于测试阶段(从1998年9月开始)。可以从下面获取驱动程序: <tt>http://www.scyld.com/linux/drivers/test/winbond-840.c</tt> <sect2>Winbond 89c904, 89c905, 89c906 <p> 状态:支持,驱动程序名称:ne (+8390) 这些是Winbond的ISA 10Mbps ne2000兼容以太网芯片。设置程序可以从Winbond站点获得。 <sect2>Winbond 89c940 <p> 状态:支持,驱动程序名称:ne, ne2k-pci (+8390) 该芯片是很多制造商出售的低价PCI ne2000网卡上最常见的两个芯片之一。注意,这依然是附在PCI总线上的十多年前的老式设计。其性能并不比相应的ISA型号好多少。 <sect1>Xircom<label id="xircom"> <p> 在很长一段时间里,除非你签署文件放弃你的生命,Xircom不愿意发布编写驱动程序所需的编程信息。显然有足够多的Linux用户不断纠缠他们,要得到驱动程序支持(Xircom声称支持所有通用网络操作系统......),所以他们改变了政策,无需再签署不公开协议,允许公开有关资料。有些人说他们将要公开SCO驱动程序的源码,另一些被告知他们不再提供象早期PE型号那样“被废弃”的产品资料。如果你感兴趣并想自己了解一下,可以联系Xircom:1-800-874-7875, 1-800-438-4526 或 +1-818-878-7600。 <sect2>Xircom PE1, PE2, PE3-10B* <p> 状态:不支持。 不要抱太大希望,但如果你有一个这样的并口适配器,可以在DOS仿真器下使用Xircom提供的DOS驱动程序使用它。你需要允许DOSEMU访问并口,可能还要和SIG(DOSEMU的傻瓜中断生成器)一起使用。 <sect2>Xircom PCMCIA Cards <p> 状态:半支持,驱动程序名称:???? 在David Hinds的PCMCIA软件包里有一些Xircom的PCMCIA网卡驱动程序。查看一下以了解最新信息。 <sect1>Zenith<label id="zenith"> <p> <sect2>Z-Note<label id="z-note"> <p> 状态:支持,驱动程序名称:znet 内建的Z-Note网络适配器是基于使用<em/两个/DMA通道的Intel i82593。在目前的内核版本里有一个(alpha?)驱动程序。与所有笔记本电脑和袖珍适配器一样,在运行<tt/make config/时它被放在“Pocket and portable adaptors”部分。同时还要注意,IBM ThinkPad 300与Z-Note兼容。 <sect1>Znyx<label id="zynx"> <p> <sect2>Znyx ZX342 (DEC 21040 based) <p> 状态:支持,驱动程序名称:de4x5, tulip 在使用基于该芯片的网卡时可以在<em/两个/驱动程序中进行选择。David编写了DE425驱动程序,Donald编写了通用的21040驱动程序。 注意,在1.1.91,David增加了一个编译选项,允许非DEC网卡(如Znyx网卡)使用该驱动程序。请阅读<tt/README.de4x5/以了解其中细节。 参见<ref id="dec-21040" name="DEC 21040">以了解这些网卡的更多信息和当前驱动程序的状况。 <sect1>识别未知网卡<label id="mystery"> <p> 好吧,假设你叔叔的侄子的邻居的朋友有一个兄弟,在他给儿子的宠物大老鼠做窝的AT箱子里找到了一块老式ISA以太网卡。不知什么原因这块网卡最后落到你的手里,想在Linux下使用,但没人知道这块网卡是什么,也没有任何资料。 首先,寻找可以作为线索的任何明显的型号编码。如果型号里包含2000,那么很有可能是块NE2000兼容网卡。上面有8003和8013的网卡可能是Western/Digital的WD80x3网卡,或者是SMC Elite网卡,或者它们的兼容网卡。 <sect2>识别网络接口控制器 <p> 寻找网卡上最大的芯片。那就是网络控制器(NIC),大多数都可以从部分编号上识别出来。如果你知道网卡上是哪一种NIC,下文就能帮你弄清是哪一种网卡。 可能最常见的NIC还是National Semiconductor的DP8390,又名NS32490,又名DP83901,又名DP83902,又名DP83905,又名DP83907。这些不过是National生产的一部分芯片!其它一些公司,如Winbond和UMC,生产DP8390和DP83905兼容部件,如Winbond的89c904(与DP83905兼容)和UMC的9090。如果网卡由8390构成,那么它可能就是一个ne1000或ne2000兼容网卡。其次常用的基于8390的网卡是wd80x3网卡及其兼容卡。使用DP83905的网卡可以被认为是ne2000<em/或/wd8013。新版本的通用wd80x3和SMC Elite网卡在原来DP8390的位置上用的是83c690。SMC Ultra网卡采用83c790,使用与wd80x3网卡稍有区别的驱动程序。SMC EtherEZ网卡采用83c795,使用的驱动程序与SMC Ultra网卡一样。所有基于某种8390或8390兼容芯片的BNC网卡都有一片紧靠BNC连接器的16针DIP芯片8392(或83c692,又或???392)。 另一个在老式网卡上找到的常见NIC是Intel的i82586。使用该NIC的网卡包括3c505、3c507、3c523、Intel的EtherExpress-ISA、Microdyne的Exos-205T和Racal-Interlan的NI5210。 原始AMD LANCE NIC的编号为AM7990,较新的版本包括79c960、79c961、79c965、79c970和79c974。上面的大多数网卡都可以使用Linux的LANCE驱动程序,有个例外是使用自己驱动程序的老式Racal-Interlan的NI6510网卡。 使用DEC的21040、21041、21140或类似的编号NIC的较新的PCI网卡可以使用Linux的tulip或de4x5驱动程序。 其它有一个印著RTL8029、89C940或86C926的大芯片的PCI网卡是ne2000兼容网卡,v2.0以上版本Linux里的ne驱动程序在启动时可以自动检测这些网卡。 <sect2>识别以太网地址 <p> 每一个以太网卡都有一个唯一的6字节网卡地址。同一个制造商生产的每一块网卡的该地址的前三个字节都是一样的。例如,所有的SMC网卡都以<tt/00:00:c0/开始。制造商分配的后三个字节对于自己生产的每一块网卡都是唯一的。 如果你的网卡上有个标签给出了网卡地址的全部六个字节,就可以通过前三个字节查到它的销售商。但一般PROM插座上贴的标签上只打印了后三个字节,没什么用。 你可以从RFC-1340上找到分配给销售商的地址。显然有很多地方可以找到最新的地址列表。通过WWW或FTP查找<tt/EtherNet-codes/或<tt/Ethernet-codes/就可以找到一些资料。 <sect2>通过FCC ID号码识别网卡 <p> 作为网卡通常在销售给用户之前必须通过的验证过程的一部分,网卡要被FCC测试,并把由此获得的FCC ID印在网卡上。例如,某块网卡上有<tt>FCC ID: J158013EWC</tt>——那么该网卡就是SMC/WD8013-EWC。<tt>www.driverguide.com</tt>和<tt>drdriver.com</tt>一类的某些WEB站点使用FCC ID列表来帮助ID号不明显的情况。 <sect2>使用未知网卡的技巧 <p> 如果还无法确定是哪一种网卡,但至少缩小了可能的范围,那么你可以构建一个包括全部可能驱动程序的内核,然后看看其中的哪一个可以在启动时自动检测到网卡。 如果内核没有检测到网卡,那么就是网卡没有被配置到一个驱动程序寻找网卡时探测的地址上。此时,需要从当地的Linux的FTP站点下载<tt/scanport.tar.gz/,看看它能否定位出你的网卡跳线所设的地址。它扫描从<tt/0x100/到<tt/0x3ff/的ISA I/O地址以寻找<tt>/proc/ioports</tt>里没有注册的设备。如果它在某个特定地址发现了一个未知设备,那么就可以用一个启动参数<tt/ether=/把它明确设定为以太网卡探测的地址。 如果你设法检测到了网卡,那么一般可以依次改变未知跳线来了解跳线的作用,并查看被检测到的网卡所用I/O基址和中断。中断设置一般可以通过查看跳线在网卡背面所焊接的位置来得到。从网卡有金属插座的一端数背面的“金手指”,相应于金手指4、21、22、23、24、25、34、35、36、37、38分别是中断9、7、6、5、4、3、10、11、12、15、14。8比特网卡只用到金手指31。 看起来没什么用的跳线一般是用来选择可选启动ROM的内存地址。靠近BNC或RJ-45或AUI的其它跳线一般是用来选择输出媒介的。一般它们也在印著YCL、Valor或Fil-Mag的“黑盒子”变压器附近。 如下URL收集了很多各种网卡的跳线设置: <url url="http://www.slug.org.au/NIC/" name="Ethercard Settings"> <sect1>非以太网设备的驱动程序 <p> 在Linux源码里有若干在网络程序看来是<em/象以太网/设备的其它驱动程序,但实际上不是以太网设备。为了本文档的完整性,把它们简要地列在这里。 <tt/dummy.c/——该驱动程序的目的是提供一个设备来指出路由,但并不实际传输数据。 <tt/eql.c/——负荷均衡,控制多个设备(一般是modem)并在其中平衡发送负载,对网络程序表现为单个设备。 <tt/ibmtr.c/——IBM的令牌环,并非真正的以太网。令牌环要求源路由以及其它一些麻烦事。 <tt/loopback.c/ ——环回设备,你的机器发出的所有数据包的目的地还是你自己的机器。从本质上说只是把数据包从发送队列移到接收队列。 <tt/pi2.c/——Ottawa业余无线电爱好者俱乐部PI和PI2的接口。 <tt/plip.c/——并行线Internet协议,允许两台计算机通过并口的端到端方式连接互相发送数据包。 <tt/ppp.c/——端到端协议(PPP,RFC1331),在端到端的连接(一般为modem)上传输多协议数据帧。 <tt/slip.c/——串行线Internet协议,允许两台计算机通过串口(一般通过modem)的端到端方式连接互相发送数据包。 <tt/tunnel.c/——提供一个IP通道,可以使网络数据流透明地穿过子网。 <tt/wavelan.c/——由Intel的82586协处理器控制的类以太网无线电收发器。82586也被用在诸如Intel EtherExpress的其它以太网卡上。 <sect>电缆、同轴电缆、双绞线<label id="cable"> <p> 如果你是从头开始建网络,那么就必须决定是使用以太网细缆(使用BNC连接器的RG58同轴电缆)或10baseT(使用8线“电话”连接器RJ-45的电话线样式的双绞线电缆)。使用N连接器的RG-5电缆的老式以太网粗缆已经被废弃,现在很少见到了。 参见<ref id="cable-intro" name="网卡应当支持的线缆类型">以大致了解一下线缆类型。还要注意,<em/comp.dcom.lans.ethernet/里的FAQ包括了大量有关电缆方面的有用信息。FTP到rtfm.mit.edu下的<tt>/pub/usenet-by-hierarchy/</tt>以查看该新闻组的FAQ。 <sect1>以太网细缆(thinnet)<label id="bnc"> <p> 以太网细缆相当便宜。如果自己制作电缆,实心的RG58A是$0.27/m,分股的RG58AU是$0.45/m。弯头的BNC连接器每个< $2,其它各种器件也都挺便宜。重要的是在每段电缆的末端需要装一个50欧姆的终结器,所以每条电缆的预算大约是$2。还有一个关键问题是电缆中不能有“残桩”——“T”连接器必须直接连到以太网卡上。 使用以太网细缆有两个主要缺点。首先它限制为10Mb/sec——100Mb/sec要求使用双绞线。其次,如果你是用一个大环路把机器连接起来,而某些笨蛋把电缆从自己的T形接头上拿开破坏了环路,整个网络就无法使用了,因为出现了一个无限大的阻抗(电路开路)而不是要求的50欧姆终结。注意,只要不把电缆从T形接头上移开,而是把T形接头从网卡上取下来,整个子网就不会被破坏。当然,从机器上拔出T形接头会干扰机器的工作。8-) 如果只是两台机器的小网络,<em/还是/需要T形接头和50欧姆终结器——<em/不能/用直接用电缆把它们连起来! <!-- Note that there are a few cards out there with `on-board termination'. These cards have a jumper which when closed, puts a 50 ohm resistor across the BNC input. With these cards, you can use a BNC T and terminator like normal, or put the cable directly onto the card and close the jumper to enable the on-board termination. --> 有一些有趣的电缆系统<em/看起来象/用一根导线连到网卡上,但实际上是有两根并排的导线包在外面的套子里,其截面为椭圆形。在环路的转折点,用拼接的BNC连接器连到网卡上。所以它等同于用两根电缆和一个BNC的T形接头,但在这种情况下,用户不可能从T形接头的一边移走电缆来干扰网络。 <sect1>双绞线<label id="utp"> <p> 双绞线网络需要主动式的Hub,每个Hub起码要$50,未加工的电缆费用实际上比细缆要高。你可以不理会那些声称可以使用已有电话线的说法,因为这种安装情况是很少见的。 另一方面,所有100Mb/sec以太网提议都使用双绞线,而且绝大多数新的商业安装使用的也是双绞线。此外,Russ Nelson进一步提出“新的布线应该使用5类线。使用其它的电缆都是在浪费安装者的时间,因为任何一种100Base都将要求使用5类线。” 如果只是连接两台机器,可以通过交换接收与发送线(1-2和3-6)来避免使用Hub。 如果你拿著RJ-45连接头冲著自己(就象你要把它插到自己嘴里),锁扣朝上,那么从左到右各插脚的编号依次是1到8。各插脚的用途如下: <verb> 插脚编号 用途 ---------- ---------- 1 输出数据 (+) 2 输出数据 (-) 3 输入数据 (+) 4 保留为电话使用 5 保留为电话使用 6 输入数据 (-) 7 保留为电话使用 8 保留为电话使用 </verb> 如果你想自己制作一条电缆,请认真阅读下文。一对差分信号必须使用同一条双绞线,以满足UTP电缆所要求的最小阻抗/损耗。如果看一下上面的表格,就知道1+2和3+6是两对差分信号。不是1+3和2+6!!!!在10MHz,长度较短的情况下,出这样的错还可以工作,但仅限于线路长度较短的情况下。无法想象在100MHz时出错会怎么样。 对于末端为“A”和“B”的普通接插线,你要做一个插脚到插脚的映射,输入和输出分别使用一对双绞线(出于阻抗的原因)。这就意味著1A连到1B,2A连到2B,3A连到3B,6A连到6B。连接1A-1B和2A-2B的必须是一条双绞线。同样,连接3A-3B和6A-6B的必须是另一条双绞线。 如果目前没有Hub,想做一条“空电缆”,那么要做的就是把“B”的输出作为“A”的输入,把“A”的输出作为“B”的输入,同时不改变它们的极性。也就是说,把1A连到3B(A的输出+到B的输入+),把2A连到6B(A的输出-到B的输入-)。这两根线必须是一条双绞线。它们把网卡/插脚“A”作为输出传送,把网卡/插脚“B”作为输入传送。然后把3A连到1B(A的输入+到B的输出+),把6A连到2B(A的输入-到B的输出-)。这两根线也必须是一条双绞线。它们把网卡/插脚“A”作为输入传送,把网卡/插脚“B”作为输出传送。 因此,如果想使用普通接插线,需要砍掉它的一端,交换接收和发送双绞线的位置后插入新的插头,把它压紧,就得到一条“空”电缆了。一点也不复杂。只不过是把一块网卡的发送信号送到第二块网卡的接收端,如法炮制就可以了。 注意,在10BaseT被批准为标准之前,就存在其它使用RJ-45连接头的网络格式和上述的连线安排。例如SynOptics的LattisNet和AT&T的StarLAN。在某些情况下,(如使用早期的3C503网卡)可以设置网卡上的跳线使网卡能够与不同类型的Hub连接,但绝大多数情况下,为这些老式类型网络设计的网卡无法工作在标准10BaseT网络/Hub下。(注意,如果网卡还有一个AUI端口,那么肯定可以把AUI和10BaseT收发器混合在一起使用。) <sect1>以太网粗缆 <p> 以太网粗缆几乎完全被废弃了,一般只用在与一个已有网络保持兼容。可以放松规定并使用被动的$3的N-to-BNC连接器把大量以太网粗缆和细缆连接起来,这通常是扩展已有以太网粗缆的最佳解决方案。对这种情况一个正确(但代价昂贵)的方案是使用转发器。 </sect> <sect>软件设置与网卡诊断<label id="utils"> <p> 大多数情况下,如果用软件进行配置并把配置保存在EEPROM里,一般需要重新启动DOS,使用销售商提供的DOS程序来设置网卡的中断IRQ、I/O、内存地址和其它东西。此外,希望这是只要设置一次的东西。如果没有网卡的DOS软件,试著在网卡制造商的WWW站点上找找。如果不知道站点名称,可以猜一下,如“www.my_vendor.com”,其中“my_vendor”是网卡制造商的名称。这种方法对SMC、3Com和许多<em/许多/其它制造商都有效。 有些网卡有Linux版本的配置工具,并在本文中列出。Donald编写了几个运行在Linux下的小的网卡诊断程序,其中大部分都是他在编写驱动程序时使用的诊错工具。不要指望有花哨的菜单驱动界面。在使用绝大部分工具时,你需要阅读源码。即使你所用的网卡没有相应的诊断工具,你还是可以通过<tt>cat /proc/net/dev</tt>获得一些信息——假设至少在启动时你的网卡被检测到了。 随便哪种情况下,都得在启动时运行这些程序(允许对端口进行I/O操作),而且可能在这么做之前要先用<tt/ifconfig eth0 down/关闭以太网卡。 <sect1>以太网卡的配置程序<label id="config"> <p> <sect2>WD80x3网卡 <p> 对于使用wd80x3网卡的人,在Linux的FTP站点上可以找到的<tt/wdsetup-0.6a.tar.gz/里有一个程序<tt/wdsetup/。它的维护不是很好,有一段时间没有更新了。如果能用,那么很好;如果不行,那么只好使用应当和网卡一起拿到的DOS版本程序。如果没有这样的DOS版本程序,还是可以很高兴地告诉你,从SMC的FTP站点上可以获取设置/驱动程序磁盘。当然,你<em/必须/有一个带EEPROM的网卡才能使用该工具。很老<em/很老/的wd8003网卡和一些wd8013兼容网卡使用跳线来设置网卡。 <sect2>Digital/DEC网卡 <p> Digital的EtherWorks 3网卡可以用类似于DOS程序<tt/NICSETUP.EXE/的方式进行配置。David C. Davies编写了该工具以及和驱动程序在一起的其它EtherWorks 3工具。查看一下你本地的Linux FTP站点下的目录<tt>/pub/linux/system/Network/management</tt>,寻找名为<tt/ewrk3tools-X.XX.tar.gz/的文件。 <sect2>NE2000+或AT/LANTIC网卡 <p> 有些Nat Semi的DP83905产品(如AT/LANTIC和NE2000+)是可以用软件配置的。(注意,这些网卡也可以仿真wd8013网卡!)你可以从Donald的FTP服务器<tt/www.scyld.com/下载文件<tt>/pub/linux/setup/atlantic.c</tt>来配置此网卡。另外,Kingston的DP83905网卡配置程序看起来可以用在所有网卡上,因为在允许使用网卡前,它们并不检查销售商指定的地址。按照如下URL: <url url="http://www.kingston.com/download/etherx/etherx.htm" name="Kingston Software"> 下载<tt/20XX12.EXE/和<tt/INFOSET.EXE/。 在配置NE2000+网卡时要格外小心,因为设定的值有错误会带来麻烦。一个典型的错误是启用EEPROM里的启动ROM(即使没有安装ROM)会和VGA卡发生冲突。其结果就是开机后屏幕没有显示,计算机只是发出一些叫声。 通常如下操作就可以解决问题:拔出机器里的卡,然后启动进入CMOS设置。把“Display Adapter”改为“Not Installed”并把缺省的启动驱动器改为“A:”(软盘驱动器)。同时把“Wait for F1 if any Error”改为“Disabled”。这样,计算机就无需用户干预可以启动了。现在创建一个可启动的DOS软盘(“format a: /s /u”),把上述档案文件<tt/20XX12.EXE/里的程序<tt/default.exe/拷贝到软盘上。再键入<tt>echo default > a:autoexec.bat</tt>,这样在用这张软盘启动时,该程序会自动运行,把网卡设置为正常的缺省值。关闭机器,重新安装ne2000+网卡,插入新的启动软盘,再开机。可能机器还会发出叫声,但最后你会看到机器从软盘启动时软驱的灯亮了。等一两分钟,软驱会停下来,表示<tt/default.exe/程序运行结束,再关闭机器电源。再次启动时,可能你的显式器就又工作正常了,这时就可以把CMOS设置改回去,并把网卡EEPROM设置改回到希望的值。 注意,如果手头没有DOS,你可以用一张自动运行Donald的<tt/atlantic/程序(使用正确的命令行开关)的Linux启动软盘来完成上面的工作,代替自动运行<tt/default.exe/程序的DOS启动软盘。 <sect2>3Com网卡 <p> 3Com的Etherlink III系列网卡(如3c5x9)可以用Donald的另一个配置工具进行配置。你可以从Donald的FTP服务器<tt/www.scyld.com/上获取文件<tt>/pub/linux/setup/3c5x9setup.c</tt>来配置这些网卡。(注意,DOS下的3c5x9B配置工具可能有一些属于Etherlink III的新“B”系列的额外选项。) <sect1>以太网卡的诊断程序<label id="diag"> <p> Donald编写的诊断程序都可以从以下URL获取。 <url url="http://www.scyld.com/network" name="Ethercard Diagnostics"> Allied Telesis AT1700——<tt>at1700.c</tt> Cabletron E21XX——<tt>e21.c</tt> HP PCLAN+——<tt>hp+.c</tt> Intel EtherExpress——<tt>eexpress.c</tt> PCI NE2000网卡——<tt>ne2k-pci-diag.c</tt> ISA NE2000网卡——<tt>ne2k.c</tt> RealTek (ATP)袖珍适配器——<tt>atp-diag.c</tt> 所有其它网卡——试著用<tt>cat /proc/net/dev</tt>和<tt/dmesg/来看看内核里有关所说网卡的有用信息。 <sect>技术信息<label id="tech-intro"> <p> 对于那些想了解更多有关网卡如何工作、或如何使用现有驱动程序,以及试图为目前不支持的网卡编写自己的驱动程序的人来说,这些信息应该会有用。如果你没有这种想法,那么最好跳过这一节。 <sect1>可编程I/O、共享内存与DMA<label id="data-xfer"> <p> 如果已经可以发送接收背靠背数据包,就无法把更多的数据放到网络上。每一个现代以太网卡都可以接收背靠背数据包。Linux的DP8390驱动程序(wd80x3、SMC-Ultra、3c503、ne2000,等等)非常接近于发送背靠背数据包(依赖于当前的中断延迟),3c509和AT1500的硬件在自动发送背靠背数据包上没有一点问题。 <sect2>可编程I/O(如NE2000、3c509) <p> 优点:没有使用任何受限制的系统资源,只用了若干I/O寄存器,而且没有16M的限制。 缺点:一般传输速率较慢,CPU需要等待,几乎不可能访问交叉的数据包。 <sect2>共享内存(如WD80x3、SMC-Ultra、3c503) <p> 优点:简单,比可编程I/O速度快,允许随机访问数据包。在可能的情况下,Linux驱动程序在从网卡复制出接收的IP数据包时计算其校验和,从而比相应的PIO网卡进一步减少了对CPU的占用。 缺点:占用内存空间(对DOS用户来说是个大问题,在Linux下没有问题),依然要占用CPU。 <sect2>从属(普通)的直接内存存取(Linux下没有这种情况!) <p> 优点:在实际数据传递过程中不占用CPU。 缺点:检查边界条件、分配相邻的缓存和DMA寄存器编程使该方法成为最慢的技术。它还占用了一个珍贵的DMA通道,并要求对齐的低端内存缓存。 <sect2>总线控制的直接内存存取(如LANCE、DEC 21040)<label id="master"> <p> 优点:在数据传输过程中不占用CPU,可以把缓存串起来,CPU时间很少或没有花费在ISA总线上。大多数总线控制的Linux驱动程序现在使用一种“copybreak”方案,较大的数据包直接从网卡放进内核的网络缓存,小的数据包被CPU复制到cache里进行下一步的处理。 缺点:(只适用于ISA总线的网卡)网卡要求低端内存缓存和一个DMA通道。任何总线控制器在与其它强占总线的总线控制器,如某些古老的SCSI适配器,一起工作时都会出问题。有几个设计低劣的主板芯片组在与总线控制器一起使用时也有麻烦。不使用<em/任何/类型的DMA设备的一个原因是使用了为代替386设计的486处理器插件:这些处理器在每个DMA周期都必须刷新cache。(这其中包括Cx486DLC、Ti486DLC、Cx486SLC、Ti486SLC,等等。) <sect1>涉及总线带宽的性能 <p> ISA总线能达到5.3MB/sec (42Mb/sec),听起来对10Mbps以太网是足够了。对于100Mbps网卡,显然需要更快的总线以利用网络带宽。 <sect2>8比特ISA网卡与16比特ISA网卡<label id="8-vs-16"> <p> 你可能不会再买一个新的8比特ISA以太网卡了,但在随后几年间你会在计算机物物交换市场一类的地方发现很多很便宜的这种卡。这使得它们在“家用以太网”系统中很常见。对于16比特的ISA网卡来说也是一样的,因为现在PCI卡已经很普遍了。 对于较低或平均的应用,一些可以提供足够性能的8比特网卡是wd8003、3c503和ne1000。3c501的性能较差,而且要避免使用那些12年前XT时代的低性能纪念品。(可以把它们送给Alan,他在收集这种网卡......) 8比特的数据通道不会对性能造成太大损害,你依然可以从一个较快主机上的8比特wd8003网卡(使用快的ISA总线)上获得大约500到800kB/s的ftp下载速度。如果你的所有网络流量几乎都是来自远端站点,那么数据通道上的瓶颈将发生在其它地方,只有在进行本地子网操作时你才会注意到不同网卡间的速度差别。 <sect1>32比特(VLB/EISA/PCI)以太网卡 <p> 注意,10Mbs网络通常并不一定要求32比特的接口。参见<ref id="data-xfer" name="可编程I/O、共享内存与DMA">以了解为什么8MHz的ISA总线上的10Mbps以太网卡并非真正的瓶颈。尽管使用快的总线的以太网卡并不一定带来更快的数据传输,但会减少CPU负载,这对多用户系统来说是件好事。当然,对于现在普通的100Mbps网络,32比特接口是充分使用全部带宽的必要条件。 <sect1>编写驱动程序<label id="skel"> <p> 在Linux下使用以太网卡所必需的只不过是相应的驱动程序。因此,关键是制造商要向公众公开编程的技术资料,而无需你(或其他什么人)签署什么协议。关于获取资料的可能性(也许你不编写代码,那么就是其他人编写你确实需要的驱动程序的可能性),一个较好的指南是Crynwr (昵称Clarkson)的包驱动程序的可用性。Russ Nelson在干这些事,对开发Linux驱动程序很有帮助。<em/网上冲浪者/可以试著用下面的URL看一下Russ的软件。 <url url="http://www.crynwr.com" name="Russ Nelson's Packet Drivers"> 有了资料,就可以为网卡编写驱动程序并在Linux下使用(至少从理论上来说是这样)。记住,有些为XT一类机器设计的老式硬件在Linux这样的多任务环境下工作得不是很好。如果网络流量较大,使用这些网卡会带来大麻烦。 大多数网卡都带有如NDIS和ODI一类的MS-DOS接口的驱动程序,但对Linux没有用。许多人建议直接链接它们或自动翻译一下,但这几乎是不可能的。MS-DOS驱动程序需要工作在16比特模式,并依赖于“软件中断”,这二者与Linux内核不兼容。这种不兼容实际上是Linux的一个特性,有些Linux驱动程序比其相应的MS-DOS驱动程序要好得多。比如“8390”系列驱动程序使用乒乓传送缓存,该方法刚刚被引进MS-DOS。 (乒乓传送缓存意味著为传送数据包使用至少两个最大大小的包缓存。在网卡发送其中的一个时,载入另一个。在第一个包被发出去后,立刻发送第二个包,依次类推。这样,大多数网卡就可以连续向线路上发送背靠背数据包。) 好啦。你可以决定为Foobar Ethernet网卡编写驱动程序了,因为你有编程资料,而且还没人写这个驱动程序。(......这是两个主要的需求 ;-) 你可以从Linux内核源码树中提供的网络驱动程序框架开始。在所有近期的内核里都能找到这个文件/usr/src/linux/drivers/net/skeleton.c。在2.4.x(或更新的)内核里已经把它重新命名为<tt>isa-skeleton.c</tt>。也可以看看如下URL的Kernel Hackers Guide: <url url="http://www.redhat.com:8080/HyperNews/get/khg.html" name="KHG"> <sect1>内核的驱动程序接口 <p> 下面对编写一个新驱动程序所必需的函数进行了若干说明。和上面提到的驱动程序框架一起阅读可以更清楚一些。 <sect2>Probe <p> 在启动时调用以检查网卡存在与否。如果可以通过读取内存等非强制手段进行检查最好。也可以从I/O端口读取。在探测开始向I/O端口写<em/不好/,因为这样可能会损害另一个设备。通常在这里还进行一些设备初始化(分配I/O空间、IRQ、填充dev->???域等等)。必须了解网卡可以配置到哪些I/O端口/内存、如何启用共享内存(如果用了的话)以及如何选择/启用中断产生,等等。 <sect2>Interrupt handler <p> 在网卡发出一个中断时内核调用的程序。它需要确定网卡发出中断的原因并进行相应的操作。一般的中断条件是接收到数据、发送完成、报告出错状况。需要了解相关的中断状态位以进行相应的操作。 <sect2>Transmit function <p> 与dev->hard_start_xmit()链接,在内核想通过设备传送数据时调用它。该函数把数据放入网卡并触发传送。需要了解如何把数据打包并传给网卡(共享内存拷贝、PIO传送、DMA?),以及放入网卡正确的位置。然后需要了解如何通知网卡把数据发送到线路上,(可能)在发送完成后发出一个中断。在硬件无法接收更多数据包时需要设置dev->tbusy标志。在网卡有空间可用时,一般这发生在传送完成中断过程中,清除dev->tbusy标志并用<tt/mark_bh(INET_BH)/通知上一层。 <sect2>Receive function <p> 在网卡报告有数据时由内核中断处理程序调用。它把数据从网卡上移出,放入一个sk_buff并通过执行netif_rx(sk_buff)告诉内核数据所在位置。需要了解如何在接收数据时启用中断生成,如何检查相关的接收状态位,以及如何从网卡获取数据(通过共享内存拷贝、PIO、DMA,等等)。 <sect2>Open function <p> 与dev->open链接,在有人使用<tt/ifconfig eth0 up/时网络层调用它——把设备连到线路上并启用来接收/发送数据。任何在探测过程中(启用IRQ生成函数等)没有完成的特别的初始化操作都在这里进行。 <sect2>Close function (可选) <p> 在有人使用<tt/ifconfig eth0 down/时使网卡进入一个清醒的状态。如果硬件许可的话它会释放中断和DMA通道,并完全关闭以节约能源(象收发器一样)。 <sect2>Miscellaneous functions <p> 如同一个重新设置函数,如果事情变得很糟,驱动程序可以试图重新设置网卡作为最后防线。一般在发送超时或类似情况下如此进行。也是一个读取网卡统计寄存器的函数,如果是这样配备的话。 <sect1>3Com的技术信息<label id="3com-tech"> <p> 如果对3Com网卡驱动程序的工作感兴趣,可以从3Com公司获取技术资料。Cameron在下面友好地告诉了我们该如何去做: 在我们的“技术参考文献”(TRs)里给出了3Com的以太网适配器驱动程序程序员需要了解的资料。这些手册描述了板上的程序员接口,但没有提及诊断、安装程序等终端用户所看到的东西。 网络适配器分部的市场部有技术参考资料分发。为了使这个计划更有效,我们把它集中到一个称作“CardFacts”的自动电话系统里。你可以打电话来,然后它把资料传真给你。要索取技术参考资料,打电话到408-727-7021。索取开发人员的订单,资料号是9070。在打电话前准备好你的传真号码。填完订单后把它传真到408-764-5004。手册会由联邦速递的次日服务送到。 有人认为我们的手册不该免费,他们也在寻找此系统过于昂贵或占用的时间和努力太多的证据。到目前为止,3Com的顾客确实不错,向我们提出的要求也很合理。我们需要你们的继续合作并把这样的服务维持下去。 <sect1>基于AMD PCnet/LANCE的网卡的注意事项<label id="amd-notes"> <p> AMD的LANCE(以太网的局域网控制器)是最早提供的,已经被“PCnet-ISA”芯片所取代,否则又名79C960。注意,“LANCE”名称有毛病,有些人会用老名称称呼新芯片。AMD的网络产品分部的Dave Roberts友好地提供了下面有关该芯片的信息: “从功能上来看,它等同与NE1500。它的寄存器组与使用附加1500/2100结构的老式LANCE一样。PCnet-ISA可以使用较早的1500/2100驱动程序。NE1500和NE2100的结构基本上是相同的。开始Novell把它称为2100,但后来想区分同轴电缆与10BASE-T网卡。属于10BASE-T的就只采用1500范围的编号。这是仅有的区别。 许多公司提供基于PCnet-ISA的产品,包括HP、Racal-Datacom、Allied Telesis、Boca Research、Kingston Technology等等。除了有些制造商增加了“无跳线”特性允许软件配置网卡外,这些网卡基本上都是一样的。大多数制造商没有增加这一特性。AMD提供了一个使用PCnet-ISA的网卡的标准设计软件包,许多制造商不加改变地直接使用我们的设计。这也就是说,如果想编写大多数基于PCnet-ISA的网卡的驱动程序,只需要从AMD获取数据资料。打电话给我们的资料分发中心(800)222-9323,索取PCnet-ISA的数据资料Am79C960。这是免费的。 要迅速了解一块网卡是否“标准”网卡只需要看一下。如果是标准的,网卡上只有一块大的芯片、一块晶振、一块小的IEEE地址PROM、可能还有一个启动ROM的插座和一个连接器(依照提供的媒介选项可能是1、2或3)。注意,如果是同轴电缆网卡,卡上就应该有一些收发器缓存,它们靠近连接器,远离PCnet-ISA。” 一个可能的网卡黑客需要注意,不同的LANCE产品采用不同的“重起”方法。有些恢复到上次离开网络环路的地方,另一些则从环路的开头开始,就象刚被初始化一样。 <sect1>广播与混杂模式<label id="promisc"> <p> Donald所做的另一个工作是实现广播与混杂模式的钩子函数。所有<em/发布的/(即<bf/不是/ALPHA版本的)ISA驱动程序现在都支持混杂模式。 Donald写道:“我准备从讨论混杂模式开始,它从概念上来说很容易实现。对大多数硬件,你只需要设置一个寄存器位,然后就可以接收到线路上的每一个数据包。对,差不多就这么简单;对有些硬件,你必须先关闭板卡(可能会丢失若干数据包),重新配置它,然后重新启用以太网卡。对吧,就这么简单,下面要讨论的就不是这么明显了:广播模式。它可以用两种方式实现: <enum> <item> 使用混杂模式和一个如Berkeley包过滤器(BPF)的数据包过滤器。BPF是一个模式匹配指令语言,可以编写一个程序挑出感兴趣的地址。它的优点在于它很普遍和可编程。其缺点是没有一个一般性的方法可以让内核避免打开混杂模式和通过每一个注册的包过滤器运行每一个线路上的数据包。参见<ref id="bpf" name="Berkeley包过滤器">以了解更多信息。 <item> 使用绝大多数以太网芯片内建的广播包过滤器。 </enum> 我想应该列出几个以太网卡/芯片提供的广播包过滤器: <verb> 芯片/网卡 混杂模式 广播包过滤器 ------------- ------------ --------------- Seeq8001/3c501 Yes Binary filter (1) 3Com/3c509 Yes Binary filter (1) 8390 Yes Autodin II six bit hash (2) (3) LANCE Yes Autodin II six bit hash (2) (3) i82586 Yes Hidden Autodin II six bit hash (2) (4) </verb> <enum> <item> 这些网卡声称有一个过滤器,但只是简单地对“accept all multicast packets”或“accept no multicast packets”回答yes/no。 <item> AUTODIN II是标准的以太网CRC校验多项式。在这种方式下,广播地址被哈希运算后在哈希表里进行查找。如果启用了相应的比特位,则数据包被接收。以太网数据包的设计使得硬件在如此处理时的开销很小——(通常)只要在前6个八进制数(目标地址)之后锁定CRC电路(用来进行错误检查)的6个比特位,把它们作为哈希表的索引(6比特——一个64比特的表)。 <item> 这些芯片使用6比特哈希,必须由主机计算并载入哈希表。这也就是说内核必须包含CRC代码。 <item> 82586内部使用6比特哈希,但是由自己从接受的广播地址列表计算出哈希表。 </enum> 注意,这些芯片的过滤效果都不好,还需要一个中间层次的模块完成最后的过滤。同时还要注意,在每种情况下都必须保持一个完整的接受广播地址列表,在出现变化时以重新计算哈希表。 <sect1>Berkeley包过滤器(BPF)<label id="bpf"> <p> 开发者普遍认为BPF的功能不该由内核提供,而是放在一个(希望很少用到的)兼容库里。 对不了解的人来说:BPF(Berkeley包过滤器)是一种向内核网络层说明对哪些数据包感兴趣的机制。它是用一种建立在底层网络代码中的特殊指令语言解释器实现的。应用程序把一个用这种语言编写的程序传递给内核,然后内核对每一个接收到的数据包执行该程序。如果内核有多个BPF应用程序,对每个数据包都要运行这个程序。 问题在于很难从数据包过滤器程序推断出应用程序实际上对哪一种数据包感兴趣,所以一般的解决方法就是始终运行过滤器。假设一个应用程序注册的BPF程序是获取发往某个广播地址的低速数据流。绝大多数以太网卡有一个64个入口的哈希表的硬件实现的广播地址过滤器,用来忽略大多数不想要的广播数据包,所以有可能以极低的开销完成这一操作。但是由于有了BPF,内核必须把接口设置为混杂模式,接收所有数据包,并对它们运行过滤器。不管怎样,这样确实可以工作,但考虑到对所要求的数据包进行的处理,就已经变得过于麻烦了。 <sect>便携式/笔记本电脑联网<label id="notebook"> <p> 有几种方法把笔记本电脑联上网。可以使用SLIP代码(并以串行线速率运行);可以使用一个有内建支持PCMCIA插槽的笔记本电脑;可以使用一个有插座并插入了一块ISA网卡的笔记本电脑;或者使用并口以太网适配器。 <sect1>使用SLIP <p> 这是最便宜的解决方案,但最麻烦。另外,无法获得很高的传输速率。因为SLIP实际上与以太网卡无关,这里就不多说了。参见NET-2 Howto。 <sect1>PCMCIA支持<label id="pcmcia"> <p> 设法完全确定硬件的情况(即网卡制造商、PCMCIA芯片控制器的制造商),然后在笔记本电脑讨论组里询问。不管怎样,不要把事情想得这么简单。预料会花费一些时间、给内核打补丁等。可能有一天只需要键入“make config”。8-) 目前所支持的两个PCMCIA芯片组是Databook的TCIC/2和Intel的i82365。 在tsx-11.mit.edu的/pub/linux/packages/laptops/下有一些程序可能会有用。它们包括从PCMCIA以太网卡驱动程序到与PCMCIA控制器芯片进行通信的程序。注意,这些程序一般与某个特定的PCMCIA芯片(即intel 82365或TCIC/2)相关。 对于NE2000兼容卡,有人通过在DOS下配置网卡,然后在DOS命令提示符下执行<tt/loadlin/启动Linux,成功地实现了对PCMCIA的支持。 目前一直在获得实质性的进展,对于希望PCMCIA支持的Linux用户,情况正在好转。这一努力的先驱是David Hinds。他的最新PCMCIA支持软件包可以从下面得到: <url url="ftp://cb-iris.stanford.edu/pub/pcmcia" name="PCMCIA Package"> 寻找一个类似<tt/pcmcia-cs-X.Y.Z.tgz/的文件,其中X.Y.Z是最近的版本号。很有可能它也被上载到了FTP站点<tt/tsx-11.mit.edu/。 注意,Donald的PCMCIA启用程序是一个用户级的程序,而David Hinds的程序是运行在内核级。最好使用David的软件包,因为它的使用很广泛,并在持续开发过程中。 <sect1>对接座内的ISA以太网卡。 <p> 笔记本电脑的对接座一般要花$250,提供两个全尺寸的ISA插槽、两个串口和一个并口。大多数对接座使用笔记本电脑的电池供电,如果使用短的ISA卡,有若干对接座可以使用对接座里附加的额外电池供电。你可以加一个便宜的以太网卡,并享受全速的以太网性能。 <sect1>袖珍/并口适配器。 <p> “袖珍”以太网适配器也可以满足需要。注意,由于并口的接口限制,传输速率不够好(可能最高是200kB/s?)。 还有一个约束是墙砖一样的电源。你可以购买/制作一个从笔记本电脑的键盘端口引出电源的电缆,摆脱与适配器连在一起的墙砖。(参见<ref id="aep-100" name="键盘电源">) 参见<ref id="de-600" name="DE-600 / DE-620">和<ref id="aep-100" name="RealTek">以了解支持的两款袖珍适配器。 <sect>杂项<label id="misc"> <p> 所有不适合放在别处的相关信息都堆在这里。可能不相干,也可能大家不感兴趣,但还是放在这儿了。 <sect1>向内核传递以太网参数<label id="lilo"> <p> 有两个通用的内核命令可以在启动时向内核传递以太网参数(<tt/ether/ 和<tt/reserve/)。可以用LILO、loadlin或其它接受可选参数的启动工具完成该操作。 例如,如果命令为“blah”,希望接收3个参数(假定为123、456和789),那么在使用LILO时就应该如下: <tt>LILO: linux blah=123,456,789</tt> 要了解启动时参数的更多信息(和完全的列表),请参见 <url url="http://metalab.unc.edu/mdw/HOWTO/BootPrompt-HOWTO.html" name="BootPrompt-HOWTO"> <sect2><tt/ether/命令<label id="ether"> <p> <tt/ether=/参数与直接构建在内核的驱动程序一起使用。<tt/ether=/参数对一个模块化的驱动程序<em/完全不起作用/。它的最通用形式如下: <tscreen> ether=IRQ,BASE_ADDR,PARAM_1,PARAM_2,NAME </tscreen> 所有的参数都是可选的。第一个非数字的参数被用做NAME。 <bf/IRQ:/ 很明显。为“0”的IRQ值(一般为缺省值)意味著autoIRQ。首先设置IRQ而不是base_addr是一个历史性的巧合——无论在改变别的什么时都可以顺便改正这一点。 <bf/BASE_ADDR:/ 也很明显。值为“0”(一般为缺省值)意味著探测以太网卡的网卡类型特定的地址列表。 <bf/PARAM_1:/ 这开始是用来覆盖WD80*3这样的共享内存网卡的起始内存的值。有些驱动程序使用该值的低4位来设置诊断信息级别。0——缺省值,1-7——级别1..7,(7是最完全的信息)8——级别0(没有信息)。另外,LANCE驱动程序使用该值的低4位来选择DMA通道。否则就使用auto-DMA。 <bf/PARAM_2:/ 3c503驱动程序使用它来选择内部还是外部收发器。0——缺省/内部,1——外部AUI。Cabletron的E21XX网卡还使用PARAM_2的低4位来选择输出媒介。否则就自动检测。 <bf/NAME:/ 选择该值所指的网络设备。标准内核对附属于总线的以太网卡使用名称“eth0”、“eth1”、“eth2”和“eth3”,对并口“袖珍”以太网适配器使用“atp0”。arcnet驱动程序使用名称“arc0”。可以使用这些LILO参数明确设置基址来启用多块网卡。1.0内核把基于LANCE的以太网卡作为特殊情况进行处理:LILO参数被忽略,LANCE网卡总是被分配为从“eth0”开始的名称“eth<n>”。附加的非LANCE网卡必须被明确指定为“eth<n+1>”,并用诸如“ether=0,-1,eth0”的方式禁止通常的“eth0”探测。(对,这是个Bug。) <sect2><tt/reserve/命令<label id="reserve"> <p> 这个紧接著的LILO命令用法与上面的“ether=”一样,即附加在lilo.conf里指定的启动选择名称后面。 <tscreen> reserve=IO-base,extent{,IO-base,extent...} </tscreen> 在某些机器上,可能需要防止设备驱动程序在某个特定区域里检查设备(自动探测)。其原因可能是由于设计低劣的硬件使启动<em/冻结/(如某些以太网卡)、被错误识别的硬件、在较早的探测中状态被改变的硬件、或者仅仅是不想让内核初始化硬件。 启动时的参数<tt/reserve/通过指定无需探测的I/O端口区域来解决这个问题。该区域保留在内核的端口注册表里,就象该区域里已经发现了一个设备一样。注意,这一机制在大多数机器上是不必要的。只有在有问题或特定的情况下才有必要使用它。 指定区域里的I/O端口受到保护,不被设备探测影响。在某些驱动程序被NE2000挂起,或其它设备被错误地识别为NE2000时使用这一方法。正确的设备驱动程序不该探测一个保留区域,除非另一个启动参数明确指定它这么做。这隐含了<tt/reserve/经常与其它启动参数一起使用。因此,如果指定了一个<tt/reserve/区域来保护某个特定设备,通常就必须明确指定对该设备的探测。大多数驱动程序在给定了明确地址后就忽略了端口注册表。 例如,启动行 <tscreen> LILO: linux reserve=0x300,32 ether=0,0x300,eth0 </tscreen> 使以太网卡驱动程序以外的所有设备驱动程序都不探测0x300-0x31f。 一般启动时的参数限制是11个,因此每个<tt/reserve/关键词只能指定5个保留区域。如果请求很复杂,可以使用多个<tt/reserve/指令。 <sect1>把以太网驱动程序作为模块使用<label id="modules"> <p> 现在大多数Linux发行版里的内核都只包含很少几个内建的驱动程序。驱动程序都采用独立的动态可加载模块的形式提供。这些模块化驱动程序通常由管理员使用<tt/modprobe(8)/命令载入,或者在某些情况下由内核通过“kerneld”(在2.0版)或“kmod”(在2.1版)自动载入,然后调用<tt/modprobe/。 你所用的发行版可能会提供良好的图形配置工具来设置以太网模块。如果可能就先使用它们。下面描述了在这些花俏的配置程序下的信息,以及这些程序改变了哪些东西。 控制使用哪些模块和每个模块提供哪些选项的信息一般保存在文件<tt>/etc/conf.modules</tt>里。在这个文件里使用的两个感兴趣的主要选项(对以太网卡而言)是<tt/alias/和<tt/options/。<tt/modprobe/命令查阅该文件以了解模块信息。 实际的模块本身一般保存在名为<tt>/lib/modules/`uname -r`/net</tt>的目录下,其中<tt/uname -r/命令给出内核的版本(如2.0.34)。你可以在这里看看哪一个模块与你的网卡匹配。 在你的<tt/conf.modules/文件里首先需要的是告诉<tt/modprobe/对于<tt/eth0/(和<tt/eth1/以及......)网络接口使用什么驱动程序。为此要使用<CODE>alias</CODE>命令。例如,有一块使用<tt/smc-ultra.o/驱动程序模块的ISA SMC EtherEZ网卡,需要增加如下一行把该驱动程序<tt/alias/到<tt/eth0/上: <verb> alias eth0 smc-ultra </verb> 其次,可能需要一个<tt/options/行来指出与某个特定模块(或模块别名)一起使用哪些选项。还采用上面那个例子,如果只有一行<tt/alias/而没有<tt/options/行,内核会警告(参见<tt/dmesg/)说自动探测ISA网卡不好。要消除这个警告,需要增加另一行来告诉模块网卡被配置在哪个I/O基址上,比方说是16进制地址<tt/0x280/。 <verb> options smc-ultra io=0x280 </verb> 大多数ISA模块在<tt/insmod/命令行接受<tt/io=0x340/和<tt/irq=12/这样的参数。提供这些参数以避免探测该网卡是<em/必须的/或至少是<em/强烈建议的/。与PCI和EISA设备不同,对大多数ISA设备而言没有真正安全的自动探测方法,所以在把驱动程序作为模块使用时应当避免自动探测。 每个模块所接受的所有选项列表可以在以下文件中找到: <tt>/usr/src/linux/Documentation/networking/net-modules.txt</tt> 推荐阅读该文件以了解对你的特定网卡可以使用哪些选项。注意,对于单个模块能够处理多个设备的模块,有些支持用逗号分开的值列表,如所有基于8390的驱动程序和PLIP驱动程序。例如: <code> options 3c503 io=0x280,0x300,0x330,0x350 xcvr=0,1,0,1 </code> 上面就是一个模块控制四块3c503网卡,其中网卡2和4使用外部收发器。不要在“=”或逗号周围使用空格。 还要注意,一个<em/忙的/模块不能被删除。这也就是说在删除模块前需要使用<tt/ifconfig eth0 down/(关闭以太网卡)。 命令<tt/lsmod/可以显示哪些模块被载入、它们是否正在被使用,而<tt/rmmod/可以删除这些模块。 <sect1>相关文档 <p> 本文档的很多信息来自comp.os.linux新闻组保存的帖子,这表明该新闻组是一个有价值的信息源。其它的有用信息来自Donald自己的一大堆小文件。当然,如果你正在设置一块以太网卡,你还要读一下NET-2 Howto才能真正配置好你要用的软件。另外,如果你想做个黑客,你总能从驱动程序的源码里找到些有用的信息。在开始实际代码之前,总有一到两段描述关键点的文字。 对于那些寻找不是Linux特有信息(如什么是10BaseT、什么是AUI、Hub是干什么的等等)的人,我强烈推荐使用新闻组<em/comp.dcom.lans.ethernet/或<em/comp.sys.ibm.pc.hardware.networking/。那些在<tt/dejanews.com/上的新闻组档案也是很有价值的信息源。你可以从以下URL的RTFM(保存所有新闻组的FAQ)获取新闻组的FAQ: <url url="ftp://rtfm.mit.edu/pub/usenet-by-hierarchy/" name="Usenet FAQs"> 你还可以在以下URL看一下可以说是“Ethernet-HomePage”的主页: <url url="http://wwwhost.ots.utexas.edu/ethernet/ethernet-home.html" name="Ethernet-HomePage"> <sect1>声明与版权<label id="copyright"> <p> 本文档<em/不/是福音书。它可能是你所找到的最新的资料。除了你自己,没人会对你的硬件出现的问题负责。如果你的以太网卡或其它的硬件冒烟的话(几乎不可能!),我们也不承担任何责任。也就是说,本文作者不对任何使用本文信息采取行动造成的损失负责。 Copyright (c) 1993-1999 本文的版权所有人为Paul Gortmaker。在保留版权信息和本许可内容的条件下,本文档允许任意复制和传播。 在保留原始版权信息的条件下,允许复制和传播本文档修改后的版本;在本许可内容不变的条件下,允许传播所有依据本文档推导出的结果。 在上述针对修改版本的条件下,允许复制和传播本文档的其它语言翻译版本。 对翻译者的提示。首先,翻译SGML源文件(可以用FTP从HowTo主站点获得),这样可以生成其它的输出格式。请注意保留一份翻译的原始英文SGML源文件!在发布更新后的HowTo时,获取该版本的新SGML源文件,简单地使用<tt/diff -u old.sgml new.sgml/就可以知道何处有变动,并把这些变动放入你的翻译版本,无需重新阅读或重新翻译全部内容。 如果你想在公开出版物中使用本文档,请联系本文作者(通过e-mail),这样可以获得最新的资料。以前有些Linux HowTo的过时版本被公开出版,使得开发者为一些在更新版本中已经回答过的问题饱受折磨。 This document is <em/not/ gospel. However, it is probably the most up to date info that you will be able to find. Nobody is responsible for what happens to your hardware but yourself. If your ethercard or any other hardware goes up in smoke (...nearly impossible!) we take no responsibility. ie. THE AUTHORS ARE NOT RESPONSIBLE FOR ANY DAMAGES INCURRED DUE TO ACTIONS TAKEN BASED ON THE INFORMATION INCLUDED IN THIS DOCUMENT. This document is Copyright (c) 1993-1999 by Paul Gortmaker. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this document under the conditions for verbatim copying, provided that this copyright notice is included exactly as in the original, and that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this document into another language, under the above conditions for modified versions. A hint to people considering doing a translation. First, translate the SGML source (available via FTP from the HowTo main site) so that you can then generate other output formats. Be sure to keep a copy of the original English SGML source that you translated from! When an updated HowTo is released, get the new SGML source for that version, and then a simple <tt/diff -u old.sgml new.sgml/ will show you exactly what has changed so that you can easily incorporate those changes into your translated SMGL source without having to re-read or re-translate everything. If you are intending to incorporate this document into a published work, please make contact (via e-mail) so that you can be supplied with the most up to date information available. In the past, out of date versions of the Linux HowTo documents have been published, which caused the developers undue grief from being plagued with questions that were already answered in the up to date versions. <sect1>结束语 <p> 如果你在本文档中发现有错别字或过时信息,请给我发e-mail。本文档比较大,所以很容易出现疏漏。如果你曾发e-mail要求改正,而在新版本中依然没改过来,请把改正要求再发一遍,可能你的上一封e-mail被我平时收到的大量垃圾信件掩盖了。 谢谢! Paul Gortmaker, <tt/p_gortmaker@yahoo.com/ (戈绍男,<tt/isaac_ge@yahoo.com/) </article>