dma_alloc_coherent 在 arm 平台上会禁止页表项中的 C (Cacheable) 域以及 B (Bufferable)域。而 dma_alloc_writecombine 只禁止 C (Cacheable) 域. C 代表是否使用高速缓冲存储器, 而 B 代表是否使用写缓冲区。 这样,dma_alloc_writecombine 分配出来的内存不使用缓存,但是会使用写缓冲区。而 dma_alloc_cohe...
#define pgprot_writecombine(prot) __pgprot(pgprot_val(prot) &~L_PTE_CACHEABLE) 由上面代码可以看出,两个函数都调用了__dma_alloc函数,区别只在于最后一个参数。 dma_alloc_coherent 在 arm 平台上会禁止页表项中的 C (Cacheable) 域以及 B (Bufferable)域。而 dma_alloc_writecombine 只禁止 C (Cacheab...
dma_alloc_coherent 在 arm 平台上会禁止页表项中的 C (Cacheable) 域以及 B (Bufferable)域。而 dma_alloc_writecombine 只禁止 C (Cacheable) 域. C 代表是否使用高速缓冲存储器, 而 B 代表是否使用写缓冲区。 这样,dma_alloc_writecombine 分配出来的内存不使用缓存,但是会使用写缓冲区。而 dma_alloc_cohe...
这样, dma_alloc_writecombine 分配出来的内存不使用缓存,但是会使用写缓冲区。 而dma_alloc_coherent 则二者都不适用。 由此,再去理解 LDD3上讲解的一致性 DMA映射 与流式 DMA 映射就比较容易了,一致性 DMA映射(dma_alloc_coherent )调用的是上面的函数, 由于关闭了 cache/buffer,性能自然比较低。 而流式则通...
buf->addr = SRAM_DMA_PHYS_CAPTURE; }#elsebuf->area =dma_alloc_writecombine(pcm->card->dev, size, &buf->addr, GFP_KERNEL);#endifif(!buf->area)return-ENOMEM; buf->bytes = size; DBG("%s: size %d\n",__FUNCTION__, size);return0; ...
这样, dma_alloc_writecombine 分配出来的内存不使用缓存,但是会使用写缓冲区。 而dma_alloc_coherent 则二者都不适用。 由此,再去理解 LDD3上讲解的一致性 DMA映射 与流式 DMA 映射就比较容易了,一致性 DMA映射(dma_alloc_coherent )调用的是上面的函数, 由于关闭了 cache/buffer,性能自然比较低。 而流式则通...
A = dma_alloc_writecombine(struct device *dev, size_t size,dma_addr_t *handle, gfp_t gfp); 含义: A : 内存的虚拟起始地址,在内核要用此地址来操作所分配的内存 dev : 可以平台初始化里指定,主要是用到dma_mask之类参数,可参考framebuffer ...
这两天在做 DMA 相关开发, 遇到一对分配 dma buffer 的函数,dma_alloc_coherent 与 dma_alloc_writecombine。 不知其区别。 google 一下也没有得到信息。只好自己看代码。 原来dma_alloc_coherent 在 arm 平台上会禁止页表项中的 C (Cacheable) 域以及 B (Bufferable)域。
DMA是直接操作总线地址的,这里先当作物理地址来看待吧(系统总线地址和物理地址只是观察内存的角度不同)。如果cache缓存的内存区域不包括DMA分配到的区域,那么就没有一致性的问题。但是如果cache缓存包括了DMA目的地址的话,会出现什么什么问题呢?问题出在,经过DMA操作,cache缓存对应的内存数据已经被修改了,而CPU本身不...