【问题标题】:A trivial SYSENTER/SYSCALL question一个微不足道的 SYSENTER/SYSCALL 问题
【发布时间】:2010-12-11 05:57:23
【问题描述】:

如果 Windows 可执行文件使用 SYSENTER 并在实现 AMD64 ISA 的处理器上执行,会发生什么情况?我是这个主题(操作系统、硬件/软件交互)的新手和新手,但从我所读到的内容中,我了解到 SYSCALL 是 AMD64,相当于英特尔的 SYSENTER。希望这个问题有意义。

【问题讨论】:

  • 这不是微不足道的......你所说的“发生了什么?”是什么意思。您想知道它是如何处理的,还是只是想知道它是否有效。附加信息会很好
  • 主要是我想知道它是否有效。但是知道实际发生的事情不会有什么坏处吗?其中一个答案中提供的 wiki 文章指出“AMD64 在长模式的两个子模式中都缺少 SYSENTER 和 SYSEXIT”。如果我有三个 x86-64 PE,一个使用 INT 0x2E,一个 SYSENTER 和一个 SYSCALL,它们都可以在 x86-64 实现处理器上工作以跳转到内核空间吗?
  • nynaeve.net/?p=48这篇博文至少回答了我Windows中的系统调用调度器是如何选择入口方式的。

标签: operating-system system-calls


【解决方案1】:

如果您尝试在不支持的情况下使用 SYSENTER,您可能会收到“无效操作码”异常。 请注意,这种情况并不常见 - 通常,Windows 可执行文件不直接包含进入内核模式的指令。

【讨论】:

  • 是的,Windows 上通常的做法是调用一个 DLL,其中包含调用内核的代码。
  • 事实上,直接进行系统调用通常会将您的 exe 检测为病毒。
【解决方案2】:

据我所知,AM64 处理器使用不同类型的模式来处理此类问题。

SYSENTER 工作正常,但没那么快。

一个非常有用的网站,可以帮助您了解不同的模式: Wikipedia

【讨论】:

    【解决方案3】:

    他们在开发 AMD64 扩展时去掉了一堆未使用的功能。其中主要的一项是取消了 cs、ds、es 和 ss 段寄存器。通常加载段寄存器是一项极其昂贵的操作(CPU 必须进行权限检查,这可能涉及多次内存访问)。进入内核模式需要加载新的段寄存器值。

    SYSENTER 指令通过一组“影子寄存器”来加速这一过程,这些寄存器可以直接复制到(内部、隐藏)段描述符,而无需进行任何权限检查。仅使用几个段寄存器就失去了大部分好处,因此删除对指令的支持很可能是因为使用常规指令进行模式切换更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-11
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      相关资源
      最近更新 更多