源地址:http://www.cnblogs.com/TaigaCon/archive/2012/12/03/2799407.html
DMA(Direct Memory Access,直接内存存取)
一般来说,计算机对内存数据进行处理的时候,需要从内存把数据读进寄存器,然后进行进一步的操作(比如运算处理)。
但是有些数据并不需要运算处理这一类型的操作,只是单纯的移动数据,而把数据读进寄存器,然后再把数据从寄存器写进内存会消耗cpu资源,当需要读写大量数据的时候更是如此,DMA技术就很好地解决了这一问题。
DMA,顾名思义,不占用cpu资源,从一个硬件存储区域把一部分连续的数据复制到另一个硬件存储区域。其中硬件包括系统总线上的硬件(内存),和外部总线上的硬件(磁盘,iis外设等)。
DMA硬件可以说是一个单纯为了进行数据移动而设计的处理器,传输模式跟cpu一样
SIZE = TC * DSZ * TSZ
SIZE :传输的总数据量
TC :数据传输次数
DSZ :一个数据有多少个原子传输
TSZ :一个原子传输有多少字节
DMA的原子传输会占用系统总线资源
DMA虽然不会占用cpu资源,但是如果DMA的源跟目的都为内存的时候,由于内存位于系统总线上,DMA会占用总线资源,此时由于系统总线忙,cpu会由于得不到总线资源而无法进行跟外部的交流操作。
如果DMA的源或目的为内存的时候,我们需要为其分配一块在物理上连续的内存。如果用kmalloc等函数分配的内存,虽然在虚拟地址看起来是连续的,但是物理上可能不连续,因此需要用到分配物理上连续的内存的函数(dma_alloc_writecombine)。
为什么要分配连续的内存空间呢,因为平时cpu使用的时候,寻址会经过mmu(内存管理单元)进行虚拟地址到物理地址的转换,而DMA是不经过mmu直接对内存进行读写的,直接对物理地址进行操作。
使用DMA
当我们要使用到DMA的时候,需要把传输的源(物理地址)、目的(物理地址)、大小告诉DMA,然后启动DMA,就能进行数据移动了。
那么什么时候DMA会结束呢,当DMA传输结束的时候会发出一个中断,我们可以在该中断处理程序内部做进一步的操作(如打印消息等)。