DMAC数据传输原理

DMAC数据传输原理

Content #

DMA 控制器(DMA Controller,简称 DMAC)

总线上的设备有两种类型。主设备(Master)和从设备(Slave)。

想要主动发起数据传输,必须要是一个主设备才可以,CPU 就是主设备。而从设备(比如硬盘)只能接受数据传输。所以,如果通过 CPU 来传输数据,要么是 CPU 从 I/O 设备读数据,要么是 CPU 向 I/O 设备写数据。

那 I/O 设备不能向主设备发起请求么?可以是可以,不过这个发送的不是数据内容,而是控制信号。I/O 设备可以告诉 CPU,我这里有数据要传输给你,但是实际数据是 CPU 拉走的,而不是 I/O 设备推给 CPU 的。

DMAC对于 CPU 来说,它是一个从设备;对于硬盘这样的 IO 设备来说呢,它又变成了一个主设备。

用 DMAC 进行数据传输的过程:

  1. CPU 向 DMAC 设备发起请求。这个请求,其实就是修改 DMAC 的配置寄存器,告诉 DMAC 如下信息:
    • 源地址的初始值以及传输时候的地址增减方式。
    • 目标地址初始值和传输时候的地址增减方式。
    • 要传输的数据长度。
  2. 设置完这些信息之后,DMAC 就会变成一个空闲的状态(Idle)。
  3. 硬盘向 DMAC 发起数据传输请求。这个请求是通过一个额外的连线。
  4. DMAC 需要通过额外的连线响应这个申请。
  5. DMAC 向硬盘的接口发起要总线读的传输请求。数据就从硬盘里面,读到了 DMAC 的控制器里面。
  6. DMAC 再向内存发起总线写的数据传输请求,把数据写入到内存里面。
  7. 反复进行第 6、7 步的操作,直到 DMAC 的寄存器里面设置的数据长度传输完成。
  8. DMAC 重新回到第 3 步的空闲状态。

整个数据传输的过程中,不是通过 CPU 来搬运数据,而是由 DMAC 这个芯片来搬运数据。但是 CPU 在这个过程中也是必不可少的。因为传输什么数据,从哪里传输到哪里,其实还是由 CPU 来设置的。这也是为什么,DMAC 被叫作“协处理器”。

Viewpoints #

From #

48 | DMA:为什么Kafka这么快?