PCI机器里的共享内存ISA网卡不工作(0xffff)
这常表现为显示读出大量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,并把基址改为网卡的共享内存地址。
网卡看来在发送数据,但没有收到过数据。
执行cat /proc/interrupts。这样产生的列表会显示网卡产生的所有中断事件的实时数目。如果为0或在试图使用网卡时没有增加,那么可能是与计算机安装的其它设备发生物理中断冲突(无论其它的设备是否安装/提供了驱动程序)。把其中一个设备的IRQ改为未使用的IRQ。
异步传输模式(ATM)支持
Werner Almesberger在进行Linux的ATM的支持工作。他使用的是Efficient Networks的ENI155p板(Efficient Networks)和Zeitnet的ZN1221板(Zeitnet)。
Werner说ENI155p的驱动程序已经很稳定了,而ZN1221的驱动程序还没有完成。
去下面的连接查看一下最新的进展:
Linux ATM Support
吉比特以太网支持
Linux支持吉比特以太网吗?
是的,目前至少已经有了两个驱动程序。在v2.0和v2.2内核里有一个Packet Engines G-NIC PCI吉比特以太网适配器的驱动程序。驱动程序的更多细节、支持和更新可访问:
http://cesdis.gsfc.nasa.gov/linux/drivers/yellowfin.html
v2.2内核提供的acenic.c驱动程序可用于Alteon的AceNIC吉比特以太网卡和其它如3Com的3c985一类的基于Tigon的网卡。这个驱动程序还可以用于NetGear的GA620,但还需要证实。
FDDI支持
Linux支持FDDI吗?
是的。Larry Stefani为v2.0编写了Digital的DEFEA(FDDI EISA)和DEFPA(FDDI PCI)网卡驱动程序。它被包含进v2.0.24内核。目前还没有其它的网卡被支持。
全双工支持
全双工能达到20MBps吗?Linux支持吗?
Cameron Spitzer对全双工10Base-T网卡有如下论断:“如果你连在全双工交换HUB上,你的系统足够快而且不做太多其它的工作,它会使你的网络在两个方向上都保持忙碌。不存在什么全双工的10BASE-2或10BASE-5(细缆和粗缆)。全双工是通过取消适配器的碰撞检测来达到的。这就是为什么用同轴电缆实现不了全双工;LAN无法以全双工方式运转。 10BASE-T(RJ45接口)使用不同的线进行发送和接收,所以二者可能同时进行。交换HUB处理碰撞问题。信号速率是10Mbps。”
所以,你只能以10Mbps速率接收或发送数据,无法期望得到两倍的性能提高。对于是否支持,取决于网卡和可能的驱动程序。有些网卡可以自动协商,有些需要驱动程序支持,还有的需要用户在网卡的EEPROM配置中设置选项。只有那些认真的用户会注意到全双工与半双工模式间的差别。
SMP机器上的Linux以太网卡
如果你有钱买多处理器(MP)的计算机,那么最好买一个好点儿的以太网卡。对v2.0内核这还不是个问题,但对v2.2就成问题了。大多数老式的非智能(如ISA总线的PIO和共享内存设计)网卡在设计时根本没考虑多处理器应用。简单地说就是买一个现代设计的智能网卡,并确定有能够处理多处理器操作的驱动程序。(注意这里的“现代设计” - PCI-NE2000就是在现代总线上有10多年历史的老式设计。)在驱动程序的源码里查找spin_lock可以很好地说明该驱动程序是否能够处理多处理器操作。下面详细解释了为何要为多处理器应用购买好的网卡(以及不买会出现什么问题)。
在v2.0内核,在任意时刻只有一个处理器允许进入“内核态”(即改变内核数据或运行设备驱动程序)。所以从网卡(及相关驱动程序)的角度来看,这与单处理器操作没有什么不同,所以不会出问题。(这也是得到一个可以工作的Linux多处理器版本的最简单的办法 -- 使用一个大锁使得一次只有一个处理器处于内核状态。这样你就知道不可能有两个处理器同时要修改同一数据!)
在任意时刻只有一个处理器允许进入内核态的不利之处在于只有运行自我控制和密集计算的程序时才会获得多处理器的优越性。如果程序进行了大量诸如向磁盘或网络读/写数据的I/O操作,在处于内核的那个处理器努力运行所有的设备驱动程序以满足I/O请求的同时,其它的处理器都必须等待自己的I/O请求被处理完成。这样内核就成为了瓶颈,由于只有一个处理器运行在内核态,多处理器机器的性能在I/O任务重、单锁的情况下迅速降级到接近单处理器的水平。
很明显这与理想情况相差太远(尤其是对于文件/WWW服务器、路由器等),v2.2的内核就使用了粒度更小的锁――也就是说同时可以有多个处理器进入内核。不再是对整个内核使用一个大锁,而是使用许多较小的锁保护关键数据,防止同时被多个处理器控制――例如,一个处理器可以运行网卡驱动程序,同时另一个处理器可以运行磁盘驱动器的驱动程序。
好的,这样就有问题了:更小的锁定就意味着可以有一个处理器试图通过以太网驱动程序发送数据,同时另一个处理器试图访问同一个驱动程序/网卡来做别的事情(比如通过cat /proc/net/dev得到网卡统计数据)。哎呦――你的网卡正在通过网线发数据,你又要用它来收数据。网卡被同时要求做两件事(或更多),会弄糊涂的,所以有可能在处理过程中网卡使你的机器死机。
因此,为单处理器写的驱动程序不再适用――它需要更新控制对网卡访问的锁,使得网卡的接收、发送和操作配置数据这三种任务以网卡稳定操作所要求的程度串行化起来。没有更新为使用稳定多处理器操作的锁的驱动程序在轻的网络负载下可能看起来会正常工作,但在两个(或更多)处理器试图同时进行多个任务时就会造成死机,或至少表现出奇怪的行为,这就是问题。
更新后的意识到多处理器的以太网驱动程序将要求一个驱动程序范围的锁,使得内核进入驱动程序的访问入口被限制为一次一个。这样,任务就被串行化,而对硬件的处理就如同在单处理器下一样,也就一定应当稳定。使用驱动程序范围的锁的不利之处在于它类似于对整个内核加锁(但规模较小)对性能的影响――也就是说,一次只可以有一个处理器处理网卡。[技术提示:如果增加的锁是irqsave类型的而且被持有较长时间,对性能的影响还包括增加了中断延迟。]
这里可以进行的改进有两处。可以尝试减少获得与释放锁之间所用的时间,或者在驱动程序内部实现更为细化的锁(比如满足网卡需求的前提下,把整个驱动程序的锁替换为若干保护同时访问若干敏感寄存器或设置的锁)。
但是,对于老式的非智能网卡而言,在设计时根本就没有考虑过多处理器的应用,这样的改进可能无法实现。更糟的是非智能网卡一般要求处理器在网卡和内存之间传送数据,所以在最坏的情况下,每当在ISA总线传送1.5kB数据包时,锁都被一直保持着。
现代的智能网卡一般无需处理器的帮助就可以直接在网卡和内存之间传递网络数据。这是个很大的改进,因为只需要在处理器通知网卡使用哪一块内存保存下一个网络数据包的那一小段时间持有锁。现代的网卡在设计时同样也不要求对整个驱动程序使用一个大锁。