概述
DMA方式是IO接口的控制方式之一。DMA和其他控制方式相比,它拥有专门的数据通路,所 以主存和设备交换信息时,可以不经过CPU,也不需要CPU参与数据交换(程序中断需要CPU参与中断服务),那么就省去了 保护现场、恢复现场的流程。
由于DMA接口的速度很快,所以经常用于高速IO设备,因为高速IO设备如果不及时交互信息,很可能产生数据丢失。
上面所有的优势均建立在 主存和IO设备直接交换信息,不需要经过CPU这个条件之上,而当CPU和IO设备同时访问主存时,就会发生冲突。为了解决冲突,通常会采用以下几个方法:
- 停止CPU访存
- 周期挪用(又称周期窃取)
- 交替访问
停止CPU访存
假设IO设备要发送一些数据,DMA接口会向CPU发出一个停止信号,要求CPU放弃总线控制前,DMA接口获得总线控制权后,开始进行数据传送,在数据传输结束后,DMA接口通知CPU可以使用主存,并把总线使用权交给CPU。其时序图如下所示
这种方式的缺陷主要在于 CPU失去总线控制权的这段时间里,DMA接口也并不是百分百利用这段时间,因为IO设备传输数据给接口的数据缓冲器这段时间也总大于一个存期周期。换句话来说,当IO设备还在准备数据的时候,CPU也仍然处于空闲状态。
周期挪用(周期窃取)
当IO设备发出DMA请求时,IO设备便挪用或窃取总线占用权一个或几个周期,而DMA不请求时,CPU仍可继续访问。
而IO设备请求DMA时,会有三种状况:
- CPU不访问主存,那么DMA接口和CPU不会发生主存
- CPU正在访问主存,那么DMA接口需要等待该次存储周期结束
- DMA和CPU同时要访问主存时,DMA接口发出请求占用几个存取周期(即在CPU执行访存指令过程中插入DMA请求,使CPU延迟了几个周期再访问)
IO设备每挪用一个主存周期都要申请总线控制权、建立总线控制权和归还总线控制权。因此,对于主存来说,虽然只传一个字只占用一个周期,但对DMA接口来说,要处理包括申请、建立、传输、归还等阶段,实质上DMA接口要占好几个周期。
因此周期挪用适合IO设备的读/写周期大于主存周期的情况。
DMA与CPU交替执行
这种方式不需要总线使用权的申请、建立、归还过程,总线使用权分别由C1、C2控制的。CPU和DMA接口各自有独立的访存地址寄存器、数据寄存器、读写信号。实际上总线变成了C1、C2控制下的多路转换器,其总线控制权的转移几乎不需要时间,具有很高的DMA传送速率。
DMA接口的功能和组成
DMA接口应该具有以下几个功能:
- 向CPU申请DMA传送
- 在CPU允许DMA工作时,处理总线控制权的转交,避免引起总线竞争
- 在DMA期间管理系统总线,控制数据传输
- 确定数据传送的起始地址和数据长度,更新数据传输过程中的数据地址和数据长度
- 在数据块传输结束时,给出DMA操作完成的信号
DMA接口的组成原理如下图所示
DMA数据传输的流程
DMA的数据传送过程分为 预处理、数据传送、后处理三个阶段。
其示意图如下所示:
预处理
在DMA接口开始工作之前,CPU必须给它预置如下信息:
- 给DMA控制逻辑指明数据传送方向
- 给设备地址寄存器(DAR)送入设备信号
- 向主存地址寄存器(AR)送入交换数据的起始地址
- 对字计数器赋予交换数据的个数
当这些工作完成后,程序初始化结束。
数据传输
等IO设备准备好数据 或 处理完输出的数据后,就让DMA接口向CPU提出总线获取控制权,如果有多个DMA请求,则按轻重缓急排队等待。当IO设备获取到总线控制权后,数据的传输就由DMA进行管理。
数据读取过程:
- IO设备发送数据到数据缓冲区内
- IO设备发送DREQ请求给DMA控制逻辑
- DMA控制逻辑发送HRQ给总线申请获取总线控制权
- 获取成功后,DMA控制逻辑收到HLDA响应,将总线控制权交给DMA接口
- 将DMA主存地址寄存器的主存地址送到地址总线,并命令存储器写
- 通知设备已被授予一个DMA周期(DACK),并为下一个字做准备
- 将DMA数据缓存寄存器的内容送至数据总线
- 主存将数据总线上的信息写到地址总线指定的存储单元
- 修改AR和WC
- 判断数据块是否结束,若未结束继续传输;否则向CPU申请程序中断,标志数据传输完毕
输出数据过程:
- 当DMA的BR已将数据送至IO设备后,表示BR已空
- 设备向DMA接口发请求DREQ
- DMA接口向CPU申请总线控制权HRQ
- CPU发回HLDA信号,允许交出总线控制权
- 将DMA主存地址寄存器中的主存地址送到地址总线,并命令存储器读
- 通知设备已经被授予一个DMA周期(DACK),并为交换下一个字做准备
- 主存将相应地址单元的内容通过数据总线读入DMA的BR中
- 将BR的内容送到输出设备
- 修改AR和WC
- 判断数据块是否结束,若未结束继续传输;否则向CPU申请程序中断,标志数据传输完毕
后处理
当DMA的中断请求得到响应后,CPU停止原程序的执行,转去执行中断服务程序,做一些DMA的结束工作,包括校验数据的正确性、决定是否继续用DMA传送其他数据块、测试传输过程中是否发生错误。