В архитектурах с MMU 1 адрес, который mprotect()
принимает в качестве аргумента, является виртуальным адресом.Каждый процесс имеет свое независимое виртуальное адресное пространство, поэтому есть только две возможности:
- Запрошенный адрес находится в пределах собственного диапазона адресов процесса;или
- Запрошенный адрес находится в пределах диапазона адресов ядра (который отображается в каждом процессе).
mprotect()
работает внутренне, изменяя флаги, прикрепленные к VMA 2 .Первое, что он должен сделать, это найти VMA, соответствующий адресу, который был передан - если переданный адрес был в пределах диапазона адресов ядра, то существует no VMA, и поэтому этот поиск завершится неудачей.То же самое происходит, если вы пытаетесь изменить защиту в области адресного пространства, которая не отображается.
Вы можете увидеть представление VMA в адресном пространстве процесса, изучив /proc/<pid>/smaps
или /proc/<pid>/maps
.
1.Блок управления памятью 2.Область виртуальной памяти, структура данных ядра, описывающая непрерывный участок памяти процесса .