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

评论

codemachine.com/article_syscall.html wiki.osdev.org/SYSENTER stackoverflow.com/a/29784932/306930

我不认为这是这里的话题。您正在询问Windows上的通用英特尔指令。

@EvanCarroll为什么您不认为英特尔说明在逆向工程问答站点中是主题?当然,一个人可以很容易地拿到一套说明书,并迅速找出来。它仍然是主题恕我直言。

@NirIzr,因为它要求两种技术之间存在差异。这是一个经典的工程问题,而不是逆向工程。 “ Windows内核中“ sysenter”的功能是什么?”可能是热门话题,但我今天在Unix.SE上问的类似问题不太可能,因为即使是关于操作系统如何与其他软件隔离的问题,在其他地方似乎也更合适。

恐怕我倾向于不同意。对于一个给定的问题,可以有多个“主题” SE网站。

#1 楼

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

有很多示例:FMA3 / FMA4,AMD-V和VT-x(及其扩展名)等。

快速系统调用接口是另一个不同之处。模式),长模式和兼容模式。 (显然,它在实模式下不起作用,从现在开始我就忽略了它。)
英特尔仅在64位长模式2(不兼容模式)下支持SYSENTER。它还需要在某些MSR中进行一些设置。
AMD仅在传统模式3中支持SYSCALL,而在所有长模式子模式中均不支持。因此,正如该主题上的OSDEV页所述:


在64位长模式下,只有SYSENTER可以在两个ISA上使用。 (SYSCALL在AMD上不起作用。)
在传统模式下,只有SYSCALL在两个ISA上均有效。 (SYSENTER在Intel上不起作用。)
在兼容模式下,没有一条指令可同时在Intel和AMD上运行(SYSENTER在AMD上不起作用,而SYSCALL在Intel上不起作用),但是没有必要一。引导后,一个32位内核将保持传统模式。


1Intel®64和IA-32体系结构软件开发人员手册卷2B:指令集参考,M-U,第2页。 4-668

2Intel®64和IA-32架构软件开发人员手册卷2B:指令集参考,M-U,第2页。 4-666

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

4AMD64体系结构程序员手册,第3卷:通用和系统指令,第1页。 419

#2 楼

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

评论


错了并在我对此问题发表评论的链接中提到。在长模式下,SYSCALL是AMD64和Intel 64上唯一受支持的。AMD手册在SYSENTER的页面上明确指出:“如果在长模式下使用此指令,则会发生无效操作码异常。软件应使用SYSCALL(和SYSRET)指令。”

– conio
17-10-8在0:33