聊聊DMA协处理器,IO设备的搬运工

DMA(Direct Memory Access 直接存储器访问) 是近些年电脑主机的重要组成部分,它主要用来建立不同硬件之间的数据传输沟通,从而使得数据IO不再引起cpu的大量中断负载。以此,提高CPU的利用率,使得程序的运算更快,而不用阻塞在io等待上,总结起来,DMA解放了CPU的搬运数据的工作,从而使得CPU更加专注于计算任务,从而提高机器的计算效率

本质上讲,DMA就是我们在主板上的一块独立的芯片。在进行内存和IO设备通信的时候,我们可以直接通过DMA芯片来通信,而不再需要CPU来搬运数据。




DMA通用步骤


一个完整的DMA请求类似我们所说的TCP3次握手一样,它必须有一个ACK的过程。

  • 设备请求DMA
  • DMA响应设备请求
  • 开始DMA传输
  • 传输长度到底,单次DMA结束




一次从硬盘加载内存的完整DMA请求流程


聊聊DMA协处理器,IO设备的搬运工_第1张图片
假设背景为用户双击打开了某个应用程序进程,此时,程序初始化,将大量的硬盘数据加载到内存。

  • 1- CPU发出请求设置dma的寄存器状态,设置源地址,地址增减方式以及需要增减的偏移量。
  • 2- CPU设置完成dma,此时将请求发送至硬盘,告诉硬盘,DMA已经设置完毕,我需要从你这里读取数据
  • 3- 硬盘发起DMA请求至DMA芯片(不通过总线)
  • 4- DMA芯片响应该请求(不通过总线)
  • 5- DMA请求获取总线的控制权
  • 6- DMA获取总线控制权
  • 7- DMA向硬盘发起一个总线读请求,此时数据开始分批传入到DMA芯片中
  • 8- 将DMA芯片中的数据发起总线写,写入到内存中。

以上5-8步是不断重复的,直到所请求的数据完全从硬盘加载到内存中。




CPU与DMA的总线分时


聊聊DMA协处理器,IO设备的搬运工_第2张图片
如上图所示,不论是DMA或CPU发起传输请求,其实本质上,都要通过总线。这里就要延伸出另外一个问题了。即总线的分时策略,根据不同场景,又分为以下三种分时策略




策略一:停止CPU,不访问内存

聊聊DMA协处理器,IO设备的搬运工_第3张图片
如上图,这里指的是,当DMA使用总线则CPU不能使用总线,反之亦然。这里相对比较粗暴,相对于cpu直接搬运数据区别不大。也就是说,DMA执行工作的时候。cpu也只能运算自己高速缓存上的程序罢了。由于没有总线使用权,它必须等待。



策略二:周期挪用

聊聊DMA协处理器,IO设备的搬运工_第4张图片其实所谓的周期挪用,只不过是将粒度变小,更多的时间在cpu这里,根本原因,还是因为CPU的执行速度要比IO的执行速度快的多。但是,如果DMA和CPU产生冲突的时候,会优先DMA的读取请求,这是因为IO设备一般都具有持久化或立即响应的特点。如果不优先IO设备的话,轻则设备卡顿,重则数据丢失



策略三:交替访问

聊聊DMA协处理器,IO设备的搬运工_第5张图片
这种方式不需要总线使用权的申请、建立和归还过程,总线使用权是通过C1和C2分时制的。CPU和DMA控制器各自有自己的访内地址寄存器、数据寄存器和读/写信号等控制寄存器。在C1周期中,如果DMA控制器有访内请求,可将地址、数据等信号送到总线上。在C2周期中,如CPU有访内请求,同样传送地址、数据等信号。事实上,对于总线,这是用C1,C2控制的一个多路转换器,这种总线控制权的转移几乎不需要什么时间,所以对DMA传送来讲效率是很高的。



总结


本篇博文来自博主个人理解,其中参考资料有:
百度百科
极客时间
另外,对于现有IO设备,很多自己内部都设置了自己的DMA芯片,用于通信。博主的目的仅限于理解DMA芯片对于CPU的中断优化。欢迎沟通,也欢迎指出不对的地方。

你可能感兴趣的:(计算机基础,java)