直接记忆体存取
![本页使用了标题或全文手工转换](http://images.weserv.nl/?url=//upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
![]() |
直接记忆体存取(Direct Memory Access,DMA)是计算机科学中的一种内存访问技术。它允许某些电脑内部的硬体子系统(电脑外设),可以独立地直接读写系统记忆体,而不需中央处理器(CPU)介入处理 。在同等程度的处理器负担下,DMA是一种快速的数据传送方式。很多硬体的系统会使用DMA,包含硬碟控制器、绘图显示卡、网路卡和音效卡。
直接记忆体存取
DMA是所有现代电脑的重要特色,它允许不同速度的硬体装置来沟通,而不需要依于中央处理器的大量中断负载。否则,中央处理器需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,中央处理器对于其他的工作来说就无法使用。
DMA传输常使用在将一个记忆体区从一个装置复制到另外一个。当中央处理器初始化这个传输动作,传输动作本身是由DMA控制器来实行和完成。典型的例子就是移动一个外部记忆体的区块到晶片内部更快的记忆体去。像是这样的操作并没有让处理器工作拖延,使其可以被重新排程去处理其他的工作。DMA传输对于高效能嵌入式系统演算法和网路是很重要的。 举个例子,个人电脑的ISA DMA控制器拥有8个DMA通道,其中的7个通道是可以让计算机的中央处理器所利用。每一个DMA通道有一个16位元位址暂存器和一个16位元计数暂存器。要初始化资料传输时,装置驱动程式一起设定DMA通道的位址和计数暂存器,以及资料传输的方向,读取或写入。然后指示DMA硬体开始这个传输动作。当传输结束的时候,装置就会以中断的方式通知中央处理器。
"分散-收集"(Scatter-gather)DMA允许在一次单一的DMA处理中传输资料到多个记忆体区域。相当于把多个简单的DMA要求串在一起。同样,这样做的目的是要减轻中央处理器的多次输出输入中断和资料复制任务。 DRQ意为DMA要求;DACK意为DMA确认。这些符号一般在有DMA功能的电脑系统硬体概要上可以看到。它们表示了介于中央处理器和DMA控制器之间的电子讯号传输线路。
缓存一致性问题
DMA会导致缓存一致性问题。想像中央处理器带有缓存与外部记忆体的情况,DMA的运作则是去存取外部记忆体,当中央处理器存取外部记忆体某个位址的时候,暂时先将新的值写入缓存中,但并未将外部记忆体的资料更新,若在缓存中的资料尚未更新到外部记忆体前发生了DMA,则DMA过程将会读取到未更新的资料。
相同的,如果外部装置写入新的值到外部记忆体内,则中央处理器若存取缓存时则会存取到尚未更新的资料。
这些问题可以用两种方法来解决:
- 快取同调系统(Cache-coherent system):以硬体方法来完成,当外部装置写入记忆体时以一个信号来通知缓存控制器某记忆体位址的值已经过期或是应该更新资料。
- 非同调系统(Non-coherent system):以软体方法来完成,操作系统必须确认缓存读取时,DMA程序已经开始或是禁止DMA发生。
第二种的方法会造成DMA的系统负担。
DMA引擎
除了与硬件交互相关外,DMA也可为内存耗费减负。如Intel I/O加速技术(IOAT)。IOAT的后续者是Xeon E5处理器的Data Direct I/O(DDIO)技术。
参考
外部链接
- mmap()和DMA,出自Linux Device Drivers,第二版, Alessandro Rubini & Jonathan Corbet
- DMA和中断的处理
|
|