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

相关推荐
皮卡蛋炒饭.13 小时前
传输层协议UDP
linux·网络协议·udp
syagain_zsx13 小时前
Linux指令初识(实用篇)
linux·运维·服务器
王木风14 小时前
终端里的编程副驾:DeepSeek-TUI-项目深度拆解,实测与原理分析
linux·运维·人工智能·rust·node.js
槑槑紫14 小时前
windows系统装轻量版linux开发
linux·运维·服务器
齐潇宇14 小时前
k8s-Helm管理器
linux·运维·云原生·容器·kubernetes
Irene199114 小时前
(课堂笔记)Linux 基础命令:文件增删改、重命名、压缩等
linux
脆皮炸鸡75515 小时前
库制作与原理~动态链接
linux·开发语言·经验分享·笔记·学习方法
小王C语言15 小时前
Windows和Linux之间文件互传
linux·运维·服务器
magic_now16 小时前
Linux 内核启动流程详解(基于 5.15.119 源码)
linux·运维·服务器
草木深雨纷纷16 小时前
mt管理器手机版下载2026最新版更新下载分享
linux·运维·网络·智能手机