在使用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即Direct Memory Access,是一种允许外设直接存取内存数据而没有CPU参与的技术,当外设对于该块内存的读写完成之后,DMAC通过中断通知CPU,这种技术多用于对数据量和数据传输速度都有很高要求的外设控制,比如显示设备等。 DMA和Cache一致性 我们知道,为了提高系统运行效率,现代的CPU都采用多级缓存结构,其中就包括使用多级...
DMA即Direct Memory Access,是一种允许外设直接存取内存数据而没有CPU参与的技术,当外设对于该块内存的读写完成之后,DMAC通过中断通知CPU,这种技术多用于对数据量和数据传输速度都有很高要求的外设控制,比如显示设备等。 DMA和Cache一致性 我们知道,为了提高系统运行效率,现代的CPU都采用多级缓存结构,其中就包括使用多级...
在ARM Linux的DMA操作中,cache管理是个关键环节。当设备树中存在'dma-coherent'属性时,Linux假设硬件能保持cache一致性,避免在DMA传输期间进行cache操作。使用`dma_map_single`和`dma_unmap_single`时,会根据DMA的方向自动执行clean或invalidate操作,以确保数据一致性。发送数据时,先map为DMA_TO_DEVICE...
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; ...
DMA即Direct Memory Access,是一种允许外设直接存取内存数据而没有CPU参与的技术,当外设对于该块内存的读写完成之后,DMAC通过中断通知CPU,这种技术多用于对数据量和数据传输速度都有很高要求的外设控制,比如显示设备等。 DMA和Cache一致性 我们知道,为了提高系统运行效率,现代的CPU都采用多级缓存结构,其中就包括使用多级...
这两天整理了调用流程,也找到了dma-coherent的用法。Linux的文档里没有详细说明dma-coherent的用法。根据代码,如果dma的设备树里有dma-coherent,Linux则认为硬件会维护cache一致性,不会在dma运行过程中执行cache操作。 dma_map_single/dma_unmap_single的使用 ...