sysenter 指令如何工作?sysenter后调用什么指令?下一条指令是否保存在寄存器中?
mov edx,esp
sysenter
sysenter 指令如何工作?sysenter后调用什么指令?下一条指令是否保存在寄存器中?
mov edx,esp
sysenter
这是如何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
为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-enough-kernel-to-get-by-2/。