首页 > 其他分享 >DMA原理与结构

DMA原理与结构

时间:2023-10-03 15:35:09浏览次数:40  
标签:DMA 数据传输 传输 寄存器 原理 数据 CPU 结构

DMA原理与结构

HIT-Orange

于 2022-02-20 15:39:15 发布

8847
收藏 99
文章标签: dma 硬件架构 硬件工程 fpga开发
版权
1.概述
DMA是Direct Memory Access的缩写,直译为直接存储器访问。它指一种允许在外部设备和存储器、存储器与存储器之间直接读写数据的高速传输操作,该传输过程既不通过CPU,也不需要CPU干预,整个数据传输操作在一个称为“DMA控制器”的控制下进行。CPU除了在数据传输开始和结束时做一些处理外,在传输过程中可以进行其它的工作。这样,在大部分时间里实现了CPU处理任务和内存数据交换的并行进行。因此,系统的整体性能被大大提高。

举例来讲,当系统需要处理外设中的256K的数据时,首先需要将数据读取至内存:
(1)在一个没有DMA控制器的系统中,假设CPU每条命令可以从外设中搬运1K的数据,那CPU需要发出256条指令才能完成。而且外设的传输速度又远远低于CPU,这就造成了CPU长时间等待数据,浪费CPU的资源。
(2)当系统存在DMA控制器时,CPU只要发出一条指令,告诉DMA控制器要读取外设哪一块数据与存放数据的内存地址。之后,DMA控制器会从外设上读取相应数据,并将数据写入内存的指定地址空间。当完成数据传输时,DMA控制器会向CPU发出一条反馈信息,告诉CPU数据已读完。这时CPU只需发送第二条指令检查内存中数据是否读取正确即可开始后续处理。整个过程CPU只发出了两条指令,就完成了256K数据的读取。所以DMA虽然没有提高数据读取速度,但可以大大减少CPU占用率,从而提高系统的效率。

 

 

可以看出DMA技术实质上是通过硬件的方式,在内存与外设之间开辟直接的数据传送通路,它的优点是数据传输速度快。但DMA方式并非对所有场景下的数据传送都有效,通常只有在没有复杂处理操作或需高速交换大量数据的场合才适用。

2.工作模式分类
DMA根据工作模式分为普通DMA(block DMA)和Scatter-gather DMA(SGDMA)。

普通的DMA进行数据传输时,要求操作的源物理地址和目标物理地址必须是连续的,这种传输模式也称为block DMA。在某些计算机体系中,如IA架构(Intel Archtecture)中,连续的存储器地址在物理上不一定是连续的,所以DMA传输要分成多次完成,block DMA控制器在完成一块物理上连续的数据传输后引发一次中断,然后CPU提供下一块数据的起始地址和数据量,block DMA控制器继续进行数据传输。重复上述过程直到所有数据传输完成。可以看出当读取的数据在物理上不连续时,block DMA模式需要触发多次中断,一定程度上降低了CPU工作效率和数据传输效率。

Scatter-gather DMA模式直译为分散聚集DMA模式,是与block DMA模式相对应的一种DMA工作模式。它使用一个链表描述物理上不连续的存储空间,然后CPU把链表首地址告诉DMA控制器。SGDMA控制器在传输完一块物理连续的数据后,不用发起中断,而是根据链表来传输下一块物理上连续的数据,直到传输完毕后再发起中断。很显然,scatter-gather DMA模式比block DMA模式效率高。

在Avaloo总线系统中,SGDMA除了与block DMA一样完成存储器映射接口之间的数据传输外还可以进行存储器映射接口与流传输接口之间的数据传输,实现批量传输工作,进一步减轻了CPU的工作量。

3.DMA模块硬件结构
DMA模块主要包括DMA控制器、主模式控制电路、从模式控制电路和数据通道FIFOs。其中主模式控制电路和从模式控制电路两部分分别负责控制DMA模块在PCIe总线的主模式和从模式下的工作状态;若是Avalon总线系统下的DMA模块,则主模式控制电路和从模式控制电路分别对应对外通信的主端口和从端口。数据缓冲通道由两个FIFO来实现,其功能是对总线端的高速信号和外设上本地低速信号进行速率匹配和缓冲。DMA模块的上述结构使得它既可以作为总线的从设备被访问,也可以在有DMA请求时,通过总线仲裁获得总线的控制权,作为主设备控制外设和内存间进行数据传输。DMA控制器并不能实现类似CPU复杂的地址处理和译码等功能,因此DMA传输的源和目的地址一般是总线全局地址。下图以Avalon 总线下的DMA模块为例说明其结构。

 

 

DMA控制器(DMAC),即直接内存存取控制器,是整个DMA模块的核心部分,由逻辑控制电路和寄存器组成。它实质上是一个与CPU相比结构较简单的处理器,也可以作为采用DMA方式进行数据传输的外设与系统总线的接口电路,它是在中断接口的基础上加上DMA结构组成的。其中,DMA逻辑控制电路控制了整个DMA的传输过程,它主要是通过一个DMA传输状态机来实现的。为实现外设与内存间直接成批交换数据,必须把数据的来源、去向和字节总数(数据长度)等信息事先通知DMAC, 所以DMAC的寄存器组应包含:源地址寄存器、目的地址寄存器、字节计数寄存器、状态寄存器、控制寄存器。下面是DMA控制器的基本结构。

 

 

(1)源地址寄存器:用于存放待读取数据的地址,此寄存器的初值是待读取数据块的首地址,每读取完一次后自加1,以便对下一个读取数据寻址;
(2)目的地址寄存器:用于存放待传送数据的地址,此寄存器的初值是待传送数据块的首地址,每读取完一次后自加1,以便为下一个写入数据提供地址;
(3)字节计数寄存器:用于存放待传输数据块的总字节数,每传输完成一个字节后,对其存储的数据减1,为0时发出DMA传输完成的标志信号,中断机构向CPU发出中断信号,也有的DMA模块的字节计数寄存器初值为数据块字节数的补码,每传输一个字节后,数据加1,发生溢出说明传输完成,产生标志信号;
(4)控制寄存器:用于CPU在初始化DMA模块时配置其工作方式;
(5)状态寄存器:保存外设的准备就绪状态,指示DMA内部的工作状态;
(6)逻辑控制电路:修改各寄存器的值,完成与CPU之间的交互工作。

4.DMA传输过程
典型的DMA数据传输过程如下:
(1)CPU通过写控制端口配置DMAC用于数据传输;
(2)当有数据需要传输时,CPU中断正在运行的程序,然后执行几条IO指令、测试内存、外设、DMA模块等的状态,然后将源地址、目的地址和传输数据字节数写入DMAC。由于这些工作消耗CPU周期较少,完成后的CPU继续刚才中断的程序,宏观上感觉不到程序运行有延迟;
(3)外设准备就绪并通知DMAC,DMAC向CPU发出HOLD信号请求占用总线。若多个DMAC同时申请,则通过硬件判断优先级;
(4)CPU响应DMAC的请求,并将总线控制权移交给DMAC;
(5)DMA模块读端口从源地址读数据,写端口向目的地址写数据,读写端口间利用FIFO缓存数据。每完成一次数据传输,字节计数寄存器的值减一,通过判断是否为0来决定是否继续传输; (6)传输完成时,DMA结束传输并向CPU发出中断请求;
(7)CPU在当前指令执行完毕后,响应DMA的中断请求,对传输的数据进行校验,测试传输过程是否出现错误。然后DMA交出总线控制权。

通过状态机的方式描述整个DMA传输过程如下:

 

 

 

5.参考文献
[1]周文刚,李慧华.信息交换中的DMA技术[J].周口师范学院学报,2002(05):56-60.
[2]吴杰,张保平.基于FPGA的PCI总线接口多通道DMA控制器的设计与实现[J].微型机与应用,2004(08):15-17.
[3]曹宗凯,胡晨,姚国良.DMA在内存间数据拷贝中的应用及其性能分析[J].电子器件,2007(01):311-313+317.
[4]梁羽.对DMA提高硬盘速度的正确认识[J].科技信息,2007(10):50.
[5]季昂,薛斌.PCI接口卡中的DMA传输模块软硬件设计[J].中国传媒大学学报(自然科学版),2008(03):65-69.DOI:10.16196/j.cnki.issn.1673-4793.2008.03.008.

部分内容根据作者理解进行创作,并参考一些文献,转载请注明出处。
————————————————
版权声明:本文为CSDN博主「HIT-Orange」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41897072/article/details/123031506

标签:DMA,数据传输,传输,寄存器,原理,数据,CPU,结构
From: https://www.cnblogs.com/zxdplay/p/17741172.html

相关文章

  • FreeRTOS 原理 --- 事件组
    简介信号量,队列。它们都具有一下特性:它们允许在阻塞态下等待单个事件的发送。它们在事件发送时可以取消阻塞的单个任务。事件组是FreeRTOS提供另一种事件传递的方法,它与队列和信号量的不同点:时间组允许任务在阻塞态下等待一个或多个事件。事件发生时,事件组将取消阻塞等待......
  • GSM7816工作原理分析(新手笔记)
    7816协议初学者刚上手7816,感觉有些吃力,但经过几天的死磕,终于也是大概了解整体的框架,所以打算记录一下理解过程。首先要明白几个大的IC卡功能,无非就是接口设备(读卡器)与卡片的通信过程所需要的几个重要功能。上电复位:在卡片接触读卡器后会自动通电,同时需要对卡片进行一次冷复位,防......
  • 【数据结构】3.跳表和散列
    1.顺序链表字典1.1字典抽象父类#pragmaonceusingnamespacestd;template<classK,classE>classdictionary{public:virtual~dictionary(){}//返回字典是否为空virtualboolempty()const=0;//返回有多少键值对virtualintsize()co......
  • 认识小程序项目的基本组成结构
    小程序代码的构成-项目结构1、了解项目的基本组成结构1、pages用于存放所有小程序的页面2、utils用来存放工具性质的模块(例如:格式化时间的自定义模块)3、app.js小程序的项目入口文件4、app.json小程序项目的全局配置文件5、app.wxss小程序项目的全局样式文件6、project.......
  • Golang struct 结构体 面向对象编程思想-抽象 理解抽象
    我们在前面去定义一个结构体时候,实际上就是把一类事物的共有的属性(字段)和行为(方法)提取出来,形成一个物理模型(模板),这种研究问题的方法称为抽象。当你将一类事物的属性和行为抽取出来之后,下一步就是将代码体现出来。下面就是模拟银行卡存款取款查询余额方式。packagemainimport"fm......
  • Linux 内存泄漏检测的基本原理
    一、mtrace分析内存泄露mtrace(memorytrace),是GNUGlibc自带的内存问题检测工具,它可以用来协助定位内存泄露问题。它的实现源码在glibc源码的malloc目录下,其基本设计原理为设计一个函数voidmtrace(),函数对libc库中的malloc/free等函数的调用进行追踪,由此来检测内存是否存在......
  • 第8期ThreadX视频教程:应用实战,将裸机工程移植到RTOS的任务划分,驱动和应用层交互,中断DM
    视频教程汇总帖:https://www.armbbs.cn/forum.php?mod=viewthread&tid=110519 这个是我们初学RTOS面临的最直接问题,很多时候,简单的RTOS机制明白了,API也会调用了,就是添加到RTOS后,总感觉那里不对劲,怎么使用才是正确姿势。针对这些问题,本期视频教程,我们ThreadX内核教程穿插一期实......
  • 智能天线阵列原理
    智能天线阵列原理并不复杂,主要涉及的知识范围是高中物理教的波的干涉。当由两个波源产生的两列波互相干涉时,有的方向两列波互相增强,而有的方向两列波正好抵消(如下图)。在波束成型中,我们有许多个波源(即天线阵列),通过仔细控制波源发射/接收的波之间的相对相位和幅度我们可以做到电磁......
  • 通过linux0.11学习操作系统原理--Apple的学习笔记
    一,前言最近在断断续续的看linux0.11的源码介绍,主要是了解linux操作系统的原理,之前已经了解了进程的切换主要是cpu上下文切换+虚拟内存切换。今天我主要看了下改开始linux启动的进程0,1,2。二,分析先回顾了之前的问题LDT和GDT的区别?   GDT用作内核态的代码和数据段,LDT用作用户进......
  • [数据结构和算法] 堆/优先队列的实现
    预备知识:完全二叉树可以用数组表示:从下标0开始存储数据:左子节点=2*父节点+1,右子节点=2*父节点+2;从下标1开始存储数据:左子结点=2*父节点,右子节点=2*父节点+1;堆:大根堆:父节点的值大于等于左右子节点的值;小根堆:父节点的值小于等于左右子节点的值;......