Параметр noexec
определяет, может ли ядро использовать флаг XD (также называемый флагом NX) структур подкачки для маркировки страниц, которые не должны быть исполняемыми как таковые.Параметр nosmep
, с другой стороны, указывает, включен ли SMEP.Обратите внимание, что nosmep
действует только тогда, когда версия ядра и процессор поддерживают SMEP (см .: Как включить / отключить ядро kaslr, smep и smap ).Кроме того, XD действует только в том случае, если ядро работает в 64-битном режиме или использует 36-битный пейджинг, а для IA32_EFER.NXE
установлено значение 1.
Флаги XD и SMEP определяют, будет ли инструкция на данномместо в памяти можно получить.SMEP переопределяет XD, что означает, что если установлен SMEP, коду в режиме супервизора не разрешается извлекать инструкции (для выполнения) со страницы пользователя независимо от флага XD.В противном случае, если SMEP не поддерживается или отключен, выборка инструкций не разрешается в следующих случаях:
- Код режима супервизора пытается извлечь инструкции со страницы пользователя или супервизора с переводом, флаг XD которого равен 1по крайней мере в одной из структур подкачки.
- Код пользовательского режима пытается извлечь инструкции со страницы пользователя с переводом, флаг XD которого равен 1, по крайней мере, в одной из структур подкачки.
- Код пользовательского режима пытается получить инструкции со страницы супервизора.
В любом из этих случаев возникает исключение ошибки страницы (#PF).