直接内存访问
目录
直接内存访问
直接内存访问(DMA)是计算机系统的一项功能,它允许某些硬件子系统独立于中央处理单元(CPU)访问主系统内存(随机存取内存)。
如果没有直接内存访问,当CPU使用编程的输入/输出时,它通常在读或写操作的整个持续时间内都被完全占用,因此无法执行其他工作。对于DMA,CPU首先启动传输,然后在传输过程中执行其他操作,最后在操作完成时收到来自DMA控制器(DMAC)的中断。在CPU无法跟上数据传输速率的任何时候,或者当CPU需要在等待相对较慢的I/O数据传输时执行工作时,此功能非常有用。许多硬件系统使用直接内存访问,包括磁盘驱动器控制器、图形卡、网卡和声卡。.DMA还用于多核处理器中的片内数据传输。与没有DMA通道的计算机相比,具有DMA通道的计算机可以以更少的CPU开销在设备之间传输数据。类似地,多核处理器内的处理元件可以在不占用其处理器时间的情况下将数据传入和传出其本地存储器,从而允许计算和数据传输并行进行。
直接内存访问还可用于“内存到内存”复制或移动内存中的数据。DMA可以将昂贵的内存操作(例如大副本或分散收集操作)从CPU卸载到专用DMA引擎。一个实现示例是I/O加速技术。DMA对片上网络和内存计算架构很感兴趣。
直接内存访问原则
操作模式
缓存一致性
直接内存访问会导致缓存一致性问题。想象一下配备缓存和外部存储器的CPU,这些存储器可以由使用DMA的设备直接访问。当CPU访问内存中的位置X时,当前值将存储在缓存中。X上的后续操作将更新X的缓存副本,但不会更新X的外部存储器版本,假设是回写缓存。如果在下一次设备尝试访问X之前没有将缓存刷新到内存中,则该设备将收到一个陈旧的X值。
类似地,如果在设备向内存写入新值时X的缓存副本没有失效,则CPU将对X的陈旧值进行操作。
这个问题可以通过系统设计中的两种方式之一解决:缓存一致性系统在硬件中实现一种称为总线监听的方法,其中外部写入被发送到缓存控制器,然后缓存控制器为DMA写入或缓存刷新执行缓存失效DMA读取。非相干系统将这一点留给软件,其中操作系统必须确保在开始传出DMA传输之前刷新缓存行,并在访问受传入DMA传输影响的内存范围之前使缓存行无效。操作系统必须确保在此期间任何正在运行的线程都不会访问内存范围。后一种方法为DMA操作引入了一些开销,因为大多数硬件需要一个循环来单独使每个缓存行无效。