DMA简介

Posted east1203

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DMA简介相关的知识,希望对你有一定的参考价值。

 

突然发现一个很好的课程,里面有将DMA,非常好,花了69买下来了,DMA的链接如下:
https://time.geekbang.org/column/article/118657

注意:

个人整理,有误无责。

 

0. CPU控制的数据传输方式介绍

由CPU控制的数据传输方式有两种:查询、中断。

0.1 查询方式

  查询方式是由程序控制的,如果CPU中执行的程序需要进行数据传输,CPU查询外设状态,如果外设准备好,那么进行数据传输。

0.2 中断方式

  当外设需要与CPU进行数据交换的时候,外设向CPU发出中断请求,CPU中断当前执行的程序,相应外设的数据传输请求。当外设的数据传输结束后,CPU继续执行被中断的程序.

上面两种方式,数据都需经过CPU来传递,下面介绍DMA控制的数据传递。

1. DMA介绍

  DMA方式,Direct Memory Access,也称为成组数据传送方式,有时也称为直接内存操作。DMA方式在数据传送过程中,没有保存现场、恢复现场之类的工作。

  由于CPU根本不参加传送操作,因此就省去了CPU取指令、取数、送数等操作。内存地址修改、传送字 个数的计数等等,也不是由软件实现,而是用硬件线路直接实现的。所以DMA方式能满足高速I/O设备的要求,也有利于CPU效率的发挥。(参考自百度)

 

2. 工作原理

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

  一个设备如果需要直接通过总线与内存进行数据传送,设备先通过DMA向CPU发送DMA请求(DMA接管总线),CPU接到请求信号后,在当前时钟周期结束后,CPU会根据DMA信号的优先级和请求的先后顺序来相应DMA请求。CPU相应DAM请求后,会让出总线的控制权,让DMA来控制总线。在DMA的管理下,外设和内存直接进行数据交换,不需要CPU的干预,数据传输结束之后,DMA将总线的控制权交给CPU。

 

3. DMA传输的特点

(来自百度百科)

  DMA 是所有现代电脑的重要特色,他允许不同速度的硬件装置来沟通,而不需要依于 CPU 的大量中断负载。否则,CPU 需要从 来源 把每一片段的资料复制到暂存器,然后把他们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。

  DMA 传输将一个内存区从一个装置复制到另外一个, CPU 初始化这个传输动作,传输动作本身是由 DMA控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存去。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能嵌入式系统算法和网络是很重要的。

  举个例子,PC ISA DMA控制器拥有 8 个 DMA 通道,其中的 7 个通道是可以让 PC 的 CPU 所利用。每一个 DMA 通道有一个 16位元 位址暂存器和一个 16 位元计数暂存器。要初始化资料传输时,装置驱动程式一起设定 DMA 通道的位址和计数暂存器,以及资料传输的方向,读取或写入。然后指示 DMA 硬件开始这个传输动作。当传输结束的时候,装置就会以中断的方式通知 CPU。

  但是,DMA传输方式只是减轻了CPU的工作负担;系统总线仍然被占用。特别是在传输大容量文件时,CPU的占用率可能不到10%,但是用户会觉得运行部分程序时系统变得相当的缓慢。主要原因就是在运行这些应用程序(特别是一些大型软件),操作系统也需要从系统总线传输大量数据;故造成过长的等待时间。

 

4. 基本操作

  1. 外设通过DMAC向CPU发送DMA请求

  2. CPU相应DMA请求,DMA获得总线的控制权

  3. 由DMAC发送存储器的地址,并决定发送数据块的长度。

  4. 执行DMA传输。

  5. DMA操作结束,把总线的控制权交还给CPU。

5. 总线控制权问题

在DMA控制总线进行数据传输的时候,CPU是不占用总线的,如果此时其他外设或者程序需要CPU做其他一些事情怎么办?这就涉及到总线使用权的问题。

5.1 停止CPU访问内存

当外设请求DMA控制发送一段数据的时候,CPU放弃对总线的控制权,直到这一组数据发送完,CPU再接管总线。

优点:控制简单

缺点:在DMA访存阶段,会浪费一些内存周期,这是因为内存的存储周期一般是小于IO设备发送两个数据的时间间隔。

5.2 周期挪用

(来源于百度百科)

  当I/O设备没有DMA请求时,CPU按程序要求访问内存;一旦I/O设备有DMA请求,则由I/O设备挪用一个或几个内存周期。

I/O设备要求DMA传送时可能遇到两种情况:

  (1)此时CPU不需要访内,如CPU正在执行乘法指令。由于乘法指令执行时间较长,此时I/O访内与CPU访内没有冲突,即I/O设备挪用一二个内存周期对CPU执行程序没有任何影响。

  (2)I/O设备要求访内时CPU也要求访内,这就产生了访内冲突,在这种情况下I/O设备访内优先,因为I/O访内有时间要求,前一个I/O数据必须在下一个访内请求到来之前存取完毕。显然,在这种情况下I/O设备挪用一二个内存周期,意味着CPU延缓了对指令的执行,或者更明确地说,在CPU执行访内指令的过程中插入DMA请求,挪用了一二个内存周期。

  与停止CPU访内的DMA方法比较,周期挪用的方法既实现了I/O传送,又较好地发挥了内存和CPU的效率,是一种广泛采用的方法。但是I/O设备每一次周期挪用都有申请总线控制权、建立总线控制权和归还总线控制权的过程,所以传送一个字对内存来说要占用一个周期,但对DMA控制器来说一般要2—5个 内存周期(视逻辑线路的延迟而定)。因此,周期挪用的方法适用于I/O设备读写周期大于内存存储周期的情况。

5.3 DMA与CPU交替访内

  如果CPU的工作周期比内存存取周期长很多,此时采用交替访内的方法可以使DMA传送和CPU同时发挥最高的效率。假设CPU工作周期为 1.2μs,内存存取周期小于0.6μs,那么一个CPU周期可分为C1和C2两个分周期,其中C1供DMA控制器访内,C2专供CPU访内。

  这种方式不需要总线使用权的申请、建立和归还过程,总线使用权是通过C1和C2分时进行的。CPU和DMA控制器各自有自己的访内地址寄存器、数据寄存 器和读/写信号等控制寄存器。在C1周期中,如果DMA控制器有访内请求,可将地址、数据等信号送到总线上。在C2周期中,如CPU有访内请求,同样传送 地址、数据等信号。事实上,对于总线,这是用C1,C2控制的一个多路转换器,这种总线控制权的转移几乎不需要什么时间,所以对DMA传送来讲效率是很高的。

6. 工作过程

DMA的工作过程主要分为三步:预处理阶段、数据传送、传送后处理。

6.1 预处理阶段

  测试设备状态;向DMA控制器的设备地址寄存器中送入设备号,并启动设备;向主存地址计数器中送入欲交换数据的主存起始地址;向字计数器中送入欲交换的数据个数 。外部设备准备好发送的数据(输入)或上次接收的数据已处理完毕(输出)时,将通知DMA控制器发出DMA请求,申请主存总线。

6.2 数据传送

  DMA的数据传输可以以单字节(或字)为基本单位,对于以数据块为单位的传送(如银盘),DMA占用总线后的数据输入和输出操作都是通过循环来实现。需要特别之处的是,这一循环也是由DMA控制器(而不是通过CPU执行程序)实现的,即数据传送阶段是完全由DMA(硬件)来控制的。

6.4 处理

  DMA控制器向CPU发送中断请求,CPU执行中断服务程序做DMA结束处理,包括检验送入主存的数据是否正确,测试传送过程中是否出错(错误则转入诊断程序)和决定是否继续使用DMA传送其他数据块等。

7. 为什么DMA传输速度快

  外设与计算机内存之间的信息交换,可通过程序查询方式和中断方式进行。这两种方式都是在CPU的控制下,通过CPU执行指令来完成的。数据传送方向为外设→CPU→内存。这两种方式每传送一个字节都需要耗用较长时间。在程序查询方式时,CPU要反复测试外设状态,在外设未准备好时,CPU就处于等待状态,直到外设准备好,才进行数据传送。在中断方式下,每实现一次数据传送,CPU都要进行转入中断服务子程序、保护断点、保护现场、恢复现场、返回主程序等操作。显然对于高速的I/O设备以及大量数据交换的场合(如软、硬磁盘等),这两种传送方式就不能满足速度的要求了。对于这些高速外设,如果传送速度太慢,不仅降低传送效率,还会造成数据丢失,导致传送出错。 为此,提出了DMA(直接存储器存取)传输方式。这种传送方式是不经过CPU干预,直接在外设与内存储器之间进行数据传送的方式。实现DMA传送,需要一个专用硬件DMA控制器(DMAC),在DMA传送期间,CPU要让出对系统总线的控制权,交给DMA控制。总线在DMA的控制下,数据直接在存储器和外设之间传送,而不经过CPU干预,其传送速度大大提高,可接近于存储器的最快存取速度。这种传送方式适用于图像显示、磁盘存取、磁盘间数据传送和高速的数据采集等系统。

参考:

DMA之理解

百度百科——DMA

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于DMA简介的主要内容,如果未能解决你的问题,请参考以下文章

Linux内存从0到1学习笔记(8.6 DMA-BUF简介)

Linux内存从0到1学习笔记(8.6 DMA-BUF简介)

SylixOS DMA子系统之一

STM32DMA

STM32之DMA

STM32DMA原理,配置步骤超详细,一文搞懂DMA