Получение не может выделить память ошибки - PullRequest
0 голосов
/ 28 июля 2011

Я получаю эту ошибку в моей программе ...

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

Объем памяти Iпытаюсь защитить это 60 мб.Может кто-нибудь сказать мне, в чем проблема и как ее можно решить?

Ответы [ 2 ]

2 голосов
/ 28 июля 2011
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, и, глядя на код ошибки, это не обязательно означает, что память не может быть выделена. Возможно, у вас недопустимый диапазон адресов или (что наиболее вероятно) страницы, которые не отображаются.

Не пытайтесь защитить такой большой кусок памяти одним махом. Учитывая, как работает виртуальная память, шансы слишком велики, чтобы не отображать некоторые страницы в этом огромном куске. Вы должны убедиться, что соответствующая страница (страницы) отображается перед вызовом mprotect.

Когда вы используете системные функции, всегда полезно прочитать справочную страницу по этой функции. Тогда перечитайте это. Страницы руководства могут быть немного краткими.

0 голосов
/ 28 июля 2011

Хотя я не думаю, что это ваша проблема, следует также отметить, что mprotect определенно может потерпеть неудачу из-за сбоя выделения, по крайней мере по двум причинам:

  1. Если разрешенияизменяясь только на части VMA, ядру необходимо разделить его на две VMA.Это разделение требует выделения ресурсов и может завершиться ошибкой.(Обратите внимание, что munmap может произойти сбой и по этой же причине!)
  2. При переводе незапятнанной страницы из состояния только для чтения в состояние с возможностью записи это увеличивает плату за фиксацию для процесса.В системе, которая строго запрещает чрезмерную загрузку, это «распределение» начисления может произойти, когда физическая память / своп будут исчерпаны.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...