首先我们看一下一个主流多队列网卡(E1000)跟多核CPU之间的关系图:
非多队列:
linux的网卡由结构体net_device表示,一个该结构体对应一个可以调度的数据包发送队列。
数据包的实体在内核中以结构体sk_buff(skb),形如:
多队列:
一个网卡可以拥有多个队列
接下来,看看TX引擎是如何工作的(注:对于发送和接收数据包有两个名词,分别应对TX,RX)
解释:
函数-dev_queue_xmit():入队一个buffer以传输到网络驱动设备。
配合该函数的源码来解释上图的传输过程:
步骤一:可以看到如果设备支持队列,则数据包入设备队列。在入队操作前后,有加锁和释放队列锁的过程。
步骤二:调出设备的qdisc(该对象是队列的排队规则)
QDisc(排队规则)是queueingdiscipline的简写,它是理解流量控制(traffic control)的基础。无论何时,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc(排队规则)把数据包加入队列。然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。最简单的QDisc是pfifo它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。
步骤三:重置skb的队列映射,置为0
步骤四:tx lock->hard_start_xmit
到这里,我们好像没有看到tx_lock、hard_start_xmit函数,反而我们在无队列的设备分支中看到了这些:
Dev_hard_start_xmit的定义:
很明显我们应该拨开云雾看到一些本质,再次回到设备支持队列的分支中(这才是我们关心的):
不管怎么样,你总该有发送的函数调用吧,就是下面圈起来的这个:
果不其然,这是一个封装函数:
参考:
http://www.landley.net/kdocs/ols/2007/ols2007v2-pages-305-310.pdf
http://vger.kernel.org/~davem/davem_nyc09.pdf
http://www.chineselinuxuniversity.net/kerneldocs/networking/API-dev-queue-xmit.html
http://apps.hi.baidu.com/share/detail/36206005
http://cache.baidu.com/c?m=9d78d513d98017f419bc837f7d01d0120e55f0237b8bc7150ec3e54c84145d563164f4cd25351174c4b5777075d95e2cebe74703234460e99492ce0c9fac935b3295776a2d499141658243f4971532c157c304b2ff4ab7e9e732e4ff8f8cc2040d97061832daabc8015c41ca65ed4771a5fdc816424240b8fa3013a4537d2c992742b750f997682858df&p=ce7ddc1187904eac59b5c4710e14d625&user=baidu&fm=sc&query=qdisc%5Frun+%D6%B4%D0%D0%B9%FD%B3%CC&qid=f6ae9cf00151dde4&p1=1
http://lwn.net/Articles/289137/
分享到:
相关推荐
在Linux下通过消息队列机制实现双方通信
消息队列源码-Linux.zip
多队列(queues)网卡DMA收包方式.pdf
发送端读取指定的文件,并且按照环境变量中设置的消息队列键值进行发送。如果要改代码,只要把键值改一下,结构体储存要发送的消息的那个数组对应改成自己想发送的值,就可以很好的实现功能。接收端同样按环境变量...
linux下消息队列例程源码
linux 消息队列 发送端简单使用
Linux消息队列 ---------学习linux下 c编程之消息队列
linux中的队列源代码,可以实现,非常具有参考价值
Linux 环境下利用消息队列消息机制,多线程通信,字符串处理,链表操作,信号简单处理等知识用C语言编写多人聊天室实现: 服务器实现各用户之间聊天的消息转发,在用户注册或者登录时对各用户进行消息提醒,客户端从...
本文从代码层面详细介绍了intel igb系列驱动程序的收发包流程。文档首先分析驱动程序中...及协议栈如何将数据包发送到驱动中,驱动如何将数据包放入网卡的发送队列。 文档中所贴代码都有详细的中文注释便于阅读和分析。
linux消息队列linux消息队列linux消息队列linux消息队列linux消息队列进程间通信进程间通信
亲测可用的基于Linux消息队列的简易聊天室(C语言)(附源代码)采用客户-服务器结构,其中服务器实现各个用户的登录并存储相关信息,客户端通过服务器端获取当前登录用户信息,然后各客户进程通过消息队列实现双向通信...
实现多线程队列抢购等功能源码,Java多线程总结之线程安全队列Queue
c linux 队列处理 类似c# arraylist
C语言实现的队列函数,基于unix linux线程库,代码工整,学习队列的好程序
易语言源码易语言简单队列处理源码.rar 易语言源码易语言简单队列处理源码.rar 易语言源码易语言简单队列处理源码.rar 易语言源码易语言简单队列处理源码.rar 易语言源码易语言简单队列处理源码.rar 易语言源码...
linux消息队列信息交互,终端下实现的信息发送与接收
linux环境下消息队列的实现
linux下的消息队列编程函数指南,详细说明了消息队列建立的过程,发送,接受,和控制
Linux IPC通信利用消息队列消息机制,多线程通信,字符串处理,链表操作,信号简单处理。消息队列是System V支持一种IPC机制,通过类似链表的操作向一个FIFO里通过msgsnd发送用户自定义数据,进程可以通过msgrcv来...