【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。

相关推荐
AI_Lab011 小时前
宝塔用了两年,有没有必要换成轻量方案?
linux·运维·服务器
by209991 小时前
Linux GDB 调试与 CGDB 使用
linux·运维·服务器·经验分享
星恒随风2 小时前
Linux网络编程:应用层协议究竟是什么?从网络计算器到TCP Socket抽象基类完整实现
linux·网络·笔记·tcp/ip
feng_you_ying_li4 小时前
linux之网络层
linux·运维·网络
未来之窗软件服务5 小时前
Linux 运维日志删除的多种方式—东方仙盟
linux·运维·服务器·仙盟创梦ide·东方仙盟
小雉系统5 小时前
BcoreOS实战:用一个升级包,让Rocky Linux跑进Debian服务器
linux·运维·服务器·debian
thethefighter5 小时前
快速预览Word、WPS秒开,支持空格弹窗
linux·word·wps·快速预览·空格弹窗·nhdeepview
用户8351414049495 小时前
把日志和寄存器值喂给AI做故障定位,我的实际问法
linux·ubuntu
Ruiery6 小时前
Linux 6.6内核内存管理深度解析(十七):vmalloc — 内核要“虚拟连续“就够:物理页逐个凑,页表来连
linux·运维·服务器
Escalating_xu6 小时前
【Linux 网络编程】ARP 的具体过程与 ARP 欺骗:一条 IP → MAC 映射,怎样改变数据的去向?
linux·网络·tcp/ip