以下代码会产生errno 12 cannot allocate memory
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <memory.h>
#include <errno.h>
int main()
{
char* p;
for (size_t i = 0; i < 0x10000; i++)
{
char* addr = (char*)0xAAA00000000uL - i * 0x2000;
p = mmap(addr, 0x1000,
PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (p != addr) {
printf("%lu %d\n", i, errno);
getchar();
return 1;
}
memset(p, 'A' + (i % 26), 0x1000);
}
return 0;
}
我的机器上的输出是 65510 12
。
但是,如果我们将每个页面的大小从 0x1000 更改为 0x2000,即使它使用更多内存,分配也会成功。我认为唯一的区别是连续页数,这有限制吗?如果是这样,如何将其设置为无限?
回答1
似乎将 /proc/sys/vm/max_map_count
设置为更大的数字可以解决问题。参考:https://stackoverflow.com/questions/11683850/how-much-memory-could-vm-use