网卡的环形队列是属于硬件本身,还是内核分配的?
一种说法是DMA建立的ring队列,并且分配skb作为缓存,ring只是数据结构,并不是缓存。
一种说法是网卡自带硬件的ring队列
数据的分流是谁来完成的,数据的分流占用谁的CPU时间?
网卡将数据拷贝到这个ring的skb中,然后发起中断,通知内核来取,这个中断处理就是网卡驱动的中断处理程序完成的。
然后每次中断取消这个DMA映射,重新分配skb,再次映射好,然后使能中断,这个数据的具体的处理就交给了软中断了
在软中断的tasklet中,就通过poll来做的,它轮询环形队列,最后通过netif_receive_skb将数据交给协议栈了,同时会将数据拷贝给各种网络嗅探器。
可见数据分流是占用tasklet的cpu时间,而这是一个内核线程
数据包在内核协议栈是否有拷贝?
netif_receive_skb将数据投递到协议栈,这个时候会继续调用deliver_skb,这个就会交给3层协议了,调用3层协议栈的pack_rcv,如果3层是IP层,那么就是ip_rcv了,这个时候这个skb并没有释放和向上拷贝,只是增加引用计数。
接下来就是IP层包的处理了,如果是发给本地的,就调用ip_local_deliver,如果不是,就要ip_forward。
ip_local_deliver就再将skb往上传递,根据注册的4层协议(tcp,udp,icmp)等,根据数据包的协议类型,有选择的执行tcp_rcv,udp_rcv,icmp_rcv。
如果是tcp协议,则tcp_rcv就会将skb挂到socket的队列上了。
由此可见,skb在协议栈传递过程中,并未发生拷贝
阅读(7478) | 评论(0) | 转发(0) |