我经常在我的程序中调用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消耗内核资源,每个进程都有一些约束,但不确定。
答案 0 :(得分:6)
显然,有一个内核参数控制进程可以拥有的不同映射的数量,可在/proc/sys/vm/max_map_count
处获得。大多数发行版的典型默认映射数为64k - 与mprotect
在约30k次迭代时失败一致(每memalign
一个映射,另一个mprotect
+一些正常系统映射失败)。增加该限制将允许您分配和保护更多的内存区域。