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