我在我的程序中频繁调用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/