获取不能分配内存错误

我在我的程序中得到这个错误…

mprotect: Cannot allocate memory 

ulimit -a给出输出:

 core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 20 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 

我试图保护的内存量是60 MB。 有人能告诉我什么是问题,以及如何解决?

 Return Value On success, mprotect() returns zero. On error, -1 is returned, and errno is set appropriately. Errors EACCES The memory cannot be given the specified access. This can happen, for example, if you mmap(2) a file to which you have read-only access, then ask mprotect() to mark it PROT_WRITE. EFAULT The memory cannot be accessed. EINVAL addr is not a valid pointer, or not a multiple of PAGESIZE. ENOMEM Internal kernel structures could not be allocated. Or: addresses in the range [addr, addr+len] are invalid for the address space of the process, or specify one or more pages that are not mapped. 

鉴于错误消息,您可能会遇到ENOMEM错误,并查看错误代码,这并不一定意味着无法分配内存。 你可能有一个无效的地址范围,或者(很有可能)你有没有被映射的页面。

不要试图保护这么大的记忆在一个膨胀foop。 鉴于虚拟内存如何工作,可能性太高,以至于大块中的某些页面将不会被映射。 在调用mprotect之前,您需要确保映射的页面(页面)已被映射。

在使用系统函数时,读取该函数的手册页总是一个好主意。 然后重新阅读。 手册页有时可能有点简洁。

虽然我不认为这是您的问题,但也应该注意, mprotect肯定会因分配失败而失败,至少有两个原因:

  1. 如果权限仅在VMA的一部分上进行更改,则内核需要将其分割为两个VMA。 这种拆分需要资源分配,并可能会失败。 (请注意, munmap也可能出于同样的原因失败!)
  2. 当将一个尚未被肮脏的页面从只读状态改变为可写状态时,这会增加该过程的提交费用。 在严格禁止过量使用的系统上,当物理内存/交换耗尽时,这个“分配”提交费用可能会失败。