共计 3872 个字符,预计需要花费 10 分钟才能阅读完成。
参考文献
linux 网络子系统 DMA 形式介绍
https://cloud.tencent.com/developer/article/1628161
网卡与 DMA 工作原理和流程
https://zhuanlan.zhihu.com/p/553904728
对收报、发包过程中网卡和网卡驱动工作流程有比拟具体的介绍
https://www.cnblogs.com/jmilkfan-fanguiju/p/12789806.html#_50
多队列网卡与网卡发包源码解读
https://blog.csdn.net/tenfyguo/article/details/8777436
这篇比拟全面具体: 对发包过程十分具体的形容,对波及到的函数有详细分析,很多图很直观
https://zhuanlan.zhihu.com/p/373060740
发送数据包流程 dev_queue_xmit 剖析
https://blog.csdn.net/wdscq1234/article/details/51926808
对网卡内存也就是 RX TX FIFO 有一个介绍, 对收包流程也有介绍:
https://www.jianshu.com/p/e6162bc984c8
意义
当初问题大略都解决了,网卡有内存,但只是简略的 RX TX FIFO,不起调度作用。多队列网卡应该接管时会有多个 CPU 能够并行处理,解决实现的程序和理论接管的程序可能不统一。
我猜想 :发送包的时候,应该也会有多个队列,每个队列绑定到一个 CPU 上,哪个 CPU 有空,就抢把锁去发送队列。这个队列存在主存还是网卡自带的什么存并不重要,要害的是这个队列和 tc Qdisc 是什么关系,一个包是如何进某个网卡队列的,是如何出队列被真正发送进来的,而后这些多个队列能并行发送吗?不过不能,那每次如何决定哪个队列出包发送呢?
这些问题对于全部包的一个发送状况有着决定性的影响,然而如果我只思考单队列的网卡,或者说如果网卡的每一个队列下都有一个 qdisc 的话,因为网卡驱动是依据包的四元组进行 HASH 来决定到哪个队列的,那同一个流总还是到同一个队列的,那我只思考这一个队列上的所有流的一个调度状况即可,也就是说尽可能在这些流的一个时延束缚空间内找最大的吞吐率(或者某价值函数)。那这和单队列网卡的状况是一样的。
因为对网卡多队列还须要破费一些工夫去理解、试验。所以当初先只思考单网卡队列状况。
网卡队列我看这个文章说的应该就是多个在内存中的 RingBuffer,由网卡驱动程序在内存中创立:
当初的服务器上的网卡个别都是反对多队列的。每一个队列上都是由一个 RingBuffer 示意的,开启了多队列当前的的网卡就会对应有多个 RingBuffer。
网卡在启动时最重要的工作之一就是调配和初始化 RingBuffer
我想多 RingBuffer 的益处应该就是能够施展多核 CPU 的劣势,能并行处理多个 RingBuffer。
只管网卡发包收报应该还是对 packet 一个接一个地进行。
问题
网卡队列是个啥啊?packet 是存在内存里,而后网卡以 DMA 的形式读取收回。还是说 packet 被 copy 到网卡的内存里,而后网卡读本人内存收回啊?网卡有内存吗?
我还是没明确网卡多队列是怎么工作的。
qdisc 是搭载在队列上的吗?一个网卡队列上搭载一个 qdisc?
网卡队列是在内存上用网卡驱动创立实现的吗?还是说网卡硬件上自身就存在多个队列存储空间?但这如同不重要,比拟要害的是一个包是如何进某个网卡队列的,是如何出队列被真正发送进来的,而后这些多个队列能并行发送吗?不过不能,那每次如何决定哪个队列出包发送呢?
网卡 DMA 工作
DMA 环形缓冲区建设在与处理器共享的内存中。每一个输出数据包被搁置在环形缓冲区中下一个可用缓冲区,而后收回中断。接着驱动程序将网络数据包传给内核的其它局部解决,并在环形缓冲区中搁置一个新的 DMA 缓冲区。
驱动程序在初始化时调配 DMA 缓冲区,并应用驱动程序直到进行运行。
筹备工作:
系统启动时网卡(NIC)进行初始化,在内存中腾出空间给 Ring Buffer。Ring Buffer 队列每个中的每个元素 Packet Descriptor指向一个sk_buff,状态均为ready。
上图中虚线步骤的解释:
- 1.DMA 接口将网卡(NIC)接管的数据包(packet)一一写入 sk_buff,被写入数据的 sk_buff 变为 used 状态。一个数据包可能占用多个 sk_buff , sk_buff 读写程序遵循先入先出(FIFO)准则。
- 2.DMA 写完数据之后,网卡(NIC)向网卡中断控制器(NIC Interrupt Handler)触发硬件中断请求。
- 3.NIC driver 注册 poll 函数。
- 4.poll 函数对数据进行查看,例如将几个 sk_buff 合并,因为可能同一个数据可能被扩散放在多个 sk_buff 中。
- 5.poll 函数将 sk_buff 交付下层网络栈解决。
后续解决:
poll 函数清理 sk_buff,清理 Ring Buffer 上的 Descriptor 将其指向新调配的 sk_buff 并将状态设置为 ready。
网卡构造 没有内存
网卡的组成:
(1)主芯片:网卡的主控制芯片是网卡的外围元件,一块网卡性能的好坏和性能的强弱多寡,次要就是看这块芯片的品质。如下图所示:
(2)BOOTROM 槽:BOOTROM 插座也就是常说的无盘启动 ROM 接口,其是用来通过近程启动服务结构无盘工作站的。如下图所示:
(3)数据泵:作用一是传输数据;二是隔离网线连贯的不同网络设备间的不同电平,还能对设施起到肯定的防雷爱护作用。如下图所示:
(4)晶振即石英振荡器,提供基准频率, 如下图所示:
(5)LED 指示灯:用来标识网卡的不同工作状态,例如,Link/Act 示意连贯活动状态,Full 示意是否全双工,而 Power 是电源批示。
(6)网线接口:有 BNC 接口和 RJ-45 接口,目前次要应用 8 芯线的 RJ-45 接口。
(7)总线接口:用于网卡与电脑相连接,内置式网卡须要通过俗称“金手指”的总线接口插在计算机主板的扩展槽中。次要有 ISA,PCI,PCMCIA 和 USB 等常见的是 PCI 总线接口的网卡。
- 网卡充当计算机和网络缆线之间的物理接口或连线,负责将计算机中的数字信号转换成电或光信号。
- 网卡要承当串行数据或并行数据间的转换,数据在计算机总线中并行传输,而在网络的物理缆线中以串行的比特流传输。
网卡构造工作过程
https://zhuanlan.zhihu.com/p/553904728
- 网卡驱动申请 Rx descriptor ring,实质是一致性 DMA 内存,保留了若干的 descriptor。将 Rx descriptor ring 的总线地址写入网卡寄存器 RDBA。
- 网卡驱动为每个 descriptor 调配 skb_buff 数据缓存区,实质上是在内存中调配的一片缓冲区用来接收数据帧。将数据缓存区的总线地址保留到 descriptor。
- 网卡接管到高下电信号。
- PHY 芯片首先进行数模转换,行将电信号转换为比特流。
- MAC 芯片再将比特流转换为数据帧(Frame)。
- 网卡驱动将数据帧写入 Rx FIFO。
- 网卡驱动找到 Rx descriptor ring 中下一个将要应用的 descriptor。
- 网卡驱动应用 DMA 通过 PCI 总线将 Rx FIFO 中的数据包复制到 descriptor 保留的总线地址指向的数据缓存区中。其实就是复制到 skb_buff 中。
- 因为是 DMA 写入,所以内核并没有监控数据帧的写入状况。所以在复制完后,须要由网卡驱动启动硬中断告诉 CPU 数据缓存区中曾经有新的数据帧了。每一个硬件中断会对应一个中断号,CPU 执行硬下述中断函数。实际上,硬中断的中断处理程序,最终是通过调用网卡驱动程序来实现的。硬中断触发的驱动程序首先会临时禁用网卡硬中断,意思是通知网卡再来新的数据就先不要触发硬中断了,只须要把数据帧通过 DMA 拷入主存即可。
当网卡接管光 / 电信号,将其转换为数据帧内容,如果帧合乎以太网地址等过滤条件,则保留到 RX FIFO 缓存对列中。
网卡解析 FIFO 中数据帧的 2 /3/ 4 层信息,进行流过滤、流定向、RSS 队列分流,计算出帧对应的分流队列号。
网卡从 mem 空间的寄存器中获取环形缓冲区的信息,DMA 控制器把接管的数据包间接 DMA 到内存中,该过程都是由网卡硬件实现的。
网卡接管音讯解决流程如下:对收报、发包过程中网卡和网卡驱动工作流程有比拟具体的介绍:
https://www.cnblogs.com/jmilkfan-fanguiju/p/12789806.html#_50
网卡工作在物理层和数据链路层,次要由 PHY/MAC 芯片、Tx/Rx FIFO、DMA 等组成,其中网线通过变压器接 PHY 芯片、PHY 芯片通过 MII 接 MAC 芯片、MAC 芯片接 PCI 总线。
PHY 芯片次要负责:CSMA/CD、模数转换、编解码、串并转换。
MAC 芯片次要负责:
比特流和数据帧的转换(7 字节的前导码 Preamble 和 1 字节的帧首定界符 SFD);
CRC 校验;
Packet Filtering(L2 Filtering、VLAN Filtering、Manageability/Host Filtering)。
Tx/Rx FIFO:Tx 示意发送(Transport),Rx 是接管(Receive)。
DMA(Direct Memory Access):间接存储器存取 I/O 模块。
对网卡内存也就是 RX TX FIFO 有一个介绍, 对收包流程也有介绍:
https://www.jianshu.com/p/e6162bc984c8