Thursday, January 27, 2011

ring buffer和skb buffer的区别等

轉:http://www.unixresources.net/linux/clf/driver/archive/00/00/69/02/690284.html

大家好,我刚刚接触Linux网络驱动方面,对驱动的各部分有了总体认识,但是有些细节不是很了解。
目前有以下几个问题:
1.看到网卡驱动中有skb buffer和ring buffer两种缓冲区。请问两个有什么区别,分别存放什么,
这两个缓冲区分别是在哪里申请的阿,比如说skb是在内存的物理映射区,那ring buffer呢?
2.TX_ring_size和RX_ring_size以及MIN_MTU和MAX_MTU的值是怎么确定的?一个数据包的大小不是
46-1500字节吗?还有skb大小怎么定?缓冲区里可以容纳多少个数据包一次?
3.netif_rx将数据包传给上层协议,这个过程是怎么进行的阿?是需要传给一个系统接口然后再传给
应用程序吗?那能不能让netif_rx直接把数据包传给应用程序阿?我们有个应用想通过驱动直接获取
并处理数据包,而不经过系统接口。 



=========================================

1、skb buffer是数据包的核心结构,每一个包都对应一个skb buffer。ring buffer是用来管理多个skb buffer的,也就是skb buffer的缓冲池,当网卡接收多个数据,但是上层协议还没来得及读取的时候,用来缓冲这些包。发送的时候,用来缓冲上层协议传递过来的包。
2、TX_ring_size和RX_ring_size主要根据网卡接收/发送数据的速度决定的,接收速度越快,tx_ring_size越 大;发送速度越慢,rx_ring_size越大。MAX_MTU的值主要由网卡的内部buffer的大小;MIN_MTU是标准的,好像是64个字节 (包括L2 header)。
3、netif_rx只是把skb挂到系统队列上,最后会由软中断调用netif_receive_skb把数据传递给上层协议,三言两语说不清楚。好像可以通过raw socket,直接读取L2层的包。

No comments:

Post a Comment