DMA方式

概述

DMA方式是IO接口的控制方式之一。DMA和其他控制方式相比,它拥有专门的数据通路,所 以主存和设备交换信息时,可以不经过CPU,也不需要CPU参与数据交换(程序中断需要CPU参与中断服务),那么就省去了 保护现场、恢复现场的流程。

由于DMA接口的速度很快,所以经常用于高速IO设备,因为高速IO设备如果不及时交互信息,很可能产生数据丢失。

上面所有的优势均建立在 主存和IO设备直接交换信息,不需要经过CPU这个条件之上,而当CPU和IO设备同时访问主存时,就会发生冲突。为了解决冲突,通常会采用以下几个方法:

  • 停止CPU访存
  • 周期挪用(又称周期窃取)
  • 交替访问

停止CPU访存

假设IO设备要发送一些数据,DMA接口会向CPU发出一个停止信号,要求CPU放弃总线控制前,DMA接口获得总线控制权后,开始进行数据传送,在数据传输结束后,DMA接口通知CPU可以使用主存,并把总线使用权交给CPU。其时序图如下所示

停止CPU访问主存

这种方式的缺陷主要在于 CPU失去总线控制权的这段时间里,DMA接口也并不是百分百利用这段时间,因为IO设备传输数据给接口的数据缓冲器这段时间也总大于一个存期周期。换句话来说,当IO设备还在准备数据的时候,CPU也仍然处于空闲状态。

周期挪用(周期窃取)

当IO设备发出DMA请求时,IO设备便挪用或窃取总线占用权一个或几个周期,而DMA不请求时,CPU仍可继续访问。

而IO设备请求DMA时,会有三种状况:

  1. CPU不访问主存,那么DMA接口和CPU不会发生主存
  2. CPU正在访问主存,那么DMA接口需要等待该次存储周期结束
  3. DMA和CPU同时要访问主存时,DMA接口发出请求占用几个存取周期(即在CPU执行访存指令过程中插入DMA请求,使CPU延迟了几个周期再访问)

周期挪用时序图

IO设备每挪用一个主存周期都要申请总线控制权、建立总线控制权和归还总线控制权。因此,对于主存来说,虽然只传一个字只占用一个周期,但对DMA接口来说,要处理包括申请、建立、传输、归还等阶段,实质上DMA接口要占好几个周期。

因此周期挪用适合IO设备的读/写周期大于主存周期的情况。

DMA与CPU交替执行

这种方式不需要总线使用权的申请、建立、归还过程,总线使用权分别由C1、C2控制的。CPU和DMA接口各自有独立的访存地址寄存器、数据寄存器、读写信号。实际上总线变成了C1、C2控制下的多路转换器,其总线控制权的转移几乎不需要时间,具有很高的DMA传送速率。

交替访问时序图

DMA接口的功能和组成

DMA接口应该具有以下几个功能:

  1. 向CPU申请DMA传送
  2. 在CPU允许DMA工作时,处理总线控制权的转交,避免引起总线竞争
  3. 在DMA期间管理系统总线,控制数据传输
  4. 确定数据传送的起始地址和数据长度,更新数据传输过程中的数据地址和数据长度
  5. 在数据块传输结束时,给出DMA操作完成的信号

DMA接口的组成原理如下图所示
DMA接口的组成

DMA数据传输的流程

DMA的数据传送过程分为 预处理数据传送后处理三个阶段。
其示意图如下所示:
DMA传输过程概览

预处理

在DMA接口开始工作之前,CPU必须给它预置如下信息:

  • 给DMA控制逻辑指明数据传送方向
  • 给设备地址寄存器(DAR)送入设备信号
  • 向主存地址寄存器(AR)送入交换数据的起始地址
  • 对字计数器赋予交换数据的个数

当这些工作完成后,程序初始化结束。

数据传输

等IO设备准备好数据 或 处理完输出的数据后,就让DMA接口向CPU提出总线获取控制权,如果有多个DMA请求,则按轻重缓急排队等待。当IO设备获取到总线控制权后,数据的传输就由DMA进行管理。

DMA数据传输过程概览

DMA传输过程详情

数据读取过程:

  1. IO设备发送数据到数据缓冲区内
  2. IO设备发送DREQ请求给DMA控制逻辑
  3. DMA控制逻辑发送HRQ给总线申请获取总线控制权
  4. 获取成功后,DMA控制逻辑收到HLDA响应,将总线控制权交给DMA接口
  5. 将DMA主存地址寄存器的主存地址送到地址总线,并命令存储器写
  6. 通知设备已被授予一个DMA周期(DACK),并为下一个字做准备
  7. 将DMA数据缓存寄存器的内容送至数据总线
  8. 主存将数据总线上的信息写到地址总线指定的存储单元
  9. 修改AR和WC
  10. 判断数据块是否结束,若未结束继续传输;否则向CPU申请程序中断,标志数据传输完毕

输出数据过程:

  1. 当DMA的BR已将数据送至IO设备后,表示BR已空
  2. 设备向DMA接口发请求DREQ
  3. DMA接口向CPU申请总线控制权HRQ
  4. CPU发回HLDA信号,允许交出总线控制权
  5. 将DMA主存地址寄存器中的主存地址送到地址总线,并命令存储器读
  6. 通知设备已经被授予一个DMA周期(DACK),并为交换下一个字做准备
  7. 主存将相应地址单元的内容通过数据总线读入DMA的BR中
  8. 将BR的内容送到输出设备
  9. 修改AR和WC
  10. 判断数据块是否结束,若未结束继续传输;否则向CPU申请程序中断,标志数据传输完毕

后处理

当DMA的中断请求得到响应后,CPU停止原程序的执行,转去执行中断服务程序,做一些DMA的结束工作,包括校验数据的正确性、决定是否继续用DMA传送其他数据块、测试传输过程中是否发生错误。