SYENTER和SYSEXIT指令首次出现于Pentium II处理器中,其目的是为了提供一个快速(低负载) 的调用操作系统或者执行体过程的机制.SYSENTER用于运行特权级别为3的用户
调用特权级0 的系统内核代码。
WinDbg中反汇编 KiFastSystemCall可以看到SYSENTER指令。
在调用SYSENTER指令前,CPU会通过下面的MSR寄存器,获取ring0的代码段和代码指针,ring0的堆栈段和堆栈指针:
MSR寄存器可以通过指令RDMSR/WRMSR来进行读写。寄存器地址如下表。
当执行SYSENTER,处理器会
1.从IA32_SYSENTER_CS取出值(seg selector)加载到CS中。
2.从IA32_SYSENTER_EIP取出指令指针放到EIP中
3.将IA32_SYSENTER_CS的值加上8,将其结果加载到SS中。
4.从IA32_SYSENTER_ESP取出堆栈指针放到ESP