嵌入式linux,dma_alloc_coherent再释放再申请多次偶会出现页分配失败,有什么办

嵌入式linux,dma_alloc_coherent再释放再申请多次偶会出现页分配失败,有什么办,第1张

dma_alloc_coherent在arm中大小有限制,大概为2M。分配内存在内核中以链表的形式存在。如果分配大小不一的内存造成碎片或其它程序也在用dma_alloc_coherent,则分配失败也是正常的。当然理论上你可以修改区间大小,但是我没试过。

多次 kmalloc 是肯定不行的,dma 内存在物理上要连续.

可以使用 get_free_pages, 然后使用dma_map_single, dma_map_pages, dma_map_sg将之前分配的内存空间映射, 但也不会太大。

dma 内存不光是申请就可以的,因为传输时不经cpu, 所以要对 cache 进行 clean 或 invalidate *** 作,上面的方式就不保证 cache 的一致性。

使用 dma_alloc_coherent 申请的保证一致性.

不管那种方式,申请过大内存都存在失败的可能性,不建议一次申请很大内存,申请的小点,加大传输次数。

从硬件上来说,dma engine即dma引擎,就是dma控制器;从软件上来说,其实就是一个dma框架,在该框架下针对你的具体的dma控制器开发出dma驱动,然后其他drivers比如audio,network,crypto等就都可以调用统一的dma相关的api来使用你的dma。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8308210.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-15
下一篇2023-04-15

发表评论

登录后才能评论

评论列表(0条)

    保存