【问题标题】:What are the differences between nosmep and noexec=offnosmep 和 noexec=off 有什么区别
【发布时间】:2019-04-11 19:30:34
【问题描述】:

我想知道 linux 内核命令行中这两个参数之间的区别:

  • noexec=off
  • nosmep

在这两种情况下,它都拒绝内核执行用户空间内存中的代码。 但我看不出它们之间有什么区别。

dmesg 中的错误消息不同,但行为似乎相同。

谢谢

【问题讨论】:

    标签: linux-kernel x86


    【解决方案1】:

    noexec 参数控制内核是否可以使用分页结构的 XD 标志(也称为 NX 标志)来标记不应执行的页面。另一方面,nosmep 参数指定是否启用 SMEP。请注意,nosmep 仅在内核版本和处理器都支持 SMEP 时有效(请参阅:How can i enable/disable kernel kaslr, smep and smap)。另外,XD 仅在内核运行在 64 位或使用 36 位分页且IA32_EFER.NXE 设置为 1 时才有效。

    XD 和 SMEP 标志确定是否可以获取给定内存位置的指令。 SMEP 覆盖 XD,这意味着如果设置了 SMEP,则无论 XD 标志如何,都不允许supervisor-mode 代码从用户页面获取指令(用于执行)。否则,如果不支持或禁用 SMEP,则在以下情况下不允许取指:

    • Supervisor 模式代码尝试从 User 或 Supervisor 页面获取指令,其翻译在至少一个分页结构中的 XD 标志为 1。
    • 用户模式代码尝试从用户页面获取指令,其翻译在至少一个分页结构中的 XD 标志为 1。
    • 用户模式代码尝试从主管页面获取指令。

    在任何这些情况下,都会发生页面错误异常 (#PF)。

    【讨论】:

    • 感谢您的回答。这是我尝试过的:我编写了一个包含函数的 c 程序。我将此函数地址传递给调用它的内核模块。 SMEP 和 SMAP 被禁用。我不明白的是我需要在内核命令行中设置 noexec=off 才能使其工作。你怎么解释?
    • 如果您将这些详细信息放在您的问题中(包括代码),我们或许能够回答该问题。这是您编写的自定义内核模块吗?
    猜你喜欢
    • 2015-08-14
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多