SYSENTER和SYSEXIT
汇编指令sysenter 和sysexit这两条新汇编的解释
SYSENTER、SYSEXIT—快速系统调用 - 爱生活,爱编程 - 博客园
SYSENTETR:特权级3用户代码“进入”特权级0的系统内核代码;可以从321特权级调用
SYSEXIT:特权级0的系统内核代码”进入“特权级3用户代码;只能从特权级0调用
执行SYSENTER和SYSEXIT的过程
调用SYSENTER指令前
在调用SYSENTER指令前,软件必须通过下面的MSR寄存器,指定0层的代码段和代码指针,0层的堆栈段和堆栈指针:
-
IA32_SYSENTER_CS:一个32位值。低16位是0层的代码段的选择子。该值同时用来计算0层的堆栈的选择子。
-
IA32_SYSENTER_EIP:包含一个32位的0层的代码指针,指向第一条指令。
-
IA32_SYSENTER_ESP:包含一个32位的0层的堆栈指针。
MSR寄存器可以通过指令RDMSR/WRMSR来进行读写。寄存器地址的地址值在以后的intel 64和IA32处理器中是固定不变的。
执行SYSENTER
当执行SYSENTER,处理器会做下面的动作:
-
从IA32_SYSENTER_CS从取出段选择子加载到CS中。
-
从IA32_SYSENTER_EIP取出指令指针放到EIP中
-
将IA32_SYSENTER_CS的值加上8,将其结果加载到SS中。
-
从IA32_SYSENTER_ESP取出堆栈指针放到ESP寄存器中
-
切换到0层。
-
若EFLAGS中VM标志已被置,则清除VM标志。
-
开始执行选择的系统过程。
处理器不保存返回地址和调用过程的其他状态信息。
调用SYSEXIT指令前
-
设置EDX为ring3下要执行的指令的首地址。
-
设置ECX为ring3下的栈指针。
执行SYSEXIT
-
将IA32_SYSENTER_CS + 16保存到CS中。(ring3下代码段)
-
将EDX赋值给EIP
-
将IA32_SYSENTER_CS + 24保存到SS中。
-
将ECX赋值给ESP。
-
切换到ring3下继续执行ring3代码。