据我了解,从 windows xp 开始,sysenter
引入了一条指令,而不是“int 2e”中断。但是在 win 10 上syscall
,ntdll 中使用了指令。那么sysenter
仅用于 x86 windows 系统吗?并且syscall
仅适用于 x64 位系统?
在 syscall 或 sysenter 之间挣扎(Windows)
逆向工程
视窗
操作系统
系统调用
2021-07-03 05:36:34
2个回答
Intel 和 AMD 指令集相似但不完全相同。
有很多这样的例子:FMA3/FMA4、AMD-V 和 VT-x(及其扩展)等。
快速系统调用接口是另一个不同之处。
英特尔支持
SYSENTER
所有模式1 - 传统模式(或者,仅在少数 32 位英特尔 CPU 上,只是保护模式)、长模式和兼容模式。(显然,它在实模式下不起作用,从现在开始我将忽略它。)Intel
SYSCALL
仅支持64 位长模式2(不兼容模式)。它还需要在某些 MSR 中设置一些位。AMD
SYSENTER
仅支持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 位系统,这被认为是不必要的。
其它你可能感兴趣的问题