许多调用后,`mprotect`失败

Inf*_*ite 4 linux memory-management linux-kernel

mprotect经常在我的程序中调用,一段时间后我发现程序失败了.我想这是由于mprotect电话太多,所以我写了一个测试来验证:

#define pagesize 4096
int main(){
  while(1){
     buffer = memalign(pagesize, 4 * pagesize);// allocate some buffer
     mprotect(buffer, pagesize, PROT_NONE)// make the first page inaccessible
  }
}
Run Code Online (Sandbox Code Playgroud)

在大约3万次迭代之后,无论缓冲区的大小如何,mprotect都返回-1.

任何人都可以解释为什么以及如何解决它?我的猜测是mprogtect消耗内核资源,每个进程都有一些约束,但不确定.

oak*_*kad 6

显然,有一个内核参数控制一个进程可以拥有的不同映射的数量,可在以下位置获得/proc/sys/vm/max_map_count.大多数发行版的典型默认映射数为64k - 与mprotect大约30k次迭代失败一致(每次映射一次memalign,每次mprotect正常系统映射另一次映射).增加该限制将允许您分配和保护更多内存区域.

  • 有用.非常感谢.这[link](https://my.vertica.com/docs/4.1/HTML/Master/12962.htm)告诉我们如何临时或永久地增加限制max_map_count. (2认同)