linux中DMA申请空间的疑问
在linux中kmalloc只能分配128k以下的连续空间,然而DMA传输需要大量的空间,如何在驱动中申请大块的连续空间以供上端传输来的数据经由DMA传到内存中去(不经由...
在linux中kmalloc 只能分配128k以下的连续空间,然而DMA传输需要大量的空间,如何在驱动中申请大块的连续空间以供上端传输来的数据经由DMA传到内存中去(不经由SG模式)?是通过多次调用kmalloc()函数吗?如何判断一个kmalloc申请的空间已满,需要调用另一块空间?是通过函数判断还是中断触发?
展开
1个回答
展开全部
多次 kmalloc 是肯定不行的,dma 内存在物理上要连续.
可以使用 get_free_pages, 然后使用dma_map_single, dma_map_pages, dma_map_sg将之前分配的内存空间映射, 但也不会太大。
dma 内存不光是申请就可以的,因为传输时不经cpu, 所以要对 cache 进行 clean 或 invalidate 操作,上面的方式就不保证 cache 的一致性。
使用 dma_alloc_coherent 申请的保证一致性.
不管那种方式,申请过大内存都存在失败的可能性,不建议一次申请很大内存,申请的小点,加大传输次数。
可以使用 get_free_pages, 然后使用dma_map_single, dma_map_pages, dma_map_sg将之前分配的内存空间映射, 但也不会太大。
dma 内存不光是申请就可以的,因为传输时不经cpu, 所以要对 cache 进行 clean 或 invalidate 操作,上面的方式就不保证 cache 的一致性。
使用 dma_alloc_coherent 申请的保证一致性.
不管那种方式,申请过大内存都存在失败的可能性,不建议一次申请很大内存,申请的小点,加大传输次数。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询