DMA传输模式
在本文中,我们将尝试了解与 DMA(直接内存访问)相关的详细信息,例如 DMA 到底是什么或它是如何工作的,并且我们还将进一步了解 DMA 传输的各种模式(如突发模式和其他模式)。在直接进入与 DMA 传输模式相关的细节之前,让我们首先尝试了解 DMA 到底是什么,以及这个 DMA 是如何实际工作的。
直接内存访问(DMA):
DMA 基本上代表直接内存访问。这是一个无需 CPU 即可在内存和 IO(输入/输出)设备之间传输数据的过程,也可以说在数据传输过程中无需 CPU 参与。
DMA的工作:
以下要点列表将简要描述 DMA 及其工作如下。
- 对于 DMA,您基本上需要一个称为 DMAC(直接内存访问控制器)的硬件,这将有助于直接在内存和 IO 设备之间进行数据传输的整个过程。
- 首先是 IO 设备向 DMA 控制器发送 DMA 请求,然后进一步的 DMAC 设备向 CPU 发送 HOLD 信号,通过该信号向 CPU 询问传输数据时需要的几个信息。
- 然后,CPU 在数据传输之前与 DMAC 共享两个基本信息,它们是:起始地址(应执行数据传输的内存地址)和数据计数(要传输的字节或字数)。
- CPU 然后将 HLDACK(保持确认)发送回 DMAC,说明现在 DMAC 可以成功传递信息。
- 然后进一步的 DMAC 将 DMA ACK(DMA 确认)共享给 IO 设备,最终让 IO 设备以直接有效的方式访问或传输内存中的数据。
DMA传输模式:
现在,在对 DMA 及其工作有了一些简要了解之后,是时候分析 DMA 传输模式了。
- 在 DMA 传输期间,CPU 只能执行那些不需要访问系统总线的操作,这意味着大多数 CPU 将处于阻塞状态。
- CPU 保持阻塞状态多长时间,或者我们可以说 CPU 将控制系统总线的 DMAC 的时间实际上取决于以下 DMA 传输模式,之后 CPU 将从DMAC。
模式一:
突发模式 -
- 在这种模式下,数据突发(整个数据或包含数据的块突发)在 CPU 从 DMAC 取回对总线的控制权之前被传输。
- 这是最快的 DMA 传输模式,因为会同时传输大量数据。
- 由于一次只传输大量数据,因此将节省大量时间。
CPU 保持阻塞的时间百分比:
设准备数据所用时间为 Tx,传输数据所用时间为 Ty。那么由于 DMA 导致 CPU 保持阻塞的时间百分比如下。
Percentage of time CPU remains in blocked state = Ty * 100% / Tx + Ty
模式 2:
循环窃取模式 –
- 慢速 IO 设备需要一些时间来准备数据(或字),并且在这段时间内 CPU 会保持对总线的控制。
- 一旦数据或字准备就绪,CPU 将系统总线的控制权交还给 DMAC,并在 1 个周期内将准备好的字传输到内存。
- 与 Burst 模式相比,此模式有点慢,因为它需要一点时间,IO 设备在准备数据时实际消耗了一点时间。
CPU 保持阻塞的时间百分比:
设准备数据所用时间为 Tx,传输数据所用时间为 Ty。那么由于 DMA 导致 CPU 保持阻塞的时间百分比如下。
Percentage of time CPU remains in blocked state = Ty * 100% / Tx
模式 3:
交错模式 –
- 只要 CPU 不需要系统总线,则只有总线控制权将交给 DMAC。
- 在这种模式下,CPU 根本不会因为 DMA 而被阻塞。
- 这是 DMA 传输最慢的模式,因为 DMAC 必须等待很长时间才能从 CPU 本身获取系统总线的访问权限。
- 因此,将传输较少量的数据。
例子 :
考虑以 2MBPs 速度运行的设备,并将数据传输到内存是使用循环窃取模式完成的。当它准备好或准备好时,将 16 个字节的数据传输到内存需要 2 微秒。那么由于 DMA 传输而阻塞 CPU 的时间百分比是多少?
解释 -
Internal data preparation speed given = 2 MBPs.
So for preparing 2 MB it takes ------> 1 second
For preparing 1B it takes -------> 1 second / 2MB
So now for 16B data preparation it takes ------->1 second * 16B / 2MB
(after reciprocating Mega will be become micro
(that is 10^6 will become 10^-6 after reciprocating))
therefore for preparation 16B it takes -------> 8 microseconds
Therefore percentage of time CPU remains blocked in case of
Cycle Stealing mode = 2 * 100% / 8 = 25%