在使用DMA的时候,外设(比如网卡)过来的数据会不经过CPU直接传送到内存,这时内存中的数据就比对应cache中的数据要新,同样需要使对应的cache无效(invalidate),这样CPU下次读取这条cache line里的数据的时候,才能知道这些数据不是最新的,从而从内存更新。 CPU从内存中读取数据到cache line的操作为load,将cache line中的...
1.DMA和cache一致性 (1)不带CACHE 自己写驱动,申请DMA,可以用Coherent DMA buffers void*dma_alloc_coherent(structdevice*dev,size_tsize,dma_addr_t *dma_handle,gfp_tflag); voiddma_free_coherent(structdevice*dev,size_tsize,void*cpu_addr, dma_addr_tdma_handle); 1. 2. 3. 4. 5. CMA和此AP...
因为当有coherent属性的时候,这时候分配的内存带有cache了(没有coherent属性默认地址是不带cache的);而且系统会默认咱们硬件会处理cache一致性; 使用dma_sync_single_for_cpu/device时候,由于系统默认咱们处理了cache一致性,此时这两个函数并没有真正去刷cache,所以出现了问题; TODO dma_sync_single_for_cpu/device代...
可以看到,大部分的驱动实际上在描述符内存的应用上,都是使用的coherent的方式,要么都是cacheable,由硬件维护一致性,要么都是noncacheable,数据直接到DDR中,这样也能保持一致性(这个应该是底线要求,也是驱动默认的使用dma_alloc_cohorent接口的原因); 当然可能有些系统,处于某种原因,需要使用dma_alloc_noncoherent接口,...
DMA访问的一致性 DMA对内存是直接访问的,而CPU对内存的访问有时会通过cache。不管是CPU还是DMA访问内存,都需要确保cache的一致性。本文只分析从DMA的角度,对内存的访问如何确保cache的一致性。个人理解,通常为保证cache的一致性,在DMA访问内存前后,对cache要有下面必要的操作。
DMA即Direct Memory Access,是一种允许外设直接存取内存数据而没有CPU参与的技术,当外设对于该块内存的读写完成之后,DMAC通过中断通知CPU,这种技术多用于对数据量和数据传输速度都有很高要求的外设控制,比如显示设备等。 DMA和Cache一致性 我们知道,为了提高系统运行效率,现代的CPU都采用多级缓存结构,其中就包括使用多级...
DMA即Direct MemoryAccess,是一种允许外设直接存取内存数据而没有CPU参与的技术,当外设对于该块内存的读写完成之后,DMAC通过中断通知CPU,这种技术多用于对数据量和数据传输速度都有很高要求的外设控制,如显示设备等。 DMA和Cache一致性 我们知道,为了提高系统运行效率,现代的CPU都采用多级缓存结构,其中就包括使用多级Cach...
DMA即Direct Memory Access,是一种允许外设直接存取内存数据而没有CPU参与的技术,当外设对于该块内存的读写完成之后,DMAC通过中断通知CPU,这种技术多用于对数据量和数据传输速度都有很高要求的外设控制,比如显示设备等。 DMA和Cache一致性 我们知道,为了提高系统运行效率,现代的CPU都采用多级缓存结构,其中就包括使用多级...
Coherent DMA(一致性DMA) Coherent DMA访问内存地址时不过cache,是cache-coherence设备,采用Consistent mapping的API进行内存申请; Streaming DMA(流式DMA) Streaming DMA在访问内存地址时经过cache,是non-coherence设备,通常采用streaming mapping的API进行内存申请,在单次DMA传输时进行map,在传输完成后进行unmap; ...
drivers\net\ethernet\cadence\macb_main.c的函数macb_tx_map()里,调用dma_map_single()刷新cache,macb_tx_interrupt()的macb_tx_unmap()再调用dma_unmap_single()。 代码简化后如下: macb_tx_map( ) { ... mapping = dma_map_single(&bp->pdev->dev, skb->...