linux DMA

时间:2024-03-26 07:06:29

1 DMA工作原理


  DMA的原意为direct memory access,也就是直接内存访问(可以理解为读写)。DMA传输实际上是DMA控制器将数据从一个设备拷贝到另一个设备的过程,DMA控制器的初始化需要cpu参与,但是数据传输过程是不需要cpu参与的。
  实际上DMA不只适用于有内存参与下的数据传输,下表是DMA适用的数据传输场景

传输方式 目的
1 内存 内存
2 内存 外围设备
3 外围设备 内存
4 外围设备 外围设备

表 1-1 DMA传输场景

2 DMA控制器


  DMA控制器简称为DMAC,DMAC控制器是SOC的一部分,关于DMAC的配置、数据传输都是在DMAC完成的。DMAC一般是AMBA设备,通过AHB总线与cpu连接。

linux DMA 图 2-1 dmac block diagram

  图2-1是具体DMAC的模块图,AHB slave interface连接cpu,用于配置、初始化DMAC。两个ABH master interface用于两个设备间数据传输。Interrupt request是DMAC本身的中断。
  
  DMA request and response interface是DMAC的请求与响应接口。一般来DMAC会有多个channel(通道),channel可以进行双向数据传输。channel与request是相对应的,一个channel通过request line可以发出一个request。channel是有优先级的,通常channel序号越小优先级越高。当channel5与channel6同时产生DMA request是时,DMAC是优先响应、处理channel5的请求。只有与request line相连接的设备才能产生DMA request。

3 数据传输过程


  有两种方式可以引发DMA数据传输:软件对数据的请求、硬件异步地将数据传递给系统。参考LDD,也就是linux设备驱动程序

3.1 软件对数据请求传输过程

  1. 当进程调用read,驱动程序函数分配一个DMA缓冲区,并让硬件将数据传输到这个缓冲区中,进程进入睡眠状态
  2. 硬件将数据写入到DMA缓冲区,写入完成后产生一个中断(由DMAC产生)
  3. 中断处理程序获取到输入的数据,然后唤醒进程,进程可以读取数据

3.2 硬件异步数据传输过程

  1. 硬件产生中断,宣告数据的到来
  2. 中断处理程序分配一个缓冲区,并且告诉硬件向哪里传输数据
  3. 外围设备将数据写入缓冲区,完成后产生另外一个中断
  4. 处理程序分发新数据,唤醒相关进程,执行相应操作

   网卡数据传输就是使用硬件异步数据传输方式,在下载、访问的过程中,kernel并不确定数据到来的时间。网络数据最先到达的是硬件网卡,网卡接收到一定量的网络数据时,产生中断,通过kernel处理,进入硬件异步数据传输过程。

4 burst transfer


  burst transfer也就是突发传输,是DMA传输模式的一种。DMA的传输模式的以下三种:突发(Burst mode)模式、循环挪用(Cycle stealing mode)模式、透明模式。参考1 参考2
  Burst mode[edit]
  An entire block of data is transferred in one contiguous sequence. Once the DMA controller is granted access to the system bus by the CPU, it transfers all bytes of data in the data block before releasing control of the system buses back to the CPU, but renders the CPU inactive for relatively long periods of time. The mode is also called “Block Transfer Mode”. It is also used to stop unnecessary data.
  翻译:突发模式就是在一个连续的时间序列内完成一块完整数据的传输。当cpu将系统总线(AMBA总线)控制权交给DMA控制器,cpu输入空闲状态,直到DMAC将数据块所有数据传输完成并将总线控制权交还给cpu。这个模式叫做块传输模式,也叫做突发模式。
  DMA是一次申请产生一次DMA传输,每次传输都要提供一个地址;而burst transfer是一个DMA request,多次传输,只需要提供一次地址,后面传输的地址是递增的。burst transfer的传输次数就是burst。
  比如要传64个字节,那么dma内部可能分为2次,一次传64/2=32个字节,这个2(a)次呢,就叫做burst。这个burst是可以设置的。这32个字节又可以分为32位 *8或者16位*16来传输。
  burst transfer中有几个重要的参数,DMA驱动上会用到

  • transfer size //就是数据宽度,一次dma传输的数据多大,比如8位、32位,一般跟外设的FIFO相同
  • burst size //一次dma请求,产生多少次传输

5 scatter gather