linux - 多次调用后 `mprotect` 失败

标签 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 消耗内核资源并且每个进程都有一些限制,但不确定。

最佳答案

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

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

相关文章:

c++ - C++。从Linux守护程序获取登录用户名

linux - 如何找到 dash-exec 命令的 PID

linux - shell 脚本 - 二级脚本的输入参数

objective-c - 如果在 Objective-c 中作为参数传递,引用是否仍然很弱?

linux-kernel - 如何从内核空间调用 Linux 系统调用?

c - Linux内核模块中的Write函数被重复调用

linux - VMware 虚拟机无法从命令行恢复

c++ - 如果我在 C++ 中的一个线程中分配内存,我可以在另一个线程中取消分配它吗

c++ - 在循环中取消分配内存

c++ - 无法编译内核头文件(libc6-amd64 依赖项)