网卡内部的 DMA

前言

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.rhkb.cn/news/80046.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04-5_Qt 5.9 C++开发指南_QComboBox和QPlainTextEdit

文章目录 1. 实例功能概述2. 源码2.1 可视化UI设计2.2 widget.h2.3 widget.cpp 1. 实例功能概述 QComboBox 是下拉列表框组件类,它提供一个下拉列表供用户选择,也可以直接当作一个QLineEdit 用作输入。OComboBox 除了显示可见下拉列表外,每个…

冠达管理投资前瞻:三星加码机器人领域 大信创建设提速

上星期五,沪指高开高走,盘中一度涨超1%打破3300点,但随后涨幅收窄;深成指、创业板指亦强势震动。截至收盘,沪指涨0.23%报3288.08点,深成指涨0.67%报11238.06点,创业板指涨0.95%报2263.37点&…

【HCIP】OSPF综合实验

题目: 配置: R1 //ip分配 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 172.16.0.1 27 [r1-GigabitEthernet0/0/0]q [r1]int lo [r1]int LoopBack 0 [r1-LoopBack0]ip add 172.16.1.1 24//配置缺省 [r1]ip route-static 0.0.0.0 0 172.16.0.3 //启动…

系统架构设计师-软件架构设计(7)

目录 大型网站系统架构演化 一、第一阶段:单体架构 到 第二阶段:垂直架构 二、第三阶段:使用缓存改善网站性能 1、缓存与数据库的数据一致性问题 2、缓存技术对比【MemCache与Redis】 3、Redis分布式存储方案 4、Redis集群切片的常见方式 …

日撸java_day60

文章目录 小结k近邻算法(knn)定义算法流程距离度量k值的选择总结 聚类定义k-means聚类步骤k-means算法小结 小结 k近邻算法(knn) 定义 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别…

VLAN原理+配置

目录 一, 以太网二层交换机 二,三层架构: 三,VLAN配置思路 1.创建vlan 2.接口划入vlan 3.trunk干道 4.vlan间路由器 5.DHCP池塘配置 四,华为VLAN部分的接口模式讲解: 五,华为VLAN部分的…

《Zookeeper》从零开始学Zookeeper源码(三)之服务器的启动过程

目录 QuorumPeerMain QuorumPeerMain 在搭建本地的源码环境中,启动zookeeper服务端的入口为QuorumPeerMain,先看下它的类结构: 它本身只有一个属性quorumPeer,它代表了zookeeper集群中的一台机器,它会不断检测当前服…

docker镜像push到仓库

镜像可以很方便直接 push 到 docker 的公共仓库或阿里云仓库 一、Dockerpush指定仓库是什么? Dockerpush是Docker的一个命令,用于将本地的Docker镜像推送到Docker官方公共仓库或用户私人仓库。而指定仓库则是将这个Docker镜像推送到指定的仓库中。 通过D…

Visual Studio Code中对打开的脚本格式统一

什么是Language Server Protocol (LSP)? Language Server Protocol(语言服务器协议,简称LSP)是微软在2016年提出的一套统一的通讯协议方案。LSP定义了一套编辑器或者IDE与语言服务器(Language Server)之间使用的协议&…

Vue3 实现产品图片放大器

Vue3 实现类似淘宝、京东产品详情图片放大器功能 环境&#xff1a;vue3tsvite 1.创建picShow.vue组件 <script lang"ts" setup> import {ref, computed} from vue import {useMouseInElement} from vueuse/core/*获取父组件的传值*/ defineProps<{images:…

分布式应用:ELK企业级日志分析系统

目录 一、理论 1.ELK 2.ELK场景 3.完整日志系统基本特征 4.ELK 的工作原理 5.ELK集群准备 6.Elasticsearch部署&#xff08;在Node1、Node2节点上操作&#xff09; 7.Logstash 部署&#xff08;在 Apache 节点上操作&#xff09; 8.Kiabana 部署&#xff08;在 Node1 节点…

什么是全局代理,手机怎么设置全局代理

目录 什么是全局代理 全局代理的优缺点 优点 缺点 手机怎么设置全局代理 注意事项 总结 在计算机网络和信息安全中&#xff0c;全局代理是一种常用的技术手段&#xff0c;用于将网络流量通过代理服务器进行转发和处理。本文将介绍什么是全局代理&#xff0c;探讨全局代理…

使用kubeadm快速部署一个k8s集群

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署&#xff08;一&#xff09;主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署&#xff08;二&#xff09;ETCD集群部署 Kubernetes高可用集群二进制部署&#xff08;三&#xff09;部署…

2020年12月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题 第1题 执行语句print(1010.0)的结果为&#xff1f; A&#xff1a;10 B&#xff1a;10.0 C&#xff1a;True D&#xff1a;False 正确的答案是 C&#xff1a;True。 解析&#xff1a;在Python中&#xff0c;比较运算符 “” 用于比较两个值是否相等。在这个特…

2023 电赛 E 题 激光笔识别有误--使用K210/Openmv/树莓派/Jetson nano实现激光笔在黑色区域的目标检测

1. 引言 1.1 激光笔在黑色区域目标检测的背景介绍 在许多应用领域&#xff0c;如机器人导航、智能家居和自动驾驶等&#xff0c;目标检测技术的需求日益增加。本博客将聚焦于使用K210芯片实现激光笔在黑色区域的目标检测。 激光笔在黑色区域目标检测是一个有趣且具有挑战性的…

20天学会rust(一)和rust say hi

关注我&#xff0c;学习Rust不迷路 工欲善其事&#xff0c;必先利其器。第一节我们先来配置rust需要的环境和安装趁手的工具&#xff0c;然后写一个简单的小程序。 安装 Rust环境 Rust 官方有提供一个叫做 rustup 的工具&#xff0c;专门用于 rust 版本的管理&#xff0c;网…

Linux——设备树

目录 一、Linux 设备树的由来 二、Linux设备树的目的 1.平台识别 2.实时配置 3.设备植入 三、Linux 设备树的使用 1.基本数据格式 2.设备树实例解析 四、使用设备树的LED 驱动 五、习题 一、Linux 设备树的由来 在 Linux 内核源码的ARM 体系结构引入设备树之前&#x…

Android学习之路(1) 文本设置

Android学习之路(1) 文本 一、设置文本内容 设置文本内容的两种方式&#xff1a; 一种是在XML文件中通过属性android:text设置文本代码如下 <TextViewandroid:id"id/tv_hello"android:layout_width"wrap_content"android:layout_height"wrap_c…

蓝桥杯上岸每日N题 第七期(小猫爬山)!!!

蓝桥杯上岸每日N题 第七期(小猫爬山)&#xff01;&#xff01;&#xff01; 同步收录 &#x1f447; 蓝桥杯上岸必背&#xff01;&#xff01;&#xff01;(第四期DFS) 大家好 我是寸铁&#x1f4aa; 冲刺蓝桥杯省一模板大全来啦 &#x1f525; 蓝桥杯4月8号就要开始了 &a…

python -- 如何将nc数据中的时间转换为北京时区的时间

在nc数据处理时&#xff0c;以ERA5的小时数据为例&#xff0c;使用的时间为UTC&#xff0c;不同时区存在时间上的差异&#xff0c;如何将其转化为北京当地的时间呢? https://confluence.ecmwf.int/display/CKB/ERA5%3Adatadocumentation #!/usr/bin/env python3 # -*- cod…