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

21
为了与正在构建的PCI设备进行一些交互,我们希望创建大块连续的内存,以便板子可以访问。目前为止,我能够分配的最大内存块大小是4兆字节。我想知道是否有任何方法可以创建更大的区域。
我知道我可以使用引导选项mem=来做到这一点,但出于NUMA原因,我宁愿不选择这条路。如果有人知道一种方法可以在NUMA节点上分布它,那就没问题了。
正如我一开始说的,我目前受到4兆字节的限制。目前的分配是由__alloc_pages完成的,它受到MAX_ORDER的限制。MAX_ORDER是一个编译时常量,我还担心对其进行编辑可能会影响其他地方。
谢谢。

内存段必须物理上连续吗? - Michael Foukarakis
1
@Michael:是的。否则,我只会使用__alloc_pages分配多次4MB。 - Bill Lynch
2个回答

9
如果您可以将PCI设备驱动程序编译到内核中(即不作为模块链接),那么您可以尝试在启动时分配内存。这应该可以让您绕过动态分配的上限。有关详细信息,请参阅《Linux设备驱动程序》第3版第8章的相关部分

是的,我之前也见过这个。然而,我真的想能够在不重新编译内核的情况下完成这个操作。这不是我想要负责的事情。 - Bill Lynch
@sharth:我认为你唯一的另一个选择是增加MAX_ORDER。哪个内核重新编译更不可取,这取决于你自己。 - Karmastan
目前的计划是在启动时进行大量的分配。然后,查看哪些部分是连续的,并释放其余部分。我更喜欢一个更一致的解决方案。 - Bill Lynch

1

CMA(Contiguous Memory Allocator)在我看来是满足您需求的最佳解决方案。您只需要升级到最新的内核即可。


我刚刚在网上搜索了一些关于这个问题的后续信息,想知道你能否澄清一下。据我所见,需要在引导时传递参数来指定应保留多少内存。如果是这种情况,它类似于(但更清洁、更安全、更好)mem=选项。另外,据我所见,在3.4.4或next-20120713中没有发现这个选项。它真的被纳入主干了吗? - Bill Lynch
@sharth mem=强制内核不访问更高的内存,并留下一些内存供驱动程序使用,但据我所知,用户需要做更多的事情来管理剩余的内存。即使是空闲/可用的内存(引导内存也是如此),也不能使用那些内存。CMA内存可以被其他系统(主要是用户空间)使用,如果驱动程序需要该内存,则内存管理将为驱动程序回收CMA内存。没有浪费。现在CMA已经合并到主线中,在3.5中,但最新版本是v3.5-rc6,因此您可能需要等待2~3周才能使用3.5或使用-rc版本。 - Lai Jiangshan
你说得对。它在3.5-rc6中。我完全同意CMA似乎比mem=无聊得多的界面要好得多。而且能够使用未使用的部分进行缓存是一个很棒的奖励。谢谢你让我知道这个! - Bill Lynch
@sharth:如果你最终使用了CMA,请告诉我(或更改你接受的答案)。 - Lai Jiangshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接