传统协议栈和DPDK


立即下载 ࿏自ོ༾由ོ༽人͙⃡⌇
2024-03-28
映射 数据 设备 DMA 内核 内存 建立 双向 取消 缓冲区
1 MB

一、传统协议栈之数据包从 NIC到内核
1、从 NIC 到内存
概括地说,网络数据包进入内存(接收数据包)的流程为:
网线 --> Rj45网口 --> MDI 差分线
--> bcm5461(PHY芯片进行数模转换 ) --> MII 总线
--> TSEC的 DMA Engine 会自动检查下一个可用的 Rx bd
-->把网络数据包 DMA 到 Rx bd所指向的内存,即 skb->data
1、首先,内核在主内存中为收发数据建立一个环形的缓冲队列 (通常叫 DMA 环形缓冲区)。
2、内核将这个缓冲区通过 DMA 映射,把这个队列交给网卡;
3、网卡收到数据,就直接放进这个环形缓冲区了——也就是直接放进主内存了;然后,向
系统产生一个中断;
4、内核收到这个中断,就取消 DMA 映射,这样,内核就直接从主内存中读取数据;
对应以上 4 步,来看它的具体实现:
1、 分配环形 DMA 缓冲区
Linux内核中,用 skb来描述一个缓存,所谓分配,就是建立一定数量的 skb,然后把它们组
织成一个双向链表
2、建立 DMA 映射
内 核 通 过 调 用 dma_map_single(struct device *dev,void
*buffer,size_tsize,enumdma_data_direction direction) 建立映射关系。
struct device *dev ,描述一个设备; buffer:把哪个地址映射给设备;也就是某一个 skb——
要映射全部,当然是做一个双向链表的循环即可; size:缓存大小; direction:映射方向—
—谁传给谁:一般来说,是“双向”映射,数据在设备和内存之间双向流动;对于 PCI设备
而言(网卡一般是 PCI的),通过另一个包裹函数 pci_map_single,这样,就把 buffer 交给设
备了!设备可以直接从里边读 /取数据。
3、这一步由硬件完成;
4、取消映射
ma_unmap_single,对 PCI而言,大多调用它的包裹函数 pci_unmap_single,不取消的话,缓
存控制权还在设备手里,要调用它,把主动权掌握在 CPU手里——因为我们已经接收到数
据了,应该由 CPU把数据交给上层网络栈; 当然,不取消之前, 通


映射/数据/设备/DMA/内核/内存/建立/双向/取消/缓冲区/ 映射/数据/设备/DMA/内核/内存/建立/双向/取消/缓冲区/
-1 条回复
登录 后才能参与评论
-->