SysEnter和SysExit指令是结伴的,但是不是成对的。因为SYSENTER并不会保存任何供SYSEXIT在返回时使用的状态信息。这些指令的目标指令和栈指针不是通过指令操作数在确定的,而是通过几个MSRs(Model-Specific Registers)和几个通用寄存器确定的。
SYSENTER通过以下来源获取ring0的目标指令和栈指针:
l 目标代码段(CS)——从SYSENTER_CS_MSR中读取
l 目标指令(EIP)——从SYSENTER_EIP_MSR中读取
l 栈段(SS)——从SYSENTER_CS_MSR中读取
l 栈指针(ESP)——从SYSENTER_ESP_MSR中读取
SYSEXIT 通过以下指令获取ring3的目标指令和栈指针
l 目标代码段(CS)——从SYSENTER_CS_MSR中的值加上16(0x10)
l 目标指令(EIP)——从EDX中读取
l 栈段(SS)——从SYSENTER_CS_MSR中的值加上24(0x18)
l 栈指针(ESP)——从ECX中读取