Alpha/AXP的PCI板上的Linux以太网卡
对于v2.0,只有3c509、depca、de4x5、pcnet32和所有8390驱动程序(wd、smc-ultra、ne、3c503等等)是编写成“结构无关”的,所以它们可以运行在基于DEC的Alpha CPU系统上。其它一些从Donald的WWW主页上下载的更新过的PCI驱动程序也可以工作,因为它们也是按照结构无关的思想编写的。
注意,使驱动程序与结构无关所需要进行的改动并不很复杂。只需要如下进行:
--把所有与jiffies有关的值都乘以HZ/100,得到Alpha使用的不同的HZ值。(即timeout=2;变成timeout=2*HZ/100;)
--把所有I/O内存(从640k到1MB)的指针引用替换为相应的readb() writeb() readl() writel()调用,如下例所示。
--------------------------------------------------------------------------------
- int *mem_base = (int *)dev-mem_start;
- mem_base[0] = 0xba5eba5e;
+ unsigned long mem_base = dev-mem_start;
+ writel(0xba5eba5e, mem_base);
--------------------------------------------------------------------------------
--把所有使用I/O内存作为源或目的地址的memcpy()调用替换为相应的memcpy_fromio()或者memcpy_toio()调用。
以结构无关的方式处理内存访问的细节在近期的内核所附的文件linux/Documentation/IO-mapping.txt中进行了说明。
SUN/Sparc硬件上的Linux以太网卡
要得到最新的Sparc信息,可以访问以下URL:
Linux Sparc
注意,有些Sparc的以太网硬件从主机获得其MAC地址,因此可能会有多个接口具有相同的MAC地址。如果想在同一个网络上使用多个接口,可以使用ifconfig的hw选项以分配唯一的MAC地址。
把PCI驱动程序移植到Sparc平台上与上面提到的AXP平台相似。可能的差异出在endian上,因为Sparc是big endian,而AXP和ix86是little endian。
其它硬件上的Linux以太网卡
还有一些其它硬件平台可以运行Linux,比如Atari/Amiga(m68k)。就象Sparc一样,最好是访问每个Linux支持的平台主页,以了解当前都支持哪些硬件。(欢迎提供这样的站点连接――把它们发给我!)
不使用Hub连接10/100BaseT
可以不使用Hub连接基于10/100BaseT(RJ45)的系统吗?
如果不使用额外的设备或机械装置,可以很容易地连接两台这样的机器,但不可能再多。参阅双绞线――解释了如何做到这一点。而且你不可能简单地交叉几根线或其它什么就弄出一个Hub,不复制Hub也无法正确完成冲突信号。
SIOCSIFxxx: No such device
在启动时出现了一大堆“SIOCSIFxxx: No such device”信息,后面还有一条“SIOCADDRT: Network is unreachable”,怎么回事?
你的以太网设备在启动/插入模块时没有被检测到,当ifconfig和route运行时,它们没有可用的设备。使用dmesg | more来浏览启动信息,看看有没有检测以太网卡的信息。
SIOCSFFLAGS: Try again
在运行“ifconfig”时出现“SIOCSFFLAGS: Try again”――怎么回事?
某些其它的设备使用了以太网卡想用的IRQ,所以以太网卡无法使用该IRQ。你不必重新启动来解决这个问题,因为某些设备只是在需要时才获取IRQ,在完成后就释放了。例如某些声卡、串口、软盘驱动器等。你可以键入cat /proc/interrupts来看看哪些中断正在被使用。绝大多数Linux以太网卡驱动程序只有在用“ifconfig”打开时才获取IRQ。如果你能让其它设备“放开”所需的IRQ中断线,那么你就可以用ifconfig来“再试一下”了。
使用“ifconfig”得到的连接为UNSPEC,而硬件地址是00:00:00:00:00:00
在不带参数运行ifconfig时,报告说连接为UNSPEC(而不是10Mbs以太网),而且硬件地址都是零。
这是因为运行的“ifconfig”程序版本比内核的版本高。在与老版本的内核一起运行时,新版本的ifconfig无法报告这些特性。你可以升级内核,或者“降级”ifconfig,或者干脆不理会这个错误。内核知道硬件地址,所以即使ifconfig无法读出它也没有关系。
如果使用的ifconfig程序比使用的内核旧很多的话,也会出现一些奇怪的信息。
大量的RX和TX错误
在不带参数运行ifconfig时,报告大量的接收和发送数据包错误。但看起来工作正常――怎么回事?
再看一遍。报告是说RX packets big number 停顿 errors 0 停顿 dropped 0 停顿 overrun 0。所以你看到的那个大数字是机器接收和发送的数据包总数。如果还觉得不可思议,键入cat /proc/net/dev试试。
/dev/下以太网卡的入口
/dev/eth0象是个到/dev/xxx的连接。这样对吗?
与你听过的正好相反,/dev/*下的文件没被使用。你可以删除掉任何/dev/wd0, /dev/ne0以及类似的入口。
Linux与“trailers”
在“ifconfig”网卡时,需要禁止trailers吗?
不能禁止trailers,而且也没必要。“trailers”是避免在网络层复制数据的工具。其想法是使用一个大小为“H”的固定大小的头,把可变大小的头信息放在包的尾部,并把所有包定位在页开始之前的“H”字节。这只是个好想法,在实际中工作得并不好。如果有人建议使用“-trailers”,那不过是找个替罪羊罢了。这对解决问题没有任何意义,但如果问题真的自行解决了,那么他就可以吹嘘自己的神奇本领了。
访问原始以太网设备
在Linux下怎样不通过TCP/IP之类的东西访问原始的以太网设备?
--------------------------------------------------------------------------------
int s=socket(AF_INET,SOCK_PACKET,htons(ETH_P_ALL));
--------------------------------------------------------------------------------
这样就可以得到一个接收所有协议类型的socket。对它执行recvfrom()调用,它就会用sa_family里的设备类型和sa_data数组里的设备名来填充sockaddr。我不知道是谁最早在Linux里使用SOCK_PACKET,但它确实是个非常好的东西。你也可以通过sendto()调用发送原始数据包。当然,在这样做时你必须拥有root的权限。