DMA是一种无须CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。 DMA通常与硬件体系结构,特别是外设的总线技术密切相关。

DMA方式的数据传输由DMA控制器(DMAC)控制,在传输期间, CPU可以并发地执行其他任务。当DMA结束后,DMAC通过中断通知CPU数据传输已经结束,然后由CPU执行相应的中断服务程序进行后处理。
 

1 DMA与Cache一致性

Cache和DMA本身似乎是两个毫不相关的事物。 Cache被用作CPU针对内存的缓存,利用程序的空间局部性和时间局部性原理,达到较高的命中率,从而避免CPU每次都必须要与相对慢速的内存交互数据来提高数据的访问速率。 DMA可以作为内存与外设之间传输数据的方式,在这种传输方式之下,数据并不需要经过CPU中转。

假设DMA针对内存的目的地址与Cache缓存的对象没有重叠区域(如图11.12所示), DMA和Cache之间将相安无事。但是,如果DMA的目的地址与Cache所缓存的内存地址访问有重叠(如图11.13所示),经过DMA操作,与Cache缓存对应的内存中的数据已经被修改,而CPU本身并不知道,它仍然认为Cache中的数据就是内存中的数据,那在以后访问Cache映射的内存时,它仍然使用陈旧的Cache数据。这样就会发生Cache与内存之间数据“不一致性”的错误。
DMA_数据传输

所谓Cache数据与内存数据的不一致性,是指在采用Cache的系统中,同样一个数据可能既存在于Cache中,也存在于主
存中, Cache与主存中的数据一样则具有一致性,数据若不一
样则具有不一致性。
需要特别注意的是, Cache与内存的一致性问题经常被初
学者遗忘。在发生Cache与内存不一致性错误后,驱动将无法
正常运行。如果没有相关的背景知识,工程师几乎无法定位错
误的原因,因为这时所有的程序看起来都是完全正确的。
Cache的不一致性问题并不是只发生在DMA的情况下,实际
上,它还存在于Cache使能和关闭的时刻。例如,对于带MMU
功能的ARM处理器,在开启MMU之前,需要先置Cache无
效,对于TLB,也是如此,代码清单11.12给出的这段汇编可
用来完成此任务。