Изменяет ли mmap флаги, хранящиеся в таблице страниц?
Насколько мне известно,
MMAP может использоваться для изменения защиты отображаемой области памяти.
Например, если я хочу добавить исполняемый файл разрешения
на одну из моих страниц стека
который изначально установлен как доступное для чтения и записи разрешение
из-за политики выполнения данных (DEP).
И это разрешение отражено на флагах таблицы страниц, таких как W/XD в архитектуре x86.
Так что мой вопрос: если я изменю разрешение конкретной страницы, используя MMAP,
запрашивает ли ядро изменение флагов таблицы страниц?
и он автоматически очищает TLB?
Благодарю.
1 ответ
TL;DR, в C/C++ обертывает системный вызов с тем же именем. Он используется для сопоставления новой памяти с выравниванием по страницам с адресным пространством вызывающего процесса. Он лениво изменяет таблицу страниц, то есть добавляет только запись в
vm_area_struct
когда звонили. Позже, когда вы впервые обращаетесь к возвращенной памяти, модификация таблицы страниц происходит в результате ошибки страницы. Таким образом, он изменяет таблицу страниц только при первом доступе. Итак, ясно, что для выделения новых страниц (что и происходит) их флаги защиты должны быть известны .
Так как используется для сопоставления новых страниц памяти, используется для изменения флагов/битов защиты уже сопоставленной памяти. Он также изменяет таблицу страниц, чтобы о новой защите знали все потоки/процессы, совместно использующие память.
Как я уже говорил,
mmap
а также
mprotect
оба системных вызова выполняются в режиме ядра; из соображений безопасности ни один процесс пользовательского пространства не может изменять свою таблицу страниц.
Надеюсь, этот краткий ответ поможет.