文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>DMA

DMA

时间:2010-09-13  来源:chen202052428

dma_alloc_coherent 与 dma_alloc_writecombine。   原来 dma_alloc_coherent 在 arm 平台上会禁止页表项中的 C (Cacheable) 域以及 B (Bufferable)域。 而 dma_alloc_writecombine 只禁止 C (Cacheable) 域. #define pgprot_noncached(prot)  __pgprot(pgprot_val(prot) & ~(L_PTE_CACHEABLE | L_PTE_BUFFERABLE))
#define pgprot_writecombine(prot) __pgprot(pgprot_val(prot) & ~L_PTE_CACHEABLE)
进一步查找 ARM 书籍, 原来 C 代表是否使用高速缓冲存储器, 而 W 代表是否使用写缓冲区。 这样, dma_alloc_coherent  分配出来的内存不使用缓存,但是会使用写缓冲区。 而 dma_alloc_writecombine 则二者都不适用。
 
由此,再去理解 LDD3 上讲解的一致性 DMA 映射 与 流式 DMA 映射就比较容易了,一致性 DMA 映射调用的是上面的函数,   由于关闭了 cache/buffer, 性能自然比较低。 而流式则通过复杂的同步机制,没有付出性能的代价。 所以我们要尽量使用流式 DMA 来编程。   再去看看 mmc 驱动里使用的 分散 / 聚集映射, 原来也是一种 流式 DMA 映射   【补充】 讲了那么多没用,总结下用法: 1、页对齐内存大小:dma_map_size = PAGE_ALIGN(MY_DATA_SIZE + PAGE_SIZE); MY_DATA_SIZE是你想分配的大小. 2、调用
A = dma_alloc_writecombine(B,C,D,GFP_KERNEL);
含义: A: 内存的虚拟起始地址,在内核要用此地址来操作所分配的内存 B: struct device指针,可以平台初始化里指定,主要是dma_mask之类,可参考framebuffer C: 实际分配大小,传入dma_map_size即可 D: 返回的内存物理地址,dma就可以用。 所以,A和D是一一对应的,只不过,A是虚拟地址,而D是物理地址。对任意一个操作都将改变缓冲区内容。当然要注意操作环境。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lanmanck/archive/2009/11/05/4773175.aspx
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载