DMA方式,Direct Memory Access,也称为成组
数据传送方式,有时也称为直接内存操作。DMA方式在数据传送过程中,没有保存现场、
恢复现场之类的工作。
工作原理
原理
一个设备接口试图通过总线直接向另一个设备发送数据(一般是大批量的数据),它会先向
CPU发送
DMA请求信号。外设通过DMA的一种专门
接口电路――
DMA控制器(DMAC),向CPU提出接管总线
控制权的总线请求,CPU收到该信号后,在当前的
总线周期结束后,会按DMA信号的
优先级和提出DMA请求的先后顺序响应DMA信号。CPU对某个设备接口响应DMA请求时,会让出总线控制权。于是在DMA控制器的管理下,外设和
存储器直接进行
数据交换,而不需CPU干预。
数据传送完毕后,设备接口会向CPU发送DMA结束信号,交还总线控制权。
DMA方式的主要优点是速度快。
基本操作
实现DMA传送的基本操作如下:
1、外设可通过
DMA控制器向CPU发出DMA请求;
2、CPU响应DMA请求,系统转变为DMA工作方式,并把总线控制权交给DMA控制器;
3、由DMA控制器发送
存储器地址,并决定传送
数据块的长度;
4、执行DMA传送;
5、DMA操作结束,并把总线控制权交还CPU。
用途
DMA方式主要适用于一些高速的
I/O设备。这些设备传输字节或字的速度非常快。对于这类高速I/O设备,如果用输入输出指令或采用中断的方法来传输字节信息,会大量占用CPU的时间,同时也容易造成数据的丢失。而DMA方式能使I/O设备直接和
存储器进行成批数据的快速传送。
这些寄存器在信息传送之前需要进行初始化设置。即在输入输出程序中用
汇编语言指令对各个寄存器写入初始化控制字。
方式特点
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%,但是用户会觉得运行部分程序时系统变得相当的缓慢。主要原因就是在运行这些
应用程序(特别是一些大型软件),操作系统也需要从系统总线传输大量数据;故造成过长的
等待时间。
传送方式
DMA传送方式有3种:单元传送方式、块传送方式和on-the-fly传送方式。与外部DMA请求/应答协议不同的是,DMA传送方式定义了每次传送读/写的单元数,如表所示。
(1)单元传送方式(单字节传送方式)
单元传送方式意味着每个DMA请求对应一对DMA读/
写周期,即1个单元读,然后1个单元写。
(2)块传送方式(连续传送方式)
块传送方式意味着在连续4个字的DMA写周期前有连续的4个字的DMA读周期,即4个字突发读,然后4个字突发写,因此传输的数据个数应该是16字节的倍数。
如果传送大小或者DMA
计数值不是16的倍数,则DMA将不能完整地传送完数据。假设要传送的数据为50个字节,则3*16=48字节,会导致2个字节不能被传送,DMA在传送48个字节后停止。所以,选择DMA块传送方式时,一定要注意这一点。
(3)on-the-fly传送方式(请求传送方式)
在on-the-fly传送方式下DMA读/写可以同时进行。DMA
应答信号通知
外部设备去读或者写。同时,
存储控制器将产生与读/写相关的
控制信号给
外部存储器。如果外部设备能够支持on-the-fly传送方式,将会使得外设的
数据传输速率大大地增加。
停止CPU访问内存
当
外围设备要求传送一批数据时,由
DMA控制器发一个停止信号给CPU,要求CPU放弃对
地址总线、
数据总线和有关
控制总线的使用权。DMA控制器获得总线控制权以后,开始进行
数据传送。在一批数据传送完毕后,DMA控制器通知CPU可以使用内存,并把总线控制权交还给CPU。在这种DMA传送过程 中,CPU基本处于
不工作状态或者说保持状态。
优点:控制简单,它适用于
数据传输率很高的设备进行
成组传送。
缺点:在
DMA控制器访内阶段,内存的效能没有充分发挥,相当一部分内存工作周期是空闲的。这是因为,外围设备传送两个数据之间的间隔一般总是大于内存
存储周期,即使高速
I/O设备也是如此。
当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设备
读写周期大于内存
存储周期的情况。
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传送来讲效率是很高的。
这种传送方式又称为“透明的DMA”方式,其来由是这种DMA传送对CPU来说,如同透明的玻璃一般,没有任何感觉或影响。在透明的DMA方式下工作,CPU既不停止
主程序的运行,也不进入等待状态,是一种高效率的工作方式。当然,相应的硬件逻辑也就更加复杂。
工作过程
预处理阶段
测试设备状态;向
DMA控制器的设备
地址寄存器中送入设备号,并
启动设备;向
主存地址计数器中送入欲交换数据的主存起始地址;向
字计数器中送入欲交换的数据个数 。
外部设备准备好发送的数据(输入)或上次接收的数据已处理完毕(输出)时,将通知
DMA控制器发出DMA请求,申请主存总线。
数据传送
输入操作
①.首先从外部设备读入一个字(设每字16位)到DMA
数据缓冲寄存器IODR中(如果设备是面向字节的,一次读入一个字节,需要将两个字节装配成一个字)。
②.
外部设备发
选通脉冲,使
DMA控制器中的DMA请求标志触发器置“1”。
③.DMA控制器向CPU发出总线请求信号(HOLD)。
④.CPU在完成了现行
机器周期后,即响应DMA请求,发出总线允许信号(
HLDA),并由
DMA控制器发出DMA响应信号,使DMA请求标记触发器复位。此时,由DMA控制器接管
系统总线。
⑤.将DMA控制器中主存
地址寄存器中的主存地址送
地址总线,
⑧.将DMA
地址寄存器的内容加1,从而得到下一个地址,字计数器减1。
⑨.判断字计数器的值是否为“0”。若不为“0”,说明
数据块没有传送完毕,返回⑤,传送下一个数据;若为“0”,说明数据块已经传送完毕,则向CPU申请
中断处理。
输出操作
①.当DMA
数据缓冲寄存器已将输出数据送至
I/O设备后,表示数据缓冲寄存器为“空”;
②.外部设备发选通脉冲,使DMA控制器中的DMA请求标志触发器置“1”;
③.DMA控制器向CPU发出总线请求信号(HOLD);
④.CPU在完成了现行机器周期后,即响应DMA请求,发出总线允许信号(HLDA),并由DMA控制器发出DMA响应信号,使DMA请求标记触发器复位。此时,由DMA控制器接管系统总线;
⑤.将
DMA控制器中主存地址寄存器中的主存地址送地址总线,在读/写控制信号线上发出读命令;
⑥.主存将相应地址单元的内容通过
数据总线读入到DMA
数据缓冲寄存器中;
⑧.将DMA地址寄存器的内容加1,从而得到下一个地址,字计数器减1;
⑨.判断字计数器的值是否为“0”。若不为“0”,说明数据块没有传送完毕,返回到⑤,传送下一个数据;若为“0”,说明数据块已经传送完毕,则向CPU申请中断处理。
校验送入主存的数据是否正确。
测试在传送过程中是否发生错误。