DMA方式是为了在主存与外设之间实现高速、批量数据交换而设置的。DMA方式的数据传送直接依靠硬件(DMA控制器)来实现,不需要执行任何程序。
1、DMA方式
直接内存访问(DMA)是一种完全由硬件执行I/O交换的工作方式。在这种方式中,DMA控制器从CPU完全接管对总线的控制,数据交换不经过CPU,而直接在内存和I/O设备之间进行。DMA方式一般用于高速传送成组数据。DMA控制器将向内存发出地址和控制信号,修改地址,对传送的字的个数计数,并且以中断方式向CPU报告传送操作的结束。
由于CPU根本不参加传送操作,因此就省去了CPU取指令、取数、送数等操作。在数据传送过程中,没有保存现场、恢复现场之类的工作。内存地址修改、传送字个数的计数等等,也不是由软件实现,而是用硬件线路直接实现的。所以DMA方式能满足高速I/O设备的要求,也有利于CPU效率的发挥。
2、DMA方式的特点
⑴它使主存与CPU的固定联系脱钩,主存既可被CPU访问,又可被外设访问;
⑵在数据块传送时,主存地址的确定、传送数据的计数等硬件电路直接实现;
⑶主存中要开辟专用缓冲区,及时供给和接收外设的数据;
⑷DMA传送速度快,CPU和外设并行工作,提高了系统的效率。
⑸DMA在传送前要通过程序进行预处理,结束后要通过中断方式进行后处理。
3、DMA的三种工作方式
DMA技术的出现,使得外围设备可以通过DMA控制器直接访问内存,与此同时,CPU可以继续执行程序。DMA控制器与CPU分时使用内存通常采用以下三种方法:
(1)停止CPU访问内存
当外围设备要求传送一批数据时,由DMA控制器发一个停止信号给CPU,要求CPU放弃对地址总线、数据总线和有关控制总线的使用权。DMA控制器获得总线控制权以后,开始进行数据传送。在一批数据传送完毕后,DMA控制器通知CPU可以使用内存,并把总线控制权交还给CPU。在这种DMA传送过程中,CPU基本处于不工作状态或者说保持状态。
这种传送方式的时间图如下:

(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请求,挪用了一二个内存周期。
这种传送方式的时间图如下:

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

1、DMA接口的功能
在DMA传送过程中,DMA控制器将接管CPU的地址总线、数据总线和控制总线,CPU的主存控制信号被禁止使用。而当DMA传送结束后,将恢复CPU的一切权利并开始执行其它操作。由此可见,DMA控制器必须具有控制系统总线的能力,即能够像CPU一样输出地址信号,接收或发出控制信号,输入或输出数据信号。
DMA控制器在外设与主存之间直接传送数据期间,完全代替CPU进行工作,主要功能有:
(1)接受外设发出的DMA请求,并向CPU发出总线请求;
(2)CPU响应此总线请求,发出总线响应信号后,接管对总线的控制,进入DMA操作周期;
(3)确定传送数据的主存单元地址及传送长度,并能自动修改主存地址计数值和传送长度计数值;
(4)规定数据在主存与外设之间的传送方向,发出读写或其他控制信号,并执行数据传送的操作。
(5)向CPU报告DMA操作的结束。
2、DMA接口的基本组成
(1)内存地址计数器:用于存放内存中要交换的数据的地址。在DMA传送前,须通过程序将数据在内存中的起始位置(首地址)送到内存地址计数器。而当DMA传送时,每交换一次数据,将地址计数器加“1”,从而以增量方式给出内存中要交换的一批数据的地址。
(2)字计数器:用于记录传送数据块的长度(多少字数)。其内容也是在数据传送之前由程序预置,交换的字数通常以补码形式表示。在DMA传送时,每传送一个字,字计数器就加“1”,当计数器溢出即最高位产生进位时,表示这批数据传送完毕,于是引起DMA控制器向CPU发中断信号。
(3)数据缓冲寄存器: 用于暂存每次传送的数据(一个字)。当输入时,由设备(如磁盘)送往数据缓冲寄存器,再由缓冲寄存器通过数据总线送到内存。反之,输出时,由内存通过数据总线送到数据缓冲寄存器,然后再送到设备。
(4)“DMA请求”标志 每当设备准备好一个数据字后给出一个控制信号,使“DMA请求”标志置“1”。该标志置位后向“控制/状态”逻辑发出DMA请求,后者又向CPU发出总线使用权的请求(HOLD),CPU响应此请求后发回响应信号HLDA,“控制/状态”逻辑接收此信号后向CPU发总线请求,在得到CPU的响应信号,使“DMA请求”标志复位,为交换下一个字做好准备。
(5)“控制/状态”逻辑由控制和时序电路以及状态标志等组成,用于修改内存地址计数器和字计数器,指定传送类型(输入或输出),并对“DMA请求”信号和CPU响应信号进行协调和同步。
(6)中断机构当字计数器溢出时(全0),意味着一组数据交换完毕,由溢出信号触发中断机构,向CPU提出中断报告。这里的中断与上一节介绍的I/O中断所采用的技术相同,但中断的目的不同,前面是为了数据的输入或输出,而这里是为了报告一组数据传送结束。因此它们是I/O系统中不同的中断事件。
DMA接口的基本组成图如下所示:
DMA的数据块传送过程可分为三个阶段:传送前预处理;正式传送;传送后处理。
(1)预处理
由CPU执行几条输入输出指令,测试设备状态,向DMA控制器的设备地址寄存器中送入设备号并启动设备,向内存地址计数器中送入起始地址,向字计数器中送入交换的数据字个数。在这些工作完成后,CPU继续执行原来的主程序。
(2)正式传送
当外设准备好发送数据(输入)或接受数据(输出)时,它发出DMA请求,由DMA控制器向CPU发出总线使用权的请求(HOLD)。
DMA的数据传送是以数据块为基本单位进行的,因此,每次DMA控制器占用总线后,无论是数据输入操作,还是输出操作,都是通过循环来实现的。当进行输入操作时,外围设备的数据(一次一个字或一个字节)传向内存;当进行输出操作时,内存的数据传向外围设备。
(3)后处理
一旦DMA的中断请求得到响应,CPU停止主程序的执行,转去执行中断服务程序做一些DMA的结束处理工作。这些工作包括校验送入内存的数据是否正确;决定继续用DMA方式传送下去,还是结束传送;测试在传送过程中是否发生了错误等等。
其具体的流程图如下所示:

结合DMA接口的组成原理图,分别以数据输入和输出为例,来了解DMA具体传送的工作过程。
(1)DMA输入的工作过程:

(2)DMA输出的工作过程:

⑴ 中断方式是程序切换,需要保护和恢复现场;而DMA方式除了开始和结尾时,不占用CPU的任何资源。
⑵对中断请求的响应时间只能发生在每条指令执行完毕时;而对DMA请求的响应时间可以发生在每个机器周期结束时。
⑶ 中断传送过程需要CPU的干预;而DMA传送过程不需要CPU的干预,故数据传输速率非常高,适合于高速外设的成组数据传送。
⑷二者优先权不同:DMA请求的优先级高于中断请求。
⑸应用不同:中断方式具有对异常事件的处理能力,而DMA方式仅局限于完成传送数据块的I/O操作。
(6)实现方式不同:
中断主动通知,硬件、软件结合,信息交换在软件控制下完成
DMA中CPU不介入交换过程,不影响CPU的状态