Каковы различия между nosmep и noexec = off - PullRequest
2 голосов
/ 11 апреля 2019

Мне интересно различие между этими двумя аргументами в командной строке ядра Linux:

  • поехес = выкл
  • nosmep

В обоих случаях ядру запрещается выполнять код, который находится в пользовательской памяти. Но я не вижу никакой разницы между ними.

Сообщение об ошибке в dmesg отличается, но поведение кажется таким же.

Спасибо

1 Ответ

1 голос
/ 12 апреля 2019

Параметр 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).

...