在 syscall 或 sysenter 之间挣扎(Windows)

逆向工程 视窗 操作系统 系统调用
2021-07-03 05:36:34

据我了解,从 windows xp 开始,sysenter引入了一条指令,而不是“int 2e”中断。但是在 win 10 上syscall,ntdll 中使用了指令。那么sysenter仅用于 x86 windows 系统吗?并且syscall仅适用于 x64 位系统?

2个回答

Intel 和 AMD 指令集相似但不完全相同。

有很多这样的例子:FMA3/FMA4、AMD-V 和 VT-x(及其扩展)等。

快速系统调用接口是另一个不同之处。

  • 英特尔支持SYSENTER所有模式1 - 传统模式(或者,仅在少数 32 位英特尔 CPU 上,只是保护模式)、长模式和兼容模式。(显然,它在实模式下不起作用,从现在开始我将忽略它。)

  • IntelSYSCALL支持64 位长模式2(不兼容模式)。它还需要在某些 MSR 中设置一些位。

  • AMDSYSENTER支持Legacy Mode 3,不支持任何 Long Mode 子模式。

  • AMD 支持SYSCALL所有模式4

因此,正如该主题OSDEV 页面所说

  • 在 64 位长模式下 - 仅SYSCALL适用于两个 ISA。SYSENTER不适用于 AMD。)
  • 在传统模式下 - 仅SYSENTER适用于两个 ISA。SYSCALL不适用于英特尔。)
  • 没有一条指令在兼容模式下同时适用于 Intel 和 AMD(SYSENTER不适用于 AMD,SYSCALL也不适用于 Intel),但是没有必要。启动后 32 位内核将保持传统模式。

1 英特尔® 64 位和 IA-32 架构软件开发人员手册第 2B 卷:指令集参考,MU,p。4-668

2 英特尔® 64 位和 IA-32 架构软件开发人员手册第 2B 卷:指令集参考,MU,第 3 页。4-666

3 AMD64 架构程序员手册第 3 卷:通用和系统说明,第 3 页。423

4 AMD64 架构程序员手册第 3 卷:通用和系统说明,第 3 页。419

syscall(由 AMD 创建)和 sysenter(由 Intel 创建)是快速 switch-to-ring0 指令的竞争实现。为了兼容性,x64 系统支持这两种类型。对于 32 位系统,这被认为是不必要的。