- 论坛徽章:
- 0
|
刚好最近在看发送这块,对 62楼的下面这段叙述再补充下:
原文:
1. eth有一个tx ring,只要把包写入ring, eth只要发现ring中有新data过来,就自动去取,然后处理/发送。整个过程中,软件只要很简单的将上层的data push到ring中就行了(除非ring塞满了,所以总可以写)。整个过程中不需要中断辅助。
补充:
这里有几个不是很准确的地方。上面说的那种情况,基本上适用于RTL8139网卡。驱动要把数据复制到一个固定的内存里。另外,网卡不会不停的查看是否有新数据过来的。一般是驱动向网卡上某个寄存器写个数,告诉网卡当前的TX DESC NO. 网卡这时才会去看是否有新的数据。
在INTEL E1000中,网卡功能更强了一些。驱动只要提供一个放置着 TX DESC 的RING 就可以。每个TX DESC 又指向真正的数据包,这个数据包的地址不必是固定的(当然必须是物理地址)。所以驱动只要准备好TX DESC, 把要发送的包的地址写到TX DESC里。网卡会自动读取TX DESC, 找到发送包的地址,再去到那个地址上把数据DMA到网卡上,然后发送出去。
最后,在发送时中断一般是网卡告诉驱动某个或某些数据包发送完了的。因为TX DESC 个数有限(RTL8139 是 4个,E1000可以很多,好像16K?)。所以驱动需要知道某个TX DESC是否还需要被网卡使用。如果网卡不用了,那么驱动就可以回收那个TX DESC,用来指向新的数据包。
RTL8139发送时,好像只有TX INTERRUPT 方式。在E1000中,又提供了一个状态位,而不是用中断。这样的话,在发送大量数据时,驱动可以直接轮询TX DESC, 而减少中断的次数。因为太多中断也是性能降低的一个重要因素。 |
|