使用dma_sync_single_for_cpu/device时候,由于系统默认咱们处理了cache一致性,此时这两个函数并没有真正去刷cache,所以出现了问题; TODO dma_sync_single_for_cpu/device代码分析。重点在带有coherent,和不带coherent属性时,刷cache的操作; dma_alloc_cohenrent接口分析。重点在带有coherent,和不带coherent属性时,内存...
void * __dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp) { //物理空间页的申请 page = alloc_pages(gfp, order); //对物理空间进行清零cache { unsigned long kaddr = (unsigned long)page_address(page); memset(page_address(page), 0, size); flush_dcache_range(kaddr, ...
void * __dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp) { //物理空间页的申请 page = alloc_pages(gfp, order); //对物理空间进行清零cache { unsigned long kaddr = (unsigned long)page_address(page); memset(page_address(page), 0, size); flush_dcache_range(kaddr, ...
我又另外做了一个测试,就是使用kmalloc申请了一块内存,然后映射到用户空间,这时测出来的速度大约有40MB/s。难道是因为用dma_alloc_coherent申请的这块内存的属性是禁止cache的,而使用kmalloc申请的没有禁止cache吗? 想问下有没有办法能加快访问这一段被mmap的DMA内存?
这样当primaII的SD驱动调用dma_alloc_coherent()的时候,GFP_DMA标记被设置,以指挥内核从DMA ZONE申请内存。但是,其他的外设,mask覆盖了整个4GB,调用dma_alloc_coherent()获得的内存就不需要一定是来自DMA ZONE。 4.dma_alloc_coherent()申请的内存是非cache的吗?
内核驱动对于一致性DMA一般都会用dma_alloc_coherent 不入cache ,因为主要是硬件和ddr交互没必要进cache...
这样当primaII的SD驱动调用dma_alloc_coherent()的时候,GFP_DMA标记被设置,以指挥内核从DMA ZONE申请内存。但是,其他的外设,mask覆盖了整个4GB,调用dma_alloc_coherent()获得的内存就不需要一定是来自DMA ZONE。 4.dma_alloc_coherent()申请的内存是非cache的吗?
dma_alloc_coherent 在 arm 平台上会禁止页表项中的 C (Cacheable) 域以及 B (Bufferable)域。 而dma_alloc_writecombine 只禁止 C (Cacheable) 域. C 代表是否使用高速缓冲存储器, 而 B 代表是否使用写缓冲区。 这样,dma_alloc_writecombine 分配出来的内存不使用缓存,但是会使用写缓冲区。而 dma_alloc_cohe...
这样当primaII的SD驱动调用dma_alloc_coherent()的时候,GFP_DMA标记被设置,以指挥内核从DMA ZONE申请内存。但是,其他的外设,mask覆盖了整个4GB,调用dma_alloc_coherent()获得的内存就不需要一定是来自DMA ZONE。 4.dma_alloc_coherent()申请的内存是非cache的吗?
dma_alloc_coherent crashes kernel module I want to use DMA in a driver that I'm working on. The ultimate goal is to ensure that the data is in physical RAM and not hidden in a cache. For that I was trying to implement a simple test driver before merging it with my current project....