【问题标题】:Get x86 SMEP CPU flag from user mode从用户模式获取 x86 SMEP CPU 标志
【发布时间】:2020-03-02 13:15:39
【问题描述】:

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

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

【问题讨论】:

  • 不太可能。 SMSW 不是特权指令的唯一原因是为了与 80286 兼容。

标签: assembly linux-kernel x86 intel


【解决方案1】:

Linux 内核在启动后从不更改 SMEP 位。见How can i enable/disable kernel kaslr, smep and smap。默认情况下,如果从内核 3.0 开始的处理器支持它,它就会启用。因此,如果您想检查是否启用了 SMEP,请执行以下操作:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2017-07-25
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    相关资源
    最近更新 更多