【Linux的以太网驱动的收发流程比较】

一、数据接收的存储空间:

1、ring-buff:

ring-buff环形缓存区域,存储发送或者接收的dma-des描述符,描述符中记录dma物理地址,数据长度以及flag标志。

2、接收缓存:

传统方式:

e1000、emac1000等网卡,采用传统的方式:

1)、setup_rx_buff()初始化的时候,通过netdev_alloc_skb()方式分配skb,rx_desc->dma=dma_map_single(skb->data)的方式。

2)、数据接收rx_recv的硬中断中,只需要rx_desc->status和rx_desc->len填充。

3)、数据接收软中断中:

dma_unmap_single();

skb交给协议栈处理.

netdev_alloc_skb(),dma_map_single()。

现代方式:

igx高性能网卡,采用现代的方式:

1)、setup_rx_buff()初始化的时候,通过alloc_page()方式分配page内存,dma_map_page()方式映射内存;

2)、数据接收rx_recv的软中断中,netdev_alloc_skb()分配,memcpy(skb->data, page_address(page))拷贝一次数据,skb交给协议栈处理。

优点比较:

传统方式:零拷贝,适合小数据报文实时传输;

现代方式:非零拷贝,适合大数据报文高带宽传输。

二、发送数据:

dma_map_single()

tx_desc->dma=dma。

发送数据比较简单的原因: tcp发送有流控机制,udp发送缓存满时会阻塞或者返回失败;使用的是协议栈已经存在的skb。

相关推荐
ltl17 小时前
纠删码原理与存储效率
linux
ltl18 小时前
MinIO 原理和架构:机制、AGPL 与上游 archived 风险
linux
林浩杨_18 小时前
linux搜索命令(grep+sed)
linux·命令模式
W.W.H.18 小时前
将驱动编译成模块并安装到rootfs
linux·物联网·wifi·rootfs·驱动
ltl18 小时前
io_uring 在生产环境翻车实录:内核 bug、资源泄漏和你不知道的限制
linux
ltl18 小时前
内存分配器擂台:jemalloc vs tcmalloc vs mimalloc vs glibc
linux
ltl18 小时前
Zero Copy 的肮脏秘密:在什么时候反而更慢
linux
数据知道18 小时前
宽字节注入、二次注入、堆叠注入:高级 SQLi 专题
linux·运维·安全·网络安全
童槿顏丶20 小时前
GitLab部署到Linux
linux·运维·gitlab
空堂与归1 天前
Linux 命令实战:AI 开发者必备的终端操作手册
linux