什么是DMA(Direct Memory Access)
- DMA绕过CPU,在内存和外设之间开辟了一条 “隧道” ,直接控制内存与外设之间的操作,并完全由硬件控制。
- 这样数据传送不经过cpu,不需要保护、恢复CPU现场等一系列操作,减少开销。
如何运行
- 向cpu索要系统总线:接受外设发出的DMA请求,并向CPU发出总线请求。CPU响应总线请求,发出总线响应信号,接管总线控制权,进入DMA操作周期。
- 在系统总线上,进行内存和外设之间的数据传输:确定传送数据的主存单元地址及长度,并能自动修改主存地址计数和传送长度计数。规定数据在主存和外设间的传送方向,发出读写等控制信号,执行数据传送操作。
- 归还总线:向CPU发送DMA操作的结束。
如何传输
- 主存和DMA控制器之间有一条数据通路,当二者同时访问数据通路时,可能会发生冲突,有以下解决方法:
停止CPU访问主存(CPU基本不工作,DMA说了算)
- 简析:DMA要求使用总线,CPU就让给DMA使用。
- DMA接口向CPU发送一个信号,要求CPU放弃相关线路的控制权(地址线、数据线和有关控制线)。
- DMA接口获得总线控制权后,开始进行数据传送。
- 在数据传送结束后,DMA接口通知CPU可以使用主存,并把总线控制权交还给CPU。
- 这种传送过程中,CPU基本处于不工作状态和保持原状态。
DMA与CPU交替访存(CPU工作分时,CPU说了算)
-
简析:CPU工作分成两个周期:访问主存和不访问主存的周期,前者CPU访问主存,后者DMA访问主存。
-
这种方式适用于CPU的工作周期比主存存取周期长的情况。例如,CPU的工作周期是1.2us,主存的存取周期小于0.6us,那么可将一个CPU周期分为C1和C2两个周期。其中C1专供DMA访存,C2专供CPU访存。
-
这种方式不需要总线使用权的申请、建立和归还过程,总线使用权是通过C1和C2分时控制的。
周期挪用(相互商量,不允许打断)
- 简析:CPU和DMA相互商量,CPU不用访存时DMA使用;CPU访存时DMA不可打断;二者同时访存时,DMA访存。
- 这种方式是前两种方式的折中,当I/O设备没有DMA请求时,CPU按程序的要求访问主存,一旦I/O设备有了DMA请求,会遇到3种情况。
- 第一种是此时CPU不在访存(如CPU正在执行乘法指令),故I/O的访存请求与CPU未发生冲突;
- 第2种是CPU正在访存,则必须等待存取周期结束后,CPU再将总线占有权让出。
- 第3种是I/O和CPU同时请求访存,出现了访存冲突,此时CPU要暂时放弃总线占用权,由I/O设备挪用一个或几个存取周期。
参考自,更多细节请见:博客https://blog.csdn.net/jxq0816/article/details/52634702