Получить флаг процессора x86 SMEP из пользовательского режима - PullRequest
1 голос
/ 02 марта 2020

Я пишу инструмент пользовательского режима, который отслеживает изменения флагов ЦП, таких как WP из CR0 и SMEP из CR4. Я могу прочитать бит WP, используя smsw %rax, но нет аналогичного кода операции для чтения CR4 (или его бит SMEP).

Есть ли способ получить состояние SMEP из пользовательского режима?

1 Ответ

6 голосов
/ 02 марта 2020

Ядро Linux никогда не меняет бит SMEP после загрузки. См. Как включить / отключить ядро ​​kaslr, smep и smap . По умолчанию он включен, если поддерживается на процессоре, начиная с ядра 3.0. Поэтому, если вы хотите проверить, включен ли SMEP, выполните следующие действия:

  • Проверьте, поддерживается ли SMEP, выполнив cpuid с листом 0x7. Процессор поддерживает SMEP, если EBX [0x7] равен 1.
  • Если поддерживается SMEP, проверьте, указано ли nosmep в списке аргументов командной строки ядра. Это можно сделать, используя системный вызов sysctl или что-то вроде cat /proc/cmdline | grep nosmep.

Если он поддерживается на процессоре и nosmep не указан, значит, он включен. В противном случае он отключен или не поддерживается.

...