我在一本书中读到:
如果系统中的 DMA 控制器以 5 MHz 的最大速率运行,而我们仍然使用 100 ns 内存,则最大传输速率为 5 MHz,因为 DMA 控制器比内存慢。在许多情况下,DMA 控制器会在发生 DMA 传输时降低系统速度。
我认为 DMA 控制器的全部原因是加快速度,而不是减慢速度。那么,如果它减慢速度有什么帮助呢?为什么不让 DMA 控制器和内存一样快呢?
我在一本书中读到:
如果系统中的 DMA 控制器以 5 MHz 的最大速率运行,而我们仍然使用 100 ns 内存,则最大传输速率为 5 MHz,因为 DMA 控制器比内存慢。在许多情况下,DMA 控制器会在发生 DMA 传输时降低系统速度。
我认为 DMA 控制器的全部原因是加快速度,而不是减慢速度。那么,如果它减慢速度有什么帮助呢?为什么不让 DMA 控制器和内存一样快呢?
DMA 控制器的整体理念是它与处理器并行工作。因此处理器可以将长 IO 操作排队到 DMA 控制器并愉快地继续运行代码。即使 DMA 控制器速度较慢,它也只会影响 IO 操作,而不会影响整体性能。这在与慢速设备交互时非常重要——如果处理器必须直接与它们一起工作,它将永远不会完成任何其他处理。使用 DMA,它将慢速 IO 排队到 DMA 上,并且 IO 是并行完成的。
涉及两种不同的“传输率”。在一个设计良好的系统中,DMA 控制器必须能够以正常的工作速率与地址和数据总线接口。另一方面,操作之间的时间可能比 CPU 指令周期慢得多,这意味着它不会以与 CPU 相同的速度将数据从源地址传输到目标地址。由于几乎所有连接到系统的硬件设备都以慢得多的速度运行,因此这是完全可以接受的。
DMA 的典型目的是让 CPU 从将字节从内存传送到 I/O 端口的日常任务中卸载。考虑传输中间的正常 I/O 序列:
- 从端口获取一个中断,它已准备好接收下一个字节或字;
- 执行中断处理,包括堆栈操作和保存寄存器;
- 从内存中获取指针和计数器;
- 加载一个数据字节,存储一个数据字节;
- 增加两个指针并保存它们
- 减少计数器并保存它;如果为零,则标志传输结束;
- 从中断处理返回
在系统中使用 DMA 时,cpu 会花更多时间预先对 DMA 控制器进行编程,但随后会避免所有中断,直到传输结束。当然,当 DMA 访问内存时 CPU 不能;但通常 CPU 并不是每条指令都访问内存(加法、减法等,所有这些都发生在 CPU 内部,没有内存访问)。那么,平均而言,每个字节传输应该花费少于一个内存周期(考虑到那些不干扰的),而不是一个完整的中断处理操作。