您的位置:首页 > 运维架构 > Linux

PCIe之DMA (一)

2016-07-06 21:15 246 查看

DMA概念

DMA的英文拼写是“Direct Memory Access”,汉语的意思就是直接内存访问。

内存与内存(外设)交换数据不经过CPU。

使用DMA的好处就是它不需要CPU的干预而直接服务外设,这样CPU就可以去处理别的事务,从而提高系统的效率,对于慢速设备,如UART,其作用只是降低CPU的使用率,但对于高速设备,如硬盘,它不只是降低CPU的使用率,而且能大大提高硬件设备的吞吐量。因为对于这种设备,CPU直接供应数据的速度太低。 因CPU只能一个总线周期最多存取一次总线,而且对于ARM,它不能把内存中A地址的值直接搬到B地址。它只能先把A地址的值搬到一个寄存器,然后再从这个寄存器搬到B地址。也就是说,对于ARM,要花费两个总线周期才能将A地址的值送到B地址。而DMA就不同了,一般系统中的DMA都有突发(Burst)传输的能力,在这种模式下,DMA能一次传输几个甚至几十个字节的数据,所以使用DMA能使设备的吞吐能力大为增强。

//不使用DMA的情况
char *src;
char *dst;
char len = 256;
for(int i=0;i<256;i++)
{
*dst++=*src++; //需要cpu参与
}
.....
//如果使用DMA
char *src;
char *dst;
char *len;

dma_src_regadr = src;
dma_dst_regadr = dst;
dma_trans_len = 8;
dma_addr_inc = 1; //1bit
dmaenable = 1;
......
//总结 使用DMA只是在初始化阶段配置DMAC的寄存器,之后内存到内存(外设)数据的传输和CPU无关了


对于任何类型的DMA传输,我们都需要规定数据的起始源和目标地址。对于外设DMA的情况来说,外设的FIFO可以作为数据源或者目标端。当外设作为源端时,某个存储器的位置(内部或外部)则成为目标端地址。当外设作为目标端,存储的位置(内部或者外部)则成为源端地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux-DMA