Linux kernel 当缓冲区>;内核3.2上的2M

Linux kernel 当缓冲区>;内核3.2上的2M,linux-kernel,kernel-module,dma,Linux Kernel,Kernel Module,Dma,我有一个x86设备和一个试图分配DMA内存的内核模块。它有一个名为dmasize的参数,可以控制分配内存的大小 我注意到当dmasize=2M时分配成功,但如果更大,则分配不成功。甚至在开机时。 我听说一致的DMA大小有一个限制,但看看lxr,我找不到arch x86内核3.2的限制 不确定它是否相关,但这是一台32位机器,具有8GB的RAM和支持pae的内核 这是对dma_alloc_相干的调用: dma_addr_t dma_handle; if (!(_dma_vbase = dma_a

我有一个x86设备和一个试图分配DMA内存的内核模块。它有一个名为dmasize的参数,可以控制分配内存的大小

我注意到当dmasize=2M时分配成功,但如果更大,则分配不成功。甚至在开机时。 我听说一致的DMA大小有一个限制,但看看lxr,我找不到arch x86内核3.2的限制

不确定它是否相关,但这是一台32位机器,具有8GB的RAM和支持pae的内核

这是对dma_alloc_相干的调用:

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;
    }

感谢任何能提供帮助的人。

如果有人遇到这个问题,答案如下: config标志config_FORCE_MAX_ZONEORDER(默认值最多为11)是造成此限制的原因

将其增加到12(并重新编译内核)可以修复该问题


我怀疑使用CMA也是可能的,但由于我的内核不支持它,我不能肯定。

您的设备是在ISA还是PCI总线?PCI上。它是否影响函数调用?对于PCI设备,必须设置
dma\u alloc\u coherent
的第一个参数。不管怎么说,大的分配可能需要更多的资源。实际上,这个分配对200万的分配有效。关于CMA,我知道它是在内核3.5中引入的,但正如我所说的,我需要使用内核3.2(我们正在运行debian wheezy)