sysenter指令如何工作?
sysenter之后调用什么指令?
下一条指令是否保存在寄存器中?

mov     edx,esp
sysenter


评论

它进入环0,通常edx指向参数,而eax是要执行的操作的“ id”

sysenter如何在Linux下工作的可能重复方式?

我怀疑sysenter在Linux和Windows上的工作原理相同...但是,我没有在Windows上尝试过,因此您需要尝试一下。

@perror:链接的问题说明了如何使用sysenter调用Linux syscall。它没有说明systenter在CPU级别上如何工作。

@Igor:对,我可能误解了这个问题。对不起。

#1 楼

这是sysenter的工作原理的完美解释:http://www.osronline.com/article.cfm?id=257

本质上:
来自用户模式的所有本机API调用都有一个只需将索引加载到EAX中的主体,执行SystemCallStub并返回

SystemCallStub将指向用户模式堆栈顶部的指针保存到EDX中,并执行SYSENTER指令

SYSENTER禁用中断,将线程切换到内核模式,并执行位于SYSENTER_EIP_MSR中的指令(在XP SP1上为KiFastCallEntry)。

KiFastCallEntry生成陷阱帧,以便在返回用户模式时知道去向,启用中断并跳入KiSystemService

KiSystemService,除其他外,从用户堆栈中复制参数(由EDX指向),并获取先前存储在EAX中的值并执行位于以下位置的函数KiServiceTable [EAX]

现在,本机API在内核模式下以线程集的先前模式执行到用户模式

评论


您到底能说出在返回用户模式后调用sysenter之后将地址eiP保存在什么地方?

–user2522767
2014年9月24日12:16

返回用户模式后,将使用陷阱帧并为EIP进行设置。了解陷阱框架如何正确工作

– pHiL
2014年9月24日12:33

你是说无处储蓄吗?您能给我看看有关陷井框架工作的参考资料吗?坦克斯

–user2522767
2014年9月24日12:49

陷阱帧设置为内核模式,因此您无法从用户模式对其进行修改。如果您想了解更多,请搜索“中断,陷阱,异常”

– pHiL
2014-09-25 9:38



#2 楼

SYSENTER指令影响许多寄存器,但最重要的是,它将EIP设置为SYSENTER_EIP_MSR寄存器的值(在IA-32术语中)。 Windows在引导时将SYSENTER_EIP_MSR设置为ntoskrnl!KiFastCallEntry()的地址。

因此,在较高级别上,SYSENTER会“跳转”到ntoskrnl!KiFastCallEntry()

有关更多详细信息,请参见http ://www.codeguru.com/cpp/misc/misc/system/article.php/c8223/%22System-Call-Optimization-with-the-SYSENTER-Instruction.htm和http://trapframe.org/just-足够的内核可以得到2 /。