许多调用后,`mprotect`失败

时间:2014-04-23 01:19:26

标签: 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
  }
}

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

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

1 个答案:

答案 0 :(得分:6)

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