Linux之DMA详解
1、什么是DMA?
DMA全称Direct Memory Access(直接访问存储器)
。这是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据。
2、为什么需要DMA?
整个数据传输操作在一个称为DMA控制器
的控制下进行,CPU除了在数据传输开始和结束时做一点处理外(开始和结束时候要做中断处理),在外部设备和存储器进行数据传输的过程中,CPU可也进行其他的工作(前提是未设置停止CPU访问),这样,在大部分时间里,CPU和输入输出都处于并行操作,因此,计算机系统的效率将会大大提高。
3、什么时候需要DMA?
DMA方式主要适用于一些高速的I/O设备。这些外部设备传输字节或字的速度非常快,对于这些设备,如果用输入输出指令或者采用中断的方式来传输字节信息,会大量占用CPU的时间,同时也容易造成数据的丢失。而使用DMA方式能让外部I/O设备直接和存储器进行成批数据的快速传送。
DMA主要用于需要高速、大批量数据传送的系统中,目的是提高数据的吞吐量,如磁盘存取、图像处理、高速数据采集系统方面应用甚广。通常只有数据量较大的外设才需要支持DMA能力,比如视频、音频和网络接口。
4、谁来控制和管理DMA?
上面说到,DMA和外部设备在数据传输的过程中,并不需要CPU的参与,也就是DMA可以在脱离CPU的情况下工作,但是,这并不是说DMA不需要进行控制和管理。通常是采用DMA控制器(DMAC)
来取代CPU,负责DMA数据传输的全过程控制
5、什么是DMA控制器?
目前DMA控制器
都是可编程的大规模集成芯片,是内存储器和外部设备之间进行高速数据传输时的硬件控制电路
,是一种实现直接数据传送的专用处理器。
一个DMA控制器,实际闪是采用DMA方式的外围设备和系统总线之间的接口电路,这个接口电路是在中断接口的基础上再加上DMA机构组成。习惯上将DMA方式的接口电路称为DMA控制器
(也就是DMA控制器其实就一个硬件接口电路)。DMAC控制器包含下面几个部分:
- 内存地址计数器:用于存放内存中要交换的数据的地址
- 字计数器:用于记录传送数据块的长度
- 数据缓冲寄存器:用于暂存每次传送的数据
- DMA请求标志:每当外部设备准备好一个数据后给出一个控制信号,使这个标志位置1,当DMAC控制器中的“控制/状态”逻辑接收到CPU发回的响应信号HLDA后,会发出DMA响应信号,并把DMA请求标志复位,为交换下一个字做准备。
- “控制/状态”逻辑:由控制和时序电路以及状态标志等组成,用于修改内存地址计数器和字计数器,指定传送类型(输入或输出),并对"DMA请求"信号和CPU响应信号进行协调和同步。
- 中断机构:当字计数器溢出时,意味着一组数据交换完毕,由溢出信号触发中断机构,向CPU提出中断报告。
6、DMA的传输过程是怎么样的?
如上图所示,DMA的数据传输过程分为几个部分:
- 当外部设备有DMA使用需求时,会向DMAC控制器发出
DMA请求信号(DREQ
) - DMAC控制器接收到外部设备的请求信号后,会向CPU发出一个
总线请求信号(HRQ)
- CPU在接收到DMAC控制器发送过来的总线请求信号后,如果允许DMA传输,则会在总线空闲后,发出
DMA响应信号(HLDA)
。然后CPU会将控制总线、数据总线和地址总线置高阻态,即放弃对总线的控制权;另一方面,CPU会将有效的DMA响应信号发送给DMAC控制器,通知DMAC控制器CPU已经放弃了对总线的控制权 - DMAC控制器收到总线发来的
DMA响应信号(HLDA)
后,会获得总线的控制权,并向外部设备发送应答信号DACK
,通知外设可以进行DMA传输了 - DMAC还会向存储器发送地址信号,向存储器和外设发出读/写控制信号,控制数据按设定的方向传输,实现外设与内存的数据传输
- 数据全部传输结束后,DMAC向CPU发送
HOLD信号
,要求撤销DMAC控制器对总线的控制权,CPU收到该信号后,会使HLDA(DMA请求)信号
无效,收回总线控制权。
7、DMA传输有什么弊端?
因为DMA是用硬件控制代替软件控制,所以增加了系统硬件的复杂性和成本。另外,DMA传送期间CPU被挂起,部分或完全失去对系统总线的控制,这可能会影响CPU会中断请求的及时响应和处理。因此,在一些系统或速度要求不高,数据传输量不大的系统中,一般并不用DMA方式。
因为DMA允许外部设备直接访问内存,从而形成对总线的独占,这在实时性较强的实时系统嵌入式开发中将会造成中断延时过长。