使用 DMA 时 CPU 会完全冻结吗?

电器工程 微处理器 中央处理器 内存 DMA
2022-01-28 15:35:59

我有一个非常简单的问题,但我无法在任何地方找到答案。

在代码和数据位于同一 RAM 中的冯诺依曼系统上,CPU 必须从内存中获取所有指令。现在,为了在计算机组件之间移动大量数据,有一个直接内存访问控制器允许外围设备访问主系统 RAM。

我的问题是:如果 DMA 允许在硬盘和 RAM 之间进行(可能很长的)数据传输,这是否意味着 CPU 无法使用 RAM,因此无法获取下一条指令?

简而言之,DMA 旨在取代对所有 I/O 读写进行仲裁的处理器,以便腾出处理器来做其他事情。但是,如果它不能从 RAM 中获取指令,那么它无论如何都没有被释放。

我在这里遗漏了一些细节吗?

谢谢

4个回答

如果只有一个内存接口,就会有硬件在请求之间进行仲裁。通常情况下,处理器将获得高于 I/O 的优先级而不会导致 I/O 饥饿,但即使 I/O 始终具有优先级,处理器也会有一些机会访问内存,因为 I/O 往往具有较低的带宽需求并且是间歇性的。

此外,通常有不止一个内存接口。更高性能的处理器通常具有缓存(如果 DMA 不连贯,甚至不必窥探缓存;即使使用窥探,由于缓存和主存储器之间的带宽差异,或者(当 DMA 传输到 L3缓存)在 L3 缓存和 L1 缓存之间),提供一个单独的接口来访问内存。微控制器通常会从单独的基于闪存的存储器访问指令,允许在 DMA 期间继续对片上存储器进行提取,并且通常具有具有独立接口的紧密耦合存储器(允许多次数据访问以避免 DMA 冲突)。

即使使用单个存储器接口,峰值带宽通常也会高于通常使用的带宽。(对于指令提取,即使是从内存中读取加载量大于平均水平的小缓冲区,也会允许在另一个代理正在使用内存接口时从缓冲区中提取指令,从而利用代码不分支的趋势。)

另请注意,由于处理器访问数据,因此如果存在单个内存接口,则必须有一种机制来在数据访问和指令访问之间进行仲裁。

如果处理器(具有单个内存接口)被迫执行从 I/O 设备缓冲区到主内存的复制,它还必须获取指令来执行复制。这可能意味着即使在具有内存-内存操作的 ISA 中,每个字也需要两次内存访问(如果未提供后增量内存寻址,则加载存储 ISA 可能需要 3 次或更多内存访问);这是在旧系统中可能与主存储器共享相同接口的 I/O 访问的补充。DMA 引擎不访问内存中的指令,因此避免了这种开销。

您是正确的,在 DMA 传输期间 CPU 无法访问内存。然而,有两个因素结合起来允许 CPU 和执行 DMA 传输的设备进行明显的并行内存访问:

  • CPU 需要多个时钟周期来执行一条指令。一旦它获取了可能需要一两个周期的指令,它通常可以执行整个指令而无需进一步的内存访问(除非它是一条本身访问内存的mov指令,例如具有间接操作数的指令)。
  • 执行 DMA 传输的设备明显慢于 CPU 速度,因此 CPU 不需要在每条指令上停止,而只是在 DMA 设备访问内存时偶尔停止。

综合起来,这两个因素意味着执行 DMA 传输的设备对 CPU 速度的影响很小。

编辑:忘了提到还有 CPU 缓存的因素,只要 CPU 正在执行的代码在缓存中,那么它就不需要访问真实内存来获取指令,所以 DMA 传输不会进行妨碍(尽管如果指令需要访问内存,那么显然会发生真正的内存访问 - 可能必须等待 DMA 设备使用内存的中断)。

由于只有一个总线系统,被 DMA 的内存访问阻塞,CPU 在 DMA 移动数据时无法工作,因此被暂停。

这背后的想法如下:

如果你想从内存中复制连续的数据,那么 CPU 就必须这样做:

计算地址->读取数据->计算新地址(+1字)->读取数据...

而 DMA 并行计算新地址(取决于模式),因此速度更快。因此 DMA 可以在全总线吞吐量下工作(理论上)。

一般来说,没有。

在大多数系统架构中,所有内存访问请求都分配有优先级。当同时对内存的请求超过系统一次可以处理的数量时,优先级更高的请求将首先得到服务。CPU 发起的内存请求通常被赋予最高的优先级。