nosmep和noexec = off有什么区别

时间:2019-04-11 19:30:34

标签: linux-kernel x86

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

  • noexec = off
  • nosmep

在两种情况下,它都拒绝内核执行用户区内存中的代码。 但是我看不到它们之间的任何区别。

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

谢谢

1 个答案:

答案 0 :(得分:1)

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

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

  • Supervisor模式代码尝试从至少一个分页结构中的XD标志为1的转换的用户或Supervisor页面获取指令。
  • 用户模式代码尝试从至少一个分页结构中的XD标志为1的转换的用户页面中获取指令。
  • 用户模式代码尝试从Supervisor页面获取指令。

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

相关问题