首页
登录 | 注册

从dpdk使用中理解内核协议栈实现(一)

        网卡的环形队列是属于硬件本身,还是内核分配的?
          一种说法是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在协议栈传递过程中,并未发生拷贝
          
             
           

相关文章

  • 网络数据包收发流程(四):协议栈之packet_type
    进入函数netif_receive_skb()后,skb正式开始协议栈之旅.先上图,协议栈大致过程如下所示:跟OSI七层模型不同,linux根据包结构对网络进行分层.比如,arp头和ip头都是紧跟在以太网头后面的,所以在linux协议栈中a ...
  • 网络数据包收发流程(一):从驱动到协议栈
    早就想整理网络数据包收发流程了,一直太懒没动笔.今天下决心写了 一.硬件环境 intel82546:PHY与MAC集成在一起的PCI网卡芯片,很强大 bcm5461:   PHY芯片,与之对应的MAC是TSEC TSEC:      Thr ...
  • 转载请注明出处:http://forever.blog.chinaunix.net 最新在跟踪linux内核代码的时候,发现了ip_early_demux这个不是太新的参数,本着认真负责的态度将这个参数的来龙去脉梳理了一下. The rou ...
  • 第十一章--内核的数据类型
    一.数据类型         u8;         /* 无符号字节(8位) */         u16:     /* 无符号字(16位) */         u32:     /* 无符号32位 */         u64:   ...
  • Java基础8:深入理解内部类
    这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Ja ...
  • Linux内核连接跟踪锁的优化分析(2) 作者:gfree.wind@gmail.com 博客:linuxfocus.blog.chinaunix.net  微博:weibo.com/glinuxer QQ技术群:4367710 路漫漫其修 ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.012 s.
京ICP备10005923号