Intel e1000 网卡


参考资料:
1。Intel 82547 网卡 开发 手册。其他Intel网卡的手册应该也可以从网上下载到。
http://linux.chinaunix.net/bbs/thread-1142051-1-2.html
2。Linux e1000网卡 驱动
http://lxr.linux.no/#linux+v2.6.30/drivers/net/e1000/e1000_main.c
3。CU网友原创:Linux-千兆网卡驱动实现机制浅析
http://linux.chinaunix.net/bbs/v ... p%3Bfilter%3Ddigest

发包过程:
1。linux os会调用网卡的start_xmit()函数。在e1000里,对应的函数是 e1000_xmit_frame,
2。e1000_xmit_frame又会调用e1000_tx_queue(adapter, tx_ring, tx_flags, count)。
这里的tx_queue指的是发送Descriptor的queue。
3。e1000_tx_queue 在检查了一些参数后,最终调用 writel(i, hw->hw_addr + tx_ring->tdt)。
这里的tx_ring->tdt中的tdt全写为 tx_descriptor_tail。从网卡的开发手册中可以查到,如果写了descriptor tail,那么网卡就会自动读取 descriptor,然后把包发送出去。
descroptor的主要内容是addr pointer和length。前者是要发送的包的起始物理地址。后者是包的长度。有了这些, 硬件 就可以通过dma来读取包并发出去了。其他网卡也基本会用descriptor的结构。

几个和RTL8139 网卡不同的地方:
1、RTL8139 中,发送一个包只能用一个DESCRIPTOR(DESC). 而在 E1000中,可以用一个DESC来描述整个包,也可以用多个。
比如用2个DESC. 一个描述HEADER, 另外一个描述后面的 数据 。还可以用更多个DESC,这个主要是在TSO时候用到的。关于TSO的解释看下面。当用多个DESC描述一个包的时候,在DESC结构中有一个EOP (END OF PACKET) 位。这一位就指示了当前的DESC是最后一个DESC。我觉得其中隐含的一个设定就是,所有描述同一个包的DESC都是排列在一起的。应该不能出现2个包的DESC混合排列的情况。

2、RTL8139中,所有的DESC都是同样的结构。而在E1000中,一共有3种不同形式的DESC. 最老的LEGACY DESC是为了兼容以前的。然后2个新的DESC,一个是CONTEXT DESC, 另外一个是DATA DESC。新的DESC是为了更好的算CHECKSUM,比如TCP OR UDP的CHECKSUM.

3. DESC 数目。在RTL8139中只有4个发送的DESC.接收的好像只有1个?在E1000中发送和接收可以各有256个。最大可以达到64K。TX RING的大小是可以由 软件 指定的,指定方法是设定TDLEN(TX DESCRIPTOR LENGTH)。

(PS:最近主要研究发送,关于接收的地方也许有错误)

备注:关于TX DESCRIPTOR的描述在手册的3.3,关于TX RING的描述在3.4

================分割线===================================

INTEL E1000相对来说是一个比较复杂,功能繁多的网卡. 相反, 老的 RTL8139网卡就简单很多.
早期的 RTL8139 网卡的功能很少. 它就是把OS发给它的包放到网卡上发出去. 最高速度好像也就是10Mbit 或者100Mbit.
随着科技的进步, INTEL 1000支持的功能又多了. 很明显的一个就是TCP SEGMENTATION OFFLOADING (缩写 TSO, 在驱动的代码中经常可以看到).

下面先解释下什么是TSO:
我们知道网络是分成很多层的, TCP 在中间,下面又有IP, ETHERNET 协议 (对应不同的层). TCP 可以发一个很大的包,比如说2K B. 但是ETHERNET 可能不支持. 比如ETHERNET 只支持1.5K B. 那么怎么发送2K B的TCP包呢? 简单的办法就是把它分成2个. 第一个是1.5KB. 第2个是0.5KB. 这个过程就叫TCP SEGMENTATION (我不清楚中文是怎么 翻译 的. 不好意思).
那么OFFLOADING 是什么意思呢? 它的本义大概是"卸载". 在这里可以理解为"放下来". "下来"是哪里呢? 由于一般说软件(OS) 是跑在硬件"上面"的, 所以"下来"也就是下到硬件(网卡)上来.
所以TSO的含义就是把TCP SEGMENTATION 放到了网卡上来做. 这些工作本来是OS做的. 现在网卡硬件可以做了,结果就是OS更简单了. 而且硬件实现一般来说也会更快速一些. 所以INTEL E1000 支持1Gbit.

INTEL E1000 另外一个和RTL8139不同的地方在于对发送包 (SKB) 的处理. 8139 的驱动里, 先通过pci_alloc_consistent (2.6.18. 到了2.6.29又变了)来分配一块可以用来DMA的内存,然后调用 skb_copy_and_csum_dev 把OS传来的数据复制到可以DMA的内存那里. 这个复制的过程要消耗一些时间,影响效率.
在INTEL E1000里采用了另外一种做法. 在e1000_tx_queue之前,又调用了 e1000_tx_map(). 这个函数的主要功能就是为SKB里的数据建立一个可以DMA的地址. 这样就不用复制内存了. 建立一个DMA地址的过程似乎比较快(我猜的), 所以效率应该也提高了.

你可能感兴趣的:(Intel e1000 网卡)