网卡内部的 DMA

news2024/11/25 13:40:30

前言

MCU、SOC 内部通常带有 DMA 控制器,要想使用 DMA 通常需要如下操作

  1. 选择通道
  2. 配置传输方向(内存到外设、内存到内存、外设到内存)
  3. 设置源地址、目的地址(内存地址、外设地址)
  4. 设置源地址、目的地址是否自增
  5. 设置位宽(字节对齐、半字、字、双字)
  6. 设置传输数据长度
  7. 传输模式(单次、循环)
  8. 优先级
  9. 开始传输

网卡作为一个对性能十分看重的设备,其内部本身通常是带有 DMA 控制器的。那么网卡内部的 DMA 控制器是如何使用的呢?
也和上述操作流程类似吗?今天我们就来研究一下。

网卡内部的 DMA

  1. SOC 内部的 DMA 是一个通用设施,通过配置不同通道给不同外设使用,而网卡内部的 DMA 是专门给网卡使用的,所以没有选择通道一说,可以理解为,有固定两个通道,一个给 TX 使用,一个给 RX 使用。
  2. 对于 TX DMA 或者 RX DMA 来说,它们本身设计上就固化了传输方向,TX DMA 方向就是内存到外设,RX DMA 就是外设到内存,所以也无需设置传输方向
  3. 对于 TX DMA 来说,需要设置源地址,即 skb->data 的物理地址,我们的目的就是将这个包通过网卡发送出去。目的地址不用设,是网卡芯片内部的内存,网卡自己会处理,我们 host 端无需操心,也无法干预。同样的,对于 RX DMA 来说,需要设置目的地址,也即 skb->data 的物理地址,我们的目的就是将网卡芯片收到的数据包存入 skb,供后续走网络协议栈。
  4. 对于网卡的 DMA 来说,其源地址、目的地址肯定是自增的,因为我们需要传输一整包数据,而不是其中的某个字节,所以地址自增无需设置,属性固定为自增。
  5. 位宽也无需设置,应该是字对齐(32bit)。
  6. 设置传输数据长度
  7. 传输模式固定为单次,无需设置。
  8. 优先级有些网卡可以设置 RX 优先级高于 TX,通常优先级是一样的,无需设置
  9. 开始传输

总结,对于 TX DMA 来讲,只要设置源地址,传输数据长度,然后开始传输就可以了。

DMA 描述符列表

有一个问题需要考虑,对于 TX DMA 我们需要设置源地址,也就是 skb->data 的物理地址,不过数据包往往不止一个,有时同时需要发送若干个数据包,那我们如何设置源地址呢?
最容易想到的方案就是,一次设置一个,发送一个,再设置下一个。很显然,这种方式开销很大,因为网卡端每发送完一个数据包就需要告知 host 端完成事件,host 端才能进行下一包数据的传输设置。这样网卡芯片、host 端 CPU 都很累。
另一种方案是,一次性设置很多个源地址(比方说 512 个)到网卡芯片,网卡芯片全部传输完成后告知 host 端,这样效率会比较高。不过,除了源地址外,还需要设置传输数据长度。另外,可能还需要设置一些额外的信息给网卡芯片。所以在此基础上,舍弃设置源地址,而是设置描述符地址(描述符可以承载更多信息);并且舍弃一次性设置多个地址,而是设置一个列表(DMA 描述符列表)的首地址

案例分析

硬件:OrangePi PC
软件:Linux 5.10.92
网卡:stmmac(TX 方向)

设置 TX 描述符列表首地址

在这里插入图片描述

设置传输数据、启动传输

在这里插入图片描述

整体框图

请添加图片描述

链表

描述符中的 des3 存储下一个元素的地址,这样构成了一个链表,网卡芯片通过描述符首地址,可以依次遍历链表中的每一个元素,DMA 数据到网卡芯片,然后发送。
dma_tx 是虚拟地址,也就是 CPU 角度看到的链表首地址;dma_tx_phy 是物理地址,也就是网卡芯片角度看到的链表首地址。它俩就像真人和影子一样,指代同一事物。CPU 对 dma_tx 链表内容的更改,网卡芯片可以通过 dma_tx_phy 完全读取到,反之亦然。

总结

网卡芯片 TX 描述符列表寄存器中存储了 dma_tx_phy 地址, 每当 Trigger 一次 TX DMA 传输时,网卡芯片就开始读取这个 list 的数据,依次将链表中的每个元素读走发送。

附录

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/845068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring Cloud 】基于微服务架构的智慧工地监管平台源码带APP

智慧工地监管平台是一种利用物联网、云计算、大数据等技术手段实现工地信息化管理的解决方案。它通过数据采集、分析和应用,在实时监控、风险预警、资源调度等方面为工地管理者提供了全方位的支持,提高了工地管理的效率和质量。智慧监管平台还基于“云端…

Detector定位算法在FPGA中的实现——section1 原理推导

关于算法在FPGA中的实现,本次利用业余的时间推出一个系列章节,专门记录从算法的推导、Matlab的实现、FPGA的移植开发与仿真做一次完整的FPGA算法开发,在此做一下相关的记录和总结,做到温故知新。 这里以Detector在Global Coordina…

C++11 新特性 ---- 模板的优化

C11 模板机制:① 函数模板② 类模板模板的使用:① 范围:模板的声明或定义只能在全局或类范围进行,不可以在局部范围(如函数)② 目的:为了能够编写与类型无关的代码函数模板:- 格式:t…

Glass指纹识别工具,多线程Web指纹识别工具-Chunsou

Glass指纹识别工具,多线程Web指纹识别工具-Chunsou。 Glass指纹识别工具 Glass一款针对资产列表的快速指纹识别工具,通过调用Fofa/ZoomEye/Shodan/360等api接口快速查询资产信息并识别重点资产的指纹,也可针对IP/IP段或资产列表进行快速的指…

chrome插件开发实例05-拦截页面请求

目录 功能 演示 源代码下载 manifest.json devtools.html devtools.js background.js 功能 拦截任意打开页面的请求信息,包括:URL,参数,请求方式method, 返回status,返回体大小,返回原始内容 演示 源…

【工程实践】解决Synonyms无法下载词向量文件

1.前言 使用EDA(Easy Data Augmentation)做数据增强时,需要借助Synonyms库,完成同义词的提取。 Synonyms 是一个中文近义词工具包,它可用于如文本对齐、推荐算法、相似度计算、语义偏移、关键字提取、概念提取、自动摘要、搜索引擎等很多自然…

FFmpeg常见命令行(三):FFmpeg转码

前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个, 对应的要学习的内容是:如何使…

移动硬盘不显示盘符简单处理方法

通常情况下,将移动硬盘连接到电脑后会被赋予一个特定的盘符,以便用户可以访问和操作其中的文件和文件夹。然而,如果移动硬盘不显示盘符,意味着操作系统无法根据该硬盘的文件系统和存储信息识别出其所对应的盘符,这将导…

[LeetCode - Python]167.两数之和 II (Medium);125. 验证回文串(Easy)

1.题目: 167.两数之和 II (Medium) 1.代码: class Solution:def twoSum(self, numbers: List[int], target: int) -> List[int]:#由于数组是已按非递减顺序排列,因此可以对撞双指针;le , ri 0 , len…

JWT的使用

文章目录 前言一、在yml文件中配置参数二、创建JwtUtil.java三、创建JwtProperties.java四、创建JwtClaimsConstant.java五、创建JwtTokenAdminInterceptor.java六、注册到WebMvcConfiguration1.4.3 ThreadLocal 前言 一、在yml文件中配置参数 sky:jwt:# 设置jwt签名加密时使…

骨传导耳机是怎么工作的?骨传导耳机是智商税产品吗?

骨传导耳机是怎么工作的?骨传导耳机是智商税产品吗? 骨传导耳机是怎么工作的? 骨传导耳机的传声方式跟传统耳机完全不同,骨传导耳机就是利用骨传导的原理是直接将人体骨结构作为传声介质,通过颅骨来进行声音传播的&am…

物联网与5G引领智慧城市时代的到来

智慧城市需要依赖于多种技术,这些技术的应用将城市转变为高效、智能、可持续发展的现代化城市。智慧城市是基于信息技术、物联网和大数据等先进技术的融合,旨在提升城市的运行效率、资源利用效率和居民生活质量。以下是智慧城市需要依赖的主要技术&#…

GD32F103VE深度睡眠与唤醒

GD32F103VE深度睡眠与唤醒,执行WFI指令或执行1次WFE指令,命令CPU进入深度睡眠模式。 电源管理单元有3种省电模式:睡眠模式,深度睡眠模式和待机模式; 进入深度睡眠的步骤如下: 1,配置SLEEPDEEP1 2,配置STBMOD0 3,执行W…

[K8S:命令执行:权限异常:解决篇]:通过更新kubeconfig配置相关信息

文章目录 一:场景复现:1.1:关键信息:1.2:全异常日志输出: 二:解决流程:2.1:更新 kubeconfig:2.1.1:执行命令: 2.2:再次执行…

Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP

一对一音视频通话使用场景 一对一音视频通话都需要稳定、清晰和流畅,以确保良好的用户体验,常用的使用场景如下: 社交应用:社交应用是一种常见的使用场景,用户可以通过音视频通话进行面对面的交流;在线教…

Android google admob Timeout for show call succeed 问题解决

项目场景: 项目中需要接入 google admob sdk 实现广告商业化 问题描述 在接入Institial ad 时,onAdLoaded 成功回调,但是onAdFailedToShowFullScreenContent 也回调了错误信息 “Timeout for show call succeed.” InterstitialAd.load(act…

算法刷题之路

刷题历程 - - - 基本数据结构 - - -数组、字符串、堆、栈、队列、链表739.每日温度(栈)155. 最小栈20. 有效的括号581.最短无序连续数组169. 多数元素(数组)136.只出现一次的数字128.最长连续序列560.和为k的子数组(组…

yolo使用说明

yolo-v5代码 一、环境准备 yolo-v5更像是一个工程 算法和v4差不多,只是细节有所不同 拉取代码 环境要求 因为v6用到了torch1.6中的混合精度 二、数据准备 训练使用的是coco数据集 coco数据集很大,训练起来费时间,可以直接用自己数据集来做…

三、axios+vue

Axios 导入&#xff1a; <script src"https://unpkg.com/axios/dist/axios.min.js"></script> 基础语法&#xff1a; axios.get(?keyvalue&key2value2).then(function(response){},function(err){} axios.post(地址&#xff0c;{key:value,key2…

IDEA常用插件介绍

1.CodeGlance&#xff08;CodeGlance Pro&#xff09; 安装后&#xff0c;重新启动编译器即可。 CodeGlance是一款非常好用的代码地图插件&#xff0c;可以在代码编辑区的右侧生成一个竖向可拖动的代码缩略区&#xff0c;可以快速定位代码的同时&#xff0c;并且提供放大镜功能…