我在程序中经常调用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/