Memory 在Linux内核中分配超过4 MB的固定连续内存

Memory 在Linux内核中分配超过4 MB的固定连续内存,memory,linux-kernel,linux-device-driver,Memory,Linux Kernel,Linux Device Driver,对于与正在构建的PCI设备的一些交互,我们希望创建板可以访问的大型连续内存块。现在,我能分配的最大内存是4兆字节。我想知道是否有任何方法可以创建更大的区域 我知道我可以使用boot选项mem=来实现这一点,但出于numa的原因,我不想走这条路。另一方面,如果有人知道这样做的方法,但将其分布在numa节点上,那就好了 正如我最初所说,我目前被限制在4兆字节。分配目前由完成,但受限制MAX_ORDER是一个编译时常量,我还担心编辑它可能会影响其他地方 谢谢。如果您可以将PCI设备驱动程序编译到内核中

对于与正在构建的PCI设备的一些交互,我们希望创建板可以访问的大型连续内存块。现在,我能分配的最大内存是4兆字节。我想知道是否有任何方法可以创建更大的区域

我知道我可以使用boot选项
mem=
来实现这一点,但出于numa的原因,我不想走这条路。另一方面,如果有人知道这样做的方法,但将其分布在numa节点上,那就好了

正如我最初所说,我目前被限制在4兆字节。分配目前由完成,但受限制
MAX_ORDER
是一个编译时常量,我还担心编辑它可能会影响其他地方


谢谢。

如果您可以将PCI设备驱动程序编译到内核中(即,不作为模块链接),您可以尝试在引导时分配内存。这样就可以绕过动态分配的上限。有关详细信息,请参阅。

(连续内存分配器)是满足您需求的最佳解决方案。您只需使用最新的内核即可。

是的。我以前也见过这个。然而,我真的希望能够做到这一点,而无需重新编译内核。这不是我想负责的事情。@sharth:我想你唯一的选择是增加
MAX\u订单
。内核重新编译不太可取的是您自己的决定。目前,计划是在启动时进行大量分配。然后,查看哪些部分是连续的,其余部分是自由的。不过,我非常喜欢一个更为一致的解决方案。内存段必须是物理上连续的吗?@Michael:是的。否则,我会多次分配4MB的alloc_页面。我只是四处搜索一些关于这方面的后续信息,不知道你是否可以澄清一下。据我所见,您需要执行一个引导时参数来指定应该保留多少内存。如果是这种情况,它与
mem=
选项类似(但更干净、更安全、更好)。此外,从我所看到的,它不是在3.4.4或下一代20120713。它真的被引入主线了吗?@sharth
mem=
强制内核不访问更高的内存,并为驱动程序留下一些内存,但据我所知,用户需要做更多的事情来管理留下的内存。即使内存是空闲/可用的,也不能使用它(bootmem也是如此)。CMA内存可供其他系统使用(主要是用户空间),如果驱动程序需要该内存,内存管理将为驱动程序回收CMA内存。没有浪费。在3.5版本中,CMA现在被合并到主线中,但最新版本是v3.5-rc6,因此您可能需要等待2~3周才能获得3.5版本,或者使用-rc版本。您是对的。它在3.5-rc6中。我完全同意CMA似乎是一个比
mem=
更好的界面。使用未使用的部件进行缓存的能力是一个不错的优势。谢谢你让我知道这件事@莎思:如果您最终使用CMA,请告诉我(或更改您接受的答案)。