DMA那些事儿

本文探讨了DMA在Linux内核中的应用,包括如何保证一致性DMA缓冲区,使用dma_alloc_coherent分配内存,以及流式DMA的工作原理。重点讲述了DMA写需flush cache,DMA读需invalid cache以确保数据一致性。此外,还提到了ARM处理器中对cache的操作,如outer_inv_range等。
摘要由CSDN通过智能技术生成

在VIP群里,大家讨论热烈,完全可以看得出来大家都Linux技术和嵌入式技术等渴望和热诚,欢迎大家加入笨叔的VIP私密群,一起研究技术,一起奔跑,一起成长。

关于DMA

图片

有朋友问有关DMA的相关问题,那么大家在编写驱动的时候需要额外小心敬慎。因为DMA的问题主要会影响cache的一致性。那linux内核里面提供了不少的API来帮助大家实现DMA的操作。

我们知道DMA使用的物理内存,那么在内核中主要有两类的接口来分配物理内存

*  __get_free_page()和alloc_page()来分配以页为单位的物理内存

* kmalloc() 和 kmem_cache_alloc()来分配以字节为单位的物理内存

上述两个接口分配的内存都可以作为DMA buffer的原材料。但是我们系统分配的物理内存都是cachable的,也就是打开cache功能的。另外DMA engine在做DMA传输的时候是不需要CPU参与的,所以从这个角度来看,同一个cache line有可能CPU和DMA engine都能访问到,那就会导致cache line被破坏了,那如何去保证DMA操作的时候,cache这个捣蛋鬼不来捣乱呢?

一个简单的想法就是,我们在做DMA传输的时候,这段buffer我把cache给关闭了,这个就是kernel实现的一致性的DMA buffer mapping的(英文叫做:Consistent DMA mappings)。这里consistent的意思是synchronize或者conherent的意思,CPU和DMA这两个哥们都能同时看到数据的改变,不需要软件做额外的一些flush动作。核心函数是:

dma_addr_t dma_handle;

cpu_addr = dma_alloc_coherent(dev, size, &dma_handle, gfp);

  1. 这个函数返回两个值,其中cpu_addr是虚拟地址,CPU可以通过这个地址来访问这段buffer࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值