一、DMA的定义
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
二、DMA传输方式
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:
外设到内存、内存到外设、内存到内存、外设到外设
开始传输时刻:DMA向CPU申请至少一个总线周期的占用时间来做数据传输工作
结束传输时刻:DMA向CPU发送中断请求,请求CPU处理这些数据
三、DMA 的工作模式、数据传输方式、寻址模式
工作模式:直接模式、FIFO 模式。
(1)直接模式
DMA 直接进行从源地址到目的地址的数据传输。
(2)FIFO 模式
FIFO模式下,可以将要传输的多个数据(或字节)累计存储在FIFO缓冲器中,然后在FIFO缓冲器中设置存储阈值,当到达阈值时,FIFO会自动把所有存储的数据一次性的发送到目标地址。
数据传输方式:单字传送、块传送。
(1)单字传送(单次模式)
DMA 请求获得批准后,CPU 让出一个总线周期用于字或字节的传送。结束后, DMA 控制器归还总线控制权,CPU 再重新判断下一个总线周期的总线控制权是 CPU 保留,还是继续响应一次新的 DMA 请求。这种方式称为单字传送方式,又称为周期挪用或周期窃取。
(2)块传送(突发模式)
DMA 请求获得批准后,DMA 控制器掌管总线控制权,连续占用若干个总线周期,进行成组连续的批量传送,直到批量传送结束,才将总线的控制权交还给 CPU。这种方式称为成组连续传送方式
寻址模式:增量寻址、非增量寻址
(1) 增量寻址:发送完数据后,继续发送下一个地址的数据,配合突发传输模式
(2) 非增量寻址: 一发送完数据后,如果想要继续发送数据,需要更具软件配置的发送下一个数据的地址,再进行数据的传输
四、DMA 数据传输
1、准备阶段
CPU 会对 DMA 控制器和 IO 接口进行初始化,初始化的内容如下:
① DMA 控制器初始化
配置 DMA 内存缓冲区的首地址(即告诉DMA把数据放到哪)
配置 DMA 传输方向(是向外设传数据,还是从外设读数据)
配置 DMA 交换量(设置数据传输的上限)
② 接口的初始化
I/O 设备的寻址信息
2、传输请求
① 设备接口 => DMA 控制器
设备接口向DMA控制器发送 “ DMA请求 ” ,即请求使用 DMA 进行数据传输
② DMA 控制器 => CPU
DMA 控制器向CPU申请 “ 总线占用 ”,DMA控制器和 CPU 只能有一个占用总线
③ CPU => DMA 控制器
CPU 批准使用总线,此时CPU会让出一个或者多个总线周期用于数据传输。在DMA数据传输期间,CPU 停止访问内存,无法执行需要占用总线的指令。
④ DMA 控制器 => 设备接口
DMA 批准设备请求,此时 DMA控制器将掌握总线控制权。如果是单字节传送,一个总线周期后,DMA归还总线控制权;如果是块传送,连续占用若干个总线周期后,DMA才会归还总线控制权。
3、数据传送
数据传送期间,DMA 控制器会向总线发送读/写命令、向 I/O 接口发响应信号。真正的数据交互是内存和设备接口,DMA 控制器只是负责控制整个数据传送流程。
4、善后处理
在初始化时,CPU 便指定了DMA的交换量,而且DMA 控制器内部有一个计数器,只有 DMA 控制器知道传送是否结束。当传送结束时,DMA控制器向CPU发送一个传输完成的中断,CPU重新接管总线的控制权。