我一直使用dma_alloc_coherent()分配带有标志GFP_KERNEL的DMA缓冲区,并且到目前为止还没有观察到问题,我的理解是两个标志都允许调用者也进入睡眠状态。
所以我很好奇在这种情况下GFP_DMA选项是否真的有用?该标志也可用于kmalloc(),但是我们不应该使用kmalloc()来分配DMA缓冲区,而只能使用dma api吗?
答案 0 :(得分:0)
经过研究,我发现LLD第三版第8章的声明如下:
每当分配一个新页面以满足内存分配请求时,内核就会建立一个可在搜索中使用的区域列表。如果指定了_ _GFP_DMA,则仅搜索DMA区域:如果低地址处没有可用的内存,分配将失败。如果不存在特殊标志,则将同时搜索普通存储器和DMA存储器。
看起来标志GFP_DMA是GFP_KERNEL的子集。
答案 1 :(得分:0)
dma_alloc_coherent()返回已经设置了适当内存属性的地址范围,因此可以自然处理缓存效果。我们不需要对这些地址进行任何缓存操作。
如果将kmalloc()分配的地址用于DMA操作,则需要进行额外的缓存操作,例如根据传输方向进行缓存清理和缓存失效。
GFP_DMA标志仅从32位计算机上的DMA区域分配内存。