突发模式 DMA 如何加速主存储器和 I/O 设备之间的数据传输?

how does burst-mode DMA speed up data transfer between main memory and I/O devices?

根据维基百科,DMA模式分为三种,即Burst Mode、cycle stealing mode和transparent mode。 在突发模式下,dma 控制器将接管总线的控制。在传输完成之前,CPU 个需要总线的任务将被暂停。但是,在每个指令周期中,取指周期都必须引用主存储器。因此,在传输过程中,CPU会空闲不做任何工作,这与中断驱动IO下被传输工作占用本质上是一样的。 在我的理解中,循环窃取模式本质上是相同的。唯一的区别是在那些模式下 CPU 在两个连续的周期中使用一个,而不是在 bust 模式下完全空闲。 突发模式 DMA 是否通过跳过使用中断驱动时所需的取指和解码周期而有所不同 I/O,从而在每个时钟周期而不是一个指令周期完成一次传输,从而加快处理速度?

非常感谢!

how does burst-mode DMA speed up data transfer between main memory and I/O devices?

没有你所说的"speed up",通常也没有"speed up" necessary/possible.数据传输不会比源或目标中较慢的速度更快。

DMA 控制器会将几个单独的内存请求合并为偶尔的突发请求,因此突发模式的好处是由于内存仲裁数量的减少而减少了内存争用。

突发模式结合宽内存字提高了内存带宽利用率。例如,对于 32 位宽的内存,合并为单个突发的四个连续字节读取可能只会导致一个内存访问周期。

Before the transfer completes, CPU tasks that need the bus will be suspended.

"task"的概念在这个级别的操作中不存在。什么都没有"suspension"。至多 CPU 必须等待(即插入等待状态)才能访问内存。

However, in each instruction cycle, the fetch cycle has to reference the main memory.

不正确。指令缓存中的命中将使内存访问变得不必要。

Therefore, during the transfer, the CPU will be idle doing no work, which is essentially the same as being occupied by the transferring work, under interrupt-driven IO.

每次缓存命中的错误假设。
显然你误用了术语 "interrupt-driven IO" 来真正意味着使用中断编程 I/O。
将一个或两个等待周期等同于 numerous 程序中断服务例程指令的执行 I/O 是荒谬的夸张。

"interrupt-driven IO"(在其应有的含义中)不排除使用DMA。

In my understanding, the cycle stealing mode is essentially the same.

那你的理解是错误的。

如果 DMA 的好处像您声称的那样微不足道或根本不存在,那么您如何解释 DMA 控制器的存在,以及使用 DMA 而不是编程的偏好 [=7​​7=]?

Does burst mode DMA make a difference by skipping the fetch and decoding cycles needed when using interrupt-driven I/O and thus accomplish one transfer per clock cycle instead of one instruction cycle and thus speed the process

将 DMA 与 "interrupt-driven I/O" 进行比较是不合逻辑的。参见 this

编程 I/O 使用中断需要的不仅仅是您声称的 one 指令。
我不熟悉任何可以读取设备端口的 CPU,将该值写入主内存,碰撞写指针,并检查块传输是否完成,所有这些都只需要一个 单个指令。
而且您完全忽略了为每个中断执行的 ISR 代码(例如,保存然后恢复处理器状态)(设备会发出请求数据)。

当与许多旧的或更简单的 CPU 一起使用时,突发模式 DMA 可以在外围设备能够以比 CPU 本身更快的速率接受数据的情况下加速数据传输供应它。例如,在典型的 ARM 上,循环如下:

lp:
  ldr  r0,[r1,r2]  ; r1 points to address *after* end of buffer
  strb r0,[r3]
  lsr  r0,r0,#8
  strb r0,[r3]
  lsr  r0,r0,#8
  strb r0,[r3]
  lsr  r0,r0,#8
  strb r0,[r3]
  adds r2,#4
  bne  lp

传输每组四个字节可能至少需要 11 个周期(包括五个 32 位指令提取、一个 32 位数据提取、四个 8 位写入,以及后续指令的浪费提取循环)。相比之下,突发模式 DMA 操作每组 DMA 只需要 5 个周期(假设接收设备能够那么快地接受数据)。

因为典型的低端 ARM 只会在 运行 宁大多数类型的代码时每隔一个周期使用一次总线,一个每隔一个周期获取一次总线的 DMA 控制器可以允许 CPU 到 运行 以几乎正常的速度,而 DMA 控制器每隔一个周期执行一次访问。在某些平台上,可以让 DMA 控制器在 CPU 未执行任何操作的每个周期执行传输,同时在需要总线的周期给予 CPU 优先级。在这种模式下,DMA 性能变化很大(当 运行ning 代码在每个周期都需要总线时,不会传输任何数据)但 DMA 操作不会对 CPU 性能产生影响。