出于教育目的,我正在计算可以在 Linux 上分配多少虚拟内存。在 x86_64 上,结果分配了 128TB 虚拟内存,如文档中所示。但在arm64上,我只设法分配了170TB的虚拟内存,尽管文档说是256Tb。我想了解是什么阻止我分配 256TB 虚拟内存。
所以我写了一个程序
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
int main() {
char *chars;
size_t nbytes;
while(chars != MAP_FAILED) {
nbytes += 0x10000000000; // 1TB
chars = mmap(
NULL,
nbytes,
PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS,
-1,
0
);
munmap(chars, nbytes);
}
printf("Allocated %ld total TB\n", nbytes/1024/1024/1024/1024);
exit(EXIT_FAILURE);
}
设置过量使用的参数:
echo 1 > /proc/sys/vm/overcommit_memory
得到结果:
Allocated 171 total TB
我尝试增加参数:
sysctl -w vm.max_map_count=655300000
ulimit -l unlimited
但没有任何帮助。
我的内核参数:
# grep CONFIG_ARM64_VA_BITS /boot/config-$(uname -r)
# CONFIG_ARM64_VA_BITS_39 is not set
CONFIG_ARM64_VA_BITS_48=y
CONFIG_ARM64_VA_BITS=48
# grep CONFIG_ARM64_PA_BITS /boot/config-$(uname -r)
CONFIG_ARM64_PA_BITS_48=y
CONFIG_ARM64_PA_BITS=48
我的系统:
ARM Cortex A53 (ARMv8) - 1GB RAM
5.15.0-1034-raspi #37-Ubuntu SMP PREEMPT
# free -m
total used free shared buff/cache available
Mem: 905 198 346 3 360 616
你不能神奇地创建虚拟内存。虚拟内存的数量取决于可用物理内存的数量。在具有 1GB RAM 的 Raspberry Pi 3 上分配 256TB 虚拟内存是不会发生的,虚拟内存依赖于您的物理 RAM,因此可用量受到实际可用量的限制。