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.
Когда вы используете системные функции, всегда полезно прочитать справочную страницу по этой функции. Тогда перечитайте это. Страницы руководства могут быть немного краткими.