第四节 内存直接传送(DMA)
1、 问题的提出
中断方式较之查询方式来说,可以提高CPU的利用率和保证对外设响应的实时性,但对于高速外设(如磁盘、高速A/D等),中断方式不能满足数据传输速度的要求。因为,中断方式下,每次中断均需保存断点(返回地址)和现场(各寄存器的值,包括标志寄存器),中断返回时,要恢复断点和现场。同时,进入中断和从中断返回均使CPU指令队列被清除。所有这些原因,使得中断方式难以满足高速外设对传输速度的要求。 对于高速外设的数据传输,一种有效的方式是使用DMA方式,即:使用DMA控制器(简称DMAC,典型芯片是Intel 8237),在外设和内存之间直接进行数据块传输。这种传输由DMAC硬件完成,不需CPU的干预,因此可以达到较高的 速度,如Intel8237A(3MHz),传输速度可达1.5MB/S。
2、 DMA控制器的构成
(1) 基地址寄存器和当前地址寄存器。
(2) 字节计数器。
(3) 控制寄存器和状态寄存器。
(4)其他电路,如数据缓冲器、请求寄存器、屏蔽寄存器、读写电路等。
3、 DMA控制器的功能
① 当外设准备就绪,希望进行DMA传送时,向DMA控制器发出DMA请求信号(DRQ)。DMAC收到此信号后,向CPU发出总线请求信号(HOLD或RQ/GT)。
② CPU收到总线请求信号后,如果允许,则发出DMA响应信号(HLDA或RQ/GT)。此时,CPU便放弃对总线的控制,DMAC获得总线的控制权。(除非CPU正在执行总线封锁指令LOCK,CPU在完成当前总线操作后,会响应总线请求。区别:如果IF=1,CPU在执行完当前指令后,会响应INTR中断请求。一条指令可能含有多个总线周期)。
③ DMAC获得总线的控制权后,向地址总线发出地址信号,指出传送过程需使用的内存地址。为此,DMAC内部设有"地址寄存器"。在DMA操作过程中,每传送一字节数据,DMAC自动修改地址寄存器的值,以指向下一个内存地址。同时,DMAC获得总线的控制权后,向外设发出DMA应答信号 DACK ,该外设与内存之间进行DMA传送。
④ 在DMA传送期间,DMAC发出内存和外设的读/写信号。
⑤ 为了决定数据块传输的字节数,在DMAC内部必须有一个“字节计数器”。在开始时,由软件设置数据块的长度,在DMA传送过程中,每传送一字节,字节计数器减1,减为0时,该次DMA传输结束。
⑥ DMA过程结束时,DMAC向CPU发出结束信号(撤消HOLD请求),将总线控制权交还CPU。同时,DMAC发出EOP信号。
4、 DMA传送的方法
(1) 周期挪用。将CPU不访问存储器的总线周期挪用来进行DMA操作。
(2) 周期扩展。进行DMA传送时,使送给CPU的时钟周期加大,而送给DMAC和存储器的时钟周期不变。
(3) CPU停机。在进行DMA传送时CPU不工作。
DMA传送的方式:
(1) 块传输方式
DMAC一旦获得总线控制权,连续进行多个字节的传输,只有当“字节计数器”减为0,才释放总线。
(2)单字节传输方式
DMAC获得总线控制权后仅传送一字节就释放总线。
5、 DMAC编程 (1) DMAC和接口电路的初始化程序
为了使DMA过程能正确进行,必须使用程序对DMA控制器和接口电路进行初始化,初始化包括下列设置:
① 设置DMAC的字节计数器初值,以决定数据块的长度。
② 设置DMAC的地址寄存器初值,以确定数据传输所用的存储区首地址。
③ 设置DMAC的控制寄存器,指出数据传送方向、是否进行块传输,并启动DMA操作。
④ 设置接口电路的控制寄存器,指出数据传输方向,并启动I/O操作。
设:(INT-interface接口,CON-control register控制寄存器,“输入”指I/O->存储器,“输出”指存储器->I/O)接口状态寄存器地址INTSTAT, bit2=1---I/O设备忙
接口控制寄存器地址INTCON, bit0=1为输入,bit0=0为输出
bit2=1---启动I/O操作
DMAC控制寄存器地址DMACON
bit0=1为输入,bit0=0为输出
bit3=1,可接收DMA请求
bit6=0为字节传输模式,bit6=1为块传输模式
DMAC字节计数器地址BYTE-REG
DMAC地址寄存器地址ADD-REG
存储器->I/O的数据块传输初始化程序为:
IDLE: IN AL, INTSTAT ;读接口状态
TEST AL, 04H ;是否忙(bit2)
JNZ IDLE ;bit2=1,忙
MOV AX, COUNT ;块传输字节数
OUT BYTE_REG, AX
LEA AX, BUFFER ;块传输内存首地址
OUT ADD_REG, AX
MOV AL, DMAC ;DMAC原控制字
OR AL, 49H ;块传输、允许接收DMA请求、输入
OUT DMACON, AL
MOV AL, INTC ;接口电路的原控制字
OR AL, 05H ;输入,启动操作
OUT INTCON, AL
┆
程序对接口电路和DMAC初始化后,当接口准备就绪,向DMAC请求传输,DMAC再向CPU请求总线。当DMAC获得总线控制权后,按初始化程序规定的方式执行传输。传输过程本身不需CPU干预。在DMAC传输完成后,发出结束信号EOP ,CPU可以查询EOP信号,以便进行后续数据处理。或者把EOP信号作为中断请求信号,CPU在中断处理程序中进行后续数据处理。
6、 DMA控制器的工作特点
(1) DMAC是一个接口电路,CPU可以通过其端口地址对DMAC进行读/写操作,以便对DMAC进行初始化或查询其状态。但它与一般的接口电路有显著的不同,DMAC可以获得系统总线控制权,当其获得系统总线控制权后,能提供一系列控制信号,像CPU一样操纵外设和内存之间的数据传输。即,DMAC有两种工作状态:
从模块状态(或称被动态):作为接口电路,受CPU控制
主模块状态(或称主动态):控制系统总线
(2) DMAC控制内存和外设的数据传输方式,与CPU的方式完全不同。
CPU:
① 通过执行指令传输数据。
② 被传输的数据必须通过CPU累加器(AL/AX)中转。
DMAC:
① 通过硬件逻辑电路,用固定的顺序地址信号和读/写信号进行数据传输。
② 被传输的数据不送入DMAC内部中转,从“源”读得的数据保存在数据总线上,然后立即开始写操作,将数据写入“目的”。
正是由于DMAC的上述数据传输特点,使DMA传输可以达到很高的速度,这也是DMA(Direct Memory Access直接内存访问)的含义.