直接内存访问

问题描述 投票:0回答:2

我对 DMA 有这个基本疑问。当CPU让出总线让DMA继续读取/存储数据时,它如何继续处理?

我的意思是,即使CPU也必须获取指令,通过总线将结果存储回内存/IO,不是吗?

cpu-architecture dma
2个回答
8
投票

CPU 有缓存,因此它们可以在没有任何实际主存访问的情况下执行很多操作。 即使是低功耗系统也往往有缓存,因为片外驱动信号会消耗足够的能量,缓存可以通过缓存命中节省的能量来收回成本。

更重要的是,DMA 不会“接管”RAM,甚至不一定会使内存带宽饱和。 CPU 不会“放弃总线”;内存控制器接受来自 CPU 内核和其他系统设备的读/写请求。 在 CPU 上运行占用大量内存的任务会减慢 DMA 的延迟,反之亦然,因为内存控制器或系统代理会仲裁对内存的访问,对来自所有源的读写请求进行排队。

DMA 非常适合仍比内存带宽慢得多的传输。 例如SATAIII为6Gbits/s,而双通道DDR3-1600MHz的主内存带宽约为25GBytes/s。 因此,programmed-io 会花费大部分时间等待来自 SATA 控制器的数据,甚至不会在存储到 RAM 时遇到瓶颈。


现代 Intel x86 CPU 中这些部件如何组合在一起的示例: Intel Skylake 系统架构图(包括 eDRAM 作为内存端缓存)。 抱歉,我没有找到仅显示核心和系统代理的更简单的图表,但在没有 eDRAM 的系统中,系统代理右侧唯一的东西是内存控制器,其他一切都保持不变。

内存控制器位于芯片上,因此该图中唯一的片外连接是 PCIe 总线以及内存控制器 (MC) 和 DRAM 之间的 DDR4 总线。

Skylake system agent diagram, from IDF via ARStechnica


1
投票

DMA 使用模型有两种基本类型。第一种是当 CPU 等待 DMA 完成时 - 同步操作或阻塞 DMA 调用。另一种是当 CPU 发出 ASYNC(或非阻塞)DMA 请求时。这让 CPU 继续执行常规控制流。这样它就可以将工作转移给 DMA 去做更重要的事情。

如果我正确理解你的问题,正如Peter所说,当CPU发出非阻塞DMA请求,并且DMA正在总线上积极执行某些操作时,CPU仍然可以执行所有常规操作,包括访问RAM,因为总线可以具有多路复用流量。或者换句话说,总线可以同时处理多个主设备。

连贯性和一致性使事情变得更加复杂,通常使用基于硬件支持的正确编程范例来维护。

© www.soinside.com 2019 - 2024. All rights reserved.