DMA (Direct Memory Access)

news2024/11/15 9:38:10

DMA(Direct Memory Access):直接存储器访问;

一、DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输

DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。

DMA的工作原理是,如果按数据块进行I/O,即需要传输大量数据时,就无须CPU的介入。

在这种情况下,我们可以让I/O设备与计算机内存进行直接数据交换。而CPU则可以去忙别的事情。这种将CPU的介入减少的I/O模式称为直接内存访问。

二、DMA中也有cpu(DMA数据传输需要使用CPU,只不过这里使用的CPU不是计算机里面所有进程共享的CPU,而是由另外一个CPU来负责数据传输。这个另外的CPU就是DMA控制器) 只不过里面的CPU可以比通用CPU简单,且价格便宜很多,它只需要能够以不慢于I/O设备的速度进行数据读写即可。其他复杂功能,如算数运算、移位、逻辑运算等功能皆可以不要。

 

DMA控制器既可以构建在设备控制器里面,也可以作为独立的实体挂在计算机主板上。而以独立形式存在的DMA控制器更为常见。使用DMA进行I/O的工作流程下所示。

 

DMA输入输出的过程如下所示: 

1)CPU对DMA进行设置,告诉其I/O的起始地址和数据长度。
2)启动DMA过程。
3)DMA进行数据传输。
4)DMA结束后发出中断。
5)CPU响应中断并处理结束事宜。

DMA控制器依生产商的不同而有很大的区别。最简单的DMA控制器在一段时间内只能处理一个I/O,即不能并发;而复杂的DMA控制器可以同时处理多个I/O,即它能够提供多个I/O通道,每个通道可以对应一个I/O设备。
 

三、DMA传输方式
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:

外设到内存
内存到外设
内存到内存
外设到外设


四、DMA传输参数
我们知道,数据传输,首先需要的是1 数据的源地址 2 数据传输位置的目标地址 ,3 传递数据多少的数据传输量 ,4 进行多少次传输的传输模式 DMA所需要的核心参数,便是这四个

当用户将参数设置好,主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,当剩余传输数据量为0时 达到传输终点,结束DMA传输 ,当然,DMA 还有循环传输模式 当到达传输终点时会重新启动DMA传输。
  
也就是说只要剩余传输数据量不是0,而且DMA是启动状态,那么就会发生数据传输。

五、DMA的主要特征
每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置;

在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推);
独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐;
支持循环的缓冲器管理;
每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求;
存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输;
闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标;
可编程的数据传输数目:最大为65535。

六、DMA的寻址能力

默认情况,内核假设外设的DMA寻址能力是32-bits,但这并不普适(比如有些外设的寻址能力是24-bits,只能访问0MB--16MB的物理地址)。正确的操作应该是在设备初始化过程中,显示的指定DMA的寻址能力,有如下三个接口可以完成该操作:

/* 流式DMA设置寻址能力 */
 int dma_set_mask(struct device *dev, u64 mask);
 /* 一致性DMA设置寻址能力 */
 int dma_set_coherent_mask(struct device *dev, u64 mask);
 /* 流式DMA与一致性DMA同时设置寻址能力(两种模式的寻址能力相同) */
 int dma_set_mask_and_coherent(struct device *dev, u64 mask);

需要强调的是,一致性DMA的寻址能力(掩码值)小于等于流式DMA的寻址能力(掩码值)

七、DMA能搬运哪些内存?

哪些内存可以使用DMA mapping framework提供的API接口呢?

  1. 通过伙伴系统分配器(buddy allocater)的接口(__get_free_page*()/kmalloc()/kmem_cache_alloc())分配的DMA buffer;
  2. 不建议vmalloc()返回的虚拟地址用于DMA buffer,因为大小超过一页(one page)时其物理地址不连续,一般来说DMA硬件要求物理地址连续,即使DMA硬件支持scatter-gether,vmalloc分配的虚拟地址与对应的物理地址没有固定的偏移,我们仍需要遍历页表才能找到其对应关系。综上所述,不建议使用vmalloc创建DMA buffer。
  3. 不建议使用内核全局变量(存储在data/text/bss段)、内核模块中的全局变量、栈地址作为DMA buffer。需要保证这些虚拟内存cacheline对齐,否则会在CPU和非一致性DMA中有cacheline共享问题(CPU写一个word,同时DMA可能在同一个cache line中写一个不同的word,导致其中的一个被覆盖)
  4. 不建议kmap()接口返回的虚拟地址用于DMA buffer,原因与vmalloc同。
  5. 块设备IO和网络buffer是可以用于DMA buffer的,这一点由块设备IO和网络子系统保证。

八、两种类型的DMA mapping:一致性DMA映射&流式DMA映射

  • 一致性DMA:在驱动初始化时mapping,在驱动shutdown时unmapping**(意味着不是一次性的,是持续性的使用该DMA映射)**。硬件需要保证外设和CPU能并行访问同一块数据,并且保证在软件无显式flush操作的情况下,CPU和外设能同步看到对方对数据的更新。一致性(consistent)可以理解为同步(synchronous)。
    • 典型的使用一致性DMA的例子:网卡DMA环形缓冲区(ring descriptors)。
    • 一致性DMA不妨碍内存屏障(memory barriers)的使用,比如设备需要先看到word0的修改,再看到word1的修改,代码可以如下:
  desc->word0 = address;
  wmb();
  desc->word1 = DESC_VALID;
  • 流式DMA:一般是需要一次DMA transfer时map,传输结束后unmap(当然也可以有dma_sync的操作,下文会详聊),硬件可以优化存取的顺序。流式(streaming)可以理解为异步(asynchronous)
    • 典型用例:网卡进行数据传输使用的DMA buffer;SCSI设备写入/读取的文件系统buffer;
    • 设计这样的接口是为了充分优化硬件的性能。

另外需要注意的是,无论是哪种类型的DMA都有对齐的限制;此外,如果系统中的cache不是DMA-coherent的,而且底层的DMA buffer不和其他数据共享cache lines,这样的系统将会有更好的性能。

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

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

相关文章

初始SpringBoot

初始SpringBoot1. SpringBoot创建和运行1.1. SpringBoot的概念1.2. SpringBoot的优点1.3. SpringBoot的创建1.3.0. 前置工作:安装插件(这是社区版需要做的工作, 专业版可以忽略)1.3.1. 社区版创建方式1.3.2. 专业版创建方式1.3.3. 网页版创建方式1.4. 项目目录介绍1.5. SpringB…

Matlab在线IDE:MATLAB Online介绍与计算定积分案例

目录1、MATLAB Online介绍功能与特点命令行窗口和编辑器窗口适用场景计费方式使用方法2、注册登录3、计算定积分1、MATLAB Online介绍 MATLAB Online是一款在线IDE(集成开发环境),允许用户在Web浏览器中运行MATLAB并使用MATLAB工具箱&#x…

网络安全:内网渗透实例,小白也能看懂内网渗透

一、前言 从 linux 打进去到域环境,到获取域控权限。全篇实操 二、外网打点 1、打开站点,很正常的一个登录界面 2、尝试登录后发现典型的 shiro 特征。 3、使用工具直接打 shiro 反序列化即可。 4、直接上冰蝎马,连接 【一>所有资源获取…

【三十天精通 Vue 3】 第四天 Vue 3的模板语法详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 模板语法概述1. Vue 3 模板语法的简介2. Vue 3 模板…

如虎添翼,强大插件让ChatGPT更加游刃有余

ChatGPT模型是当前人工智能领域中备受瞩目的存在。作为一款强大的自然语言处理模型,它具备跨时代的意义,将深刻影响我们的未来。而强大的插件不仅可以丰富ChatGPT的功能,提高其应对复杂问题的能力。还也可以解决一些常见的错误,如…

springboot打包成jar和war浅析

问题1:一个springboot项目,用mvn install打包成jar,换一台有jdk的机器就直接可以用java -jar 项目名.jar的方式运行,没任何问题,为什么这里不需要tomcat也可以运行了? 问题2:一个springboot项目…

js非常的混乱怎么学才能入门呢?

前言 ES5还是要学的喔,里面有很多重要的概念,跟ES6有着很强的关联性,大致上包括: 变量声明 ES5 使用var关键字来声明变量,而 ES6 引入了 let 和 const 关键字,用于声明块级作用域的变量和常量。这些新的关…

[图神经网络]空间关系感知关系网络(SGRN)-代码解析

!!!这篇不涉及实现,仅从官方代码了解一下输出处理的思路,有机会的话会做实现,照例放出官方代码地址和之前写的论文解读: SGRN网络github项目地址https://github.com/simblah/SGRN_torch[图神经…

利用三个云服务器,搭建MongoDB副本集模式(主从模式)

1. 下载安装mongoDB 首先我们需要在三台服务器上分别下载和安装mongoDB。 1.1. 打开服务器,创建目录 创建目录结构如下图所示:(日志文件会自动创建) 1.2. 下载mongoDB压缩包 把压缩包下载到指定目录(便于后期维护…

ChatGPT大规模封号+停止注册?最火概念会凉吗?

一、背景 这个周末,先是意大利暂时封杀ChatGPT,限制OpenAI处理本国用户信息。 接着,据韩国媒体报道,三星导入ChatGPT不到20天,便曝出机密资料外泄(涉及半导体设备测量资料、产品良率等内容,已…

微信小程序 | 秋招颗粒无收 ?快用ChatGPT做一款模拟面试小程序

Pre:效果预览 ① 选择职位进行面试 ② 根据岗位职责进行回答 一、需求背景 这两年IT互联网行业进入寒冬期,降本增效、互联网毕业、暂停校招岗位的招聘,各类裁员、缩招的情况层出不穷!对于这个市场来说,在经历了互联网…

阿里云的客服 锻炼你心性的 一种方式 !!!

阿里云的产品,非常棒,开发的同学非常棒,专家们更棒,但,一切的开始就怕一个但字,但我还的说,但,阿里云的客服,OMG ,我已经忍耐了 1年了,是在忍不住…

手麻系统源码,手术麻醉管理系统源码,维护方便,功能强大

手术麻醉管理系统源码,手麻系统源码,C# .net 桌面软件 C/S版 文末获取联系! 手术麻醉管理系统采用下拉式汉化菜单,界面友好,实用性强,设有与住院、病区、药房等系统的软件接口。 开发语言:C# …

代码随想录算法训练营第五十三天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

1143. 最长公共子序列 动规五部曲 1、确定dp数组(dp table)以及下标的含义 dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j] 2、确定递推公式 主要就是两大情况: text1[i…

vue+ts+vite+pinia+element plus+i18n国际化

第一步,安装vue-i18n(我这里版本是9.2.2) npm install vue-i18n element-plus --save 第二步,src文件夹下创建language文件夹,目录如下 第三步,定义本地中文英文 en.ts // en.ts export default {message…

UE DTCmd 插件说明

Exec CMD Exec CMD (Have Process) 在蓝图非阻塞的运行Windows命令行并输出返回值,而且可以时时监听输出内容。 可以直接运行某个程序(输入程序完整路径) 可以直接运行bat脚本,并在bat脚本里面运行你任何想做的操作。 Cmd : 需要…

花30分钟,我用ChatGPT写了一篇2000字文章(内附实操过程)

有了ChatGPT之后,于我来说,有两个十分明显的变化: 1. 人变的更懒 因为生活、工作中遇到大大小小的事情,都可以直接找ChatGPT来寻求答案。 2. 工作产出量更大 之前花一天,甚至更久才能写一篇原创内容,现…

【MySQL--04】数据类型

文章目录1.数据类型1.1数据类型分类1.2数值类型1.2.1tinyint类型1.2.2bit类型1.2.3小数类型1.2.3.1 float1.2.3.2 decimal1.3字符串类型1.3.1 char1.3.2 varchar1.3.3char和varchar的比较1.4日期和时间类型1.5 enum和set1.5.1 enum1.5.2 set1.5.3 示例1.数据类型 1.1数据类型分…

试题E:蜂巢 ——蓝桥杯第十三届省赛Java 大学A组

试题E:蜂巢 解析 很明显的一道坐标计算问题,只是通过看似比较复杂的描述而已。 题目定义了一种行走方向,大概就是一共六种行走方向,如果以o为原点,建立坐标系,那么方向0和3就是x轴。其他方向为分力即可&am…

【微信小程序】免费的高德地图api——获取天气(全过程)

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…