我的物理内存为4G,我使用的是32位的Android x86,已启用HIGHMEM4G。我想尽可能扩大vmalloc()空间。

正如我尝试的那样,如果更改为2G / 2G VMsplit并使VMALLOC_RESERVED更大,则vmalloc()空间有望达到1G。但是如果我想获得更大的vmalloc(),例如2G,有可能吗?

Vmalloc()从ZONE_HIGHMEM和ZONE_NORMAL进行分配。如果我有足够的物理内存,则ZONE_HIGHMEM足够大。可以使vmalloc()达到2G以上吗?还是vmalloc()受其虚拟空间限制,所以如果内核虚拟空间总计为2G,vmalloc()绝对不能大于它吗?

最佳答案

您可以接近2G(在2G / 2G拆分中),但是当您这样做时,正常区域会缩小。
大多数内核分配都是在正常区域完成的,因此您会开始看到那里的资源短缺,从而导致严重的问题。

将VMALLOC_RESERVE从1G增加到2G通常是不好的选择。例如。从1G迁移到1.5G时,您的vmalloc增加了50%,但正常区域缩小了一半。随着接近2G,权衡变得更糟。

我最好的建议是更改您的代码,以免使用过多的vmalloc
您可以改用kmalloc__get_free_pages
或者,您可以考虑为什么实际上需要那么多内核内存。

07-25 23:20