我在程序中经常调用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会消耗内核资源,并且每个进程都有一些约束,但不能确定。

最佳答案

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

关于linux - 多次调用后`mprotect`失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23233141/

10-13 06:41