有一个x86指令sysenter
。这似乎是英特尔快速系统调用方法。SYSENTER
似乎在 Intel 处理器上的 LONG 模式(64 位)下有效。由于 AMD 提供的syscall
.根据我的理解,这条指令就像 asyscall
但用户有责任使用 EIP/ESP 等进行设置。
您可以看到sysenter
32 位的参数列表。绝对不关注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 位代码,但我不确定它会做任何有用的事情。