从用户模式获取 x86 SMEP CPU 标志

pat*_*lea 1 x86 assembly intel linux-kernel

我正在编写一个用户模式工具,用于监视 CPU 标志的更改,例如来自 CR0 的 WP 和来自 CR4 的 SMEP。我可以使用读取 WP 位,smsw %rax但没有用于读取 CR4(或其 SMEP 位)的类似操作码。

有没有办法从用户模式获取 SMEP 的状态?

Had*_*ais 6

Linux 内核在启动后永远不会更改 SMEP 位。请参阅如何启用/禁用内核 kaslr、smep 和 smap。默认情况下,如果从内核 3.0 开始的处理器支持它,则启用它。因此,如果要检查是否启用了 SMEP,请执行以下操作:

  • 通过cpuid叶 0x7执行检查是否支持 SMEP 。如果 EBX[0x7] 为 1,则处理器支持 SMEP。
  • 如果支持 SMEP,请检查nosmep内核命令行参数列表中是否指定了 。这可以使用sysctl系统调用或类似的东西来完成cat /proc/cmdline | grep nosmep。

如果它在处理器上受支持并且nosmep未指定,则它已启用。否则,它被禁用或不受支持。