dma_alloc_coherent 和 dma_alloc_writecombine
2012-02-08 17:04
183 查看
dma_alloc_coherent: 一致性DMA映射
dma_alloc_writecombine: 流式DMA映射
原来 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 则不使用缓存,但是使用写缓冲区。
即一致性 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是物理地址。对任意一个操作都将改变缓冲区内容。当然要注意操作环境。
dma_alloc_writecombine: 流式DMA映射
原来 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 则不使用缓存,但是使用写缓冲区。
即一致性 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是物理地址。对任意一个操作都将改变缓冲区内容。当然要注意操作环境。
相关文章推荐
- dma_alloc_coherent vs. dma_alloc_writecombine
- 内核使用硬件ip的dma,dma_alloc_coherent 与 dma_alloc_writecombine
- dma_alloc_writecombine
- 【Linux开发】linux中关于dma_alloc_coherent的用法
- 【study】DMA内存申请--dma_alloc_coherent 及 寄存器 与 内存
- linux中关于dma_alloc_coherent的用法
- 内核使用硬件ip的dma,dma_alloc_coherent 与 dma_alloc_writecombine
- 内核使用硬件ip的dma,dma_alloc_coherent 与 dma_alloc_writecombine (转)
- 宋宝华:关于DMA ZONE和dma_alloc_coherent若干误解的澄清
- 【引用】DMA内存申请--dma_alloc_coherent
- linux中关于dma_alloc_coherent的用法
- dma_alloc_from_coherent 由于mem为null 返回
- dma_alloc_coherent 分析
- 内核使用硬件ip的dma,dma_alloc_coherent 与 dma_alloc_writecombine
- 宋宝华:关于DMA ZONE和dma_alloc_coherent若干误解的澄清
- dma_alloc_writecombine和dma_alloc_coherent的区别
- 内核使用硬件ip的dma,dma_alloc_coherent 与 dma_alloc_writecombine
- dma_alloc_coherent 与 dma_alloc_writecombine
- dma_alloc_coherent vs. dma_alloc_writecombine
- dma_alloc_coherent的第三个参数dma_handle 分析