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

相关推荐
小樱花的樱花20 小时前
C++ new和delete用法详解
linux·开发语言·c++
APIshop20 小时前
Java获取京东商品详情接口(item_get)实战指南
java·linux·数据库
Cx330❀20 小时前
一文吃透Linux System V共享内存:原理+实操+避坑指南
大数据·linux·运维·服务器·人工智能
薛定谔的悦20 小时前
储能系统(EMS)核心架构解析:充放电控制、防逆流、防过载与 PID 调节
linux·运维·架构
3GPP仿真实验室21 小时前
【MATLAB源码】CSI-RS:测量链路
linux·网络·matlab
阿 才21 小时前
WSL2 + TFTP + 网络启动(Linux开发板与WSL2建立网络连接)
linux·运维·网络
IMPYLH1 天前
Linux 的 false 命令
linux·运维·服务器·bash
小江的记录本1 天前
【Linux】《Linux常用命令汇总表》
linux·运维·服务器·前端·windows·后端·macos
一匹电信狗1 天前
【Linux我做主】进程程序替换和exec函数族
linux·运维·服务器·c++·ubuntu·小程序·开源
济6171 天前
ARM Linux 驱动开发篇--- Linux 并发与竞争实验(原子操作)--- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发