Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1405407
  • 博文数量: 277
  • 博客积分: 2551
  • 博客等级: 少校
  • 技术积分: 3918
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-21 22:46
文章分类

全部博文(277)

文章存档

2017年(3)

2016年(9)

2015年(65)

2014年(27)

2013年(85)

2012年(61)

2011年(27)

分类: LINUX

2014-11-07 09:37:00

        网卡的环形队列是属于硬件本身,还是内核分配的?
          一种说法是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) |
给主人留下些什么吧!~~