我有这个x86设备和一个尝试分配DMA内存的内核模块。它有一个名为dmasize的参数,允许控制已分配内存的大小。
我注意到当dmasize = 2M时分配成功,但如果更大则分配成功。即使在开机时。 我听说CONSISTENT_DMA_SIZE存在限制,但是看看lxr,我找不到arch x86内核3.2。
不确定它是否相关,但这是一台32位机器,内存为8GB,启用了pae。
这是对dma_alloc_coherent的调用:
dma_addr_t dma_handle;
if (!(_dma_vbase = dma_alloc_coherent(0, alloc_size, &dma_handle, GFP_KERNEL)) || !dma_handle) {
gprintk("_alloc_mpool: Kernel failed to allocate the memory pool of size 0x%lx\n", (unsigned long)alloc_size);
return;
}
感谢任何可以提供帮助的人。
答案 0 :(得分:1)
万一有人碰到这个,答案如下: 配置标志CONFIG_FORCE_MAX_ZONEORDER在最多架构下默认为11是导致此限制的原因。
将其增加到12(并重新编译内核)可以解决问题。
我怀疑使用CMA也是可能的,但由于我的内核不支持它,我不能肯定地说。