Linux 上 64 位长模式下的 SYSENTER 有何作用?

Linux 上 64 位长模式下的 SYSENTER 有何作用?

有一个x86指令sysenter。这似乎是英特尔快速系统调用方法。SYSENTER似乎在 Intel 处理器上的 LONG 模式(64 位)下有效。由于 AMD 提供的syscall.根据我的理解,这条指令就像 asyscall但用户有责任使用 EIP/ESP 等进行设置。

您可以看到sysenter32 位的参数列表。绝对不关注syscall和,当芯片处于长模式时,int 0x80该指令在 Linux 中做什么?sysenter照原样有什么用吗?

答案1

提供对系统调用的访问的 CPU 指令并不存在于真空中:它们仅在操作系统 ABI 的上下文中确定时才有用。64 位 x86 Linux ABI支持以下入口点(详细信息低水温网络):

  • SYSCALL来自 64 位代码;
  • 来自 32 位和 64 位代码的中断 0x80;
  • SYSENTER来自 32 位代码。

(内核中记录的额外 32 位SYSCALL可能会令人困惑 - 它是 x32 系统调用接口,它使用 64 位代码中的 32 位指针。)

从用户空间来看,事情更简单:

  • i386代码(带有 32 位指针的 32 位代码)应__kernel_vsyscall在 vDSO 中使用(这决定了使用哪种调用机制);
  • 其他任何东西都应该使用SYSCALL.

我还没有尝试SYSENTER在长模式下发出 64 位代码,但我不确定它会做任何有用的事情。

相关内容