DMA传送方式
. r/ L3 [6 a! ~4 \5 Z4 x9 M
1.DMA传送方式的提出
4 a$ W& v9 D( s6 T" |
前面已经介绍了两种数据传送方式,其中中断传送方式在很大程度上提高了CPU的利用率,对慢速外设尤为明显。但是中断传送方式不适用于快速数据传送。用中断传送方式每传送一个数据都要进入一次中断,在中断服务程序中真正用于数据传送的时间并不多,而是要花费较多的时间去做保护断点、保护现场、恢复现场、中断返回等辅助性工作。对于快速设备来说,这会造成数据的丢失或误操作。
% c5 f4 N, T7 S* n7 M5 b( v 中断传送方式和程序直接控制方式有一个共同点,即数据传送都是通过CPU执行指令来完成的,而cPu指令系统只支持CPU(寄存器)和存储器/外设间的数据传送。所以,如果外设要和存储器进行数据交换,也必须经过CPU寄存器中转,显然,中转浪费了时间。
6 i, |; o- [- [5 h) \! C- R Q: m 由此设想,如果在外设和存储器之间能开辟一个直接数据通道,数据传送由另外的硬件来控制,那么既加快了传送速度又减轻了CPU对I/0的负担。DMA传送方式正是受了这个启发而提出的。当然,DMA传送方式的提出还有一个更直接的原因,即中断传送方式和程序直接控制方式从速度上满足不了磁盘、磁带等高速外设与存储器之间进行数据交换的需要。这些设备的数据传送有两大特点:一是传送速率高;二是成批传送,即把设备的一批数据传到一个内存区,或将一个内存区的全部数据传送给设备,所以在数据传送的同时还伴随着内存指针的修改、传送数据个数的统计以及传送结束的判断等。用cPU执行指令方法无法满足这种传送要求。这里以早期的微机(IBM Pc/xT)和当时的硬盘为例。那时的硬盘的数据传送速率为每秒5兆位,也就是每秒62.5万字节。在IBM PC/XT中,CPU(8088)在内存与外部设备传送数据时,用执行指令方式,不包括寻址方式所用的时间,只是存储器读/写总线周期的4个时钟加上I/O读/写总线周期的5个时钟(PC/XT的I/O读/写总线周期自动插入一个时钟),当时钟为4.77 MHz时,每秒钟能传送53万字节,若再加上寻址方式和修改
" W) u' M1 x0 w5 `$ M- O地址指针等操作所需的时间,CPU根本无法完成硬盘的数据传送。
. e* G4 Q/ i( J! X1 ~ DMA的英文全称是Direct Memory Access,译为“直接存储器存取”,意指不通过CPU而直接对存储器进行访问。如果要给DMA传送方式下一个稍确切些的定义,可以是:在存储器与外设之间开辟直接的数据传送通道,数据传送由专门的硬件来控制,用一个总线周期的时间完成一个数据(字节)的传送。控制DMA数据传送的硬件称为DMA控制器(DMAC)。
1 s# W" l1 ^/ G7 ] 通过对DMA方式的扩充,有些计算机甚至还支持存储器与存储器之间、I/0设备与I/O设备之间的数据直接传输,但是用x86微处理器构成的微型计算机中,只支持I/O设备与存储器之间、特殊的存储器与存储器之间的数据直接传输,不支持I/O设备与I/O设备之间的 数据直接传输。
1 \/ y2 m0 p I! C
2.DMAC的功能
* e, L, w0 S0 I' z% x8 _9 V
DMAC要管理外设与存储器之间的数据交换必须使用总线,也必须像CPU那样,既能访问存储器,又能访问外设,所以应能发出地址信号,存储器读/写、I/O读/写等控制信号。此外,为了批传送的需要,还要能修改地址指针,判断传送是否结束等。具体说,DMAC应具有以下功能:
- h1 L$ G! P0 C6 z! @
①接收外设的DMA请求(DREQ),向CPu发总线请求(HOLD);
( Y& K& S: o, x3 M/ Q ②当cPu发出总线响应信号(HLDA)时,接管对总线的控制,进入DMA方式;
2 B7 _) ]: m, h F! @: z
③能发出地址信息,能对存储器寻址,能修改地址指针;
* |# h/ v) X5 ]3 F- A ④能发出读/写等控制信号;
4 _& o2 P- w& k ⑤能统计传送的字节数,能判断DMA传送是否结束;
6 |& N( S8 q" H% ~1 ]4 o7 R( [5 r
⑥能发出DMA结束信号。
0 E3 ^5 o0 |# e1 p% h; m& c
3.DMA传送的一般工作过程
6 a$ o5 ]/ G' o" E 图4.14所示为某输入设备使用DMA方式向存储器传送数据的接口电路。这里以它为例说明进行DMA传送的一般工作过程。
6 [/ w' A* ?* R" a
5 W- V/ s& A: @" U* n
) V6 P" }" b0 ~
/ D0 y" ~) c. v2 X6 T# `1 `7 f X; o6 I" V
①对cPu来说,DMAC首先是一个接口,cPu必须针对该输入设备将有关参数预先写到它的内部寄存器中。这些参数主要包括DMAC的传送方式(如单字节传送、成组传送等)、传送类型(有读传送、写传送等,该例应设置成写传送)、要操作(该例为写入)的存储单元的首地址以及传送的字节数等。
* ^" ?! S5 w$ H& F- }9 R ②一旦输入设备有传送要求,它将向DMAC发DMA请求(DREQ),该信号应维持到DMAC响应为止。DMAC收到请求后,向CPU发总线请求信号(HOLD),表示希望占有总线。
4 m) W# J% E# \! v4 YCPU在每一个总线周期(中断响应周期和CPU正在执行冠有LOcK前缀的指令周期除外)都要扫描总线请求,若发现有总线请求,则发出总线响应信号(HLDA),并在现行总线周期结束后暂停程序的执行,让出总线控制权,机器进入DMA总线周期。
# `- A; W1 T. h7 |1 g
③在DMA总线周期,总线由DMAC控制。DMAC将本次操作的存储单元地址送上地址总线,并发出I/O读信号(
! O6 O8 q: L1 w7 D! t
1 m. a T0 m4 \& x- L2 ]7 d)和存储器写信号(
& Z: |/ a0 W- b3 H+ v1 h: l6 H
3 l$ }0 @ s% e. S)。于是,输入设备的数据经数据总线被写入到指定的存储单元,完成了一个字节的传送。
& D" `, d. }8 u$ b# @% s
④如果是单传送,则在该总线周期结束后DMAC释放系统总线,由CPU接管后进人CPU总线周期,待外设准备好下一个数据后再重复从步骤②开始的过程。如果是数据块传送(或称成组传送),则该DMA周期后再接着开始一个新的DMA周期(即进行步骤③的操作),直至所设定字节数的数据都传送完才交还总线控制权。不管是单传送还是成组传送,在每一个DMA周期中DMAC都要修改地址指针并进行字节计数,以便为下一个DMA周期做准备。
7 ~0 C C) y* m: L
当预先设定字节数的数据都传送完,表示一次DMA传送结束,DMAC发出DMA结束信号。
% C9 k* A, D# l8 y! M P2 j+ g 从上面的传送过程可以看出,DMA方式是用一个总线周期的时间完成了外设与存储器间的一个字节的数据传送,这是目前最快的一种传送方式。由于该方式是让CPU临时让出总线周期的方法来传送数据的,所以,有时称DMA技术为周期窃取技术。
3 G5 S3 K4 A' H" b
DMAC早已集成化,和8086/8088配合使用的有8237等。在高档微机中,8237或类8237的逻辑被集成到集成度更高的多功能接口芯片中。有关8237的内容及DMA方式的具体操作过程在可编程接口一章作介绍。