SYSENTER和SYSEXIT

SYSENTER和SYSEXIT

汇编指令sysenter 和sysexit这两条新汇编的解释

SYSENTER/SYSEXIT指令

SYSENTER、SYSEXIT—快速系统调用 - 爱生活,爱编程 - 博客园

SYSENTETR:特权级3用户代码“进入”特权级0的系统内核代码;可以从321特权级调用

SYSEXIT:特权级0的系统内核代码”进入“特权级3用户代码;只能从特权级0调用

执行SYSENTER和SYSEXIT的过程

调用SYSENTER指令前

在调用SYSENTER指令前,软件必须通过下面的MSR寄存器,指定0层的代码段和代码指针,0层的堆栈段和堆栈指针:

  1.   IA32_SYSENTER_CS:一个32位值。低16位是0层的代码段的选择子。该值同时用来计算0层的堆栈的选择子。
    
  2.   IA32_SYSENTER_EIP:包含一个32位的0层的代码指针,指向第一条指令。
    
  3.   IA32_SYSENTER_ESP:包含一个32位的0层的堆栈指针。
    

MSR寄存器可以通过指令RDMSR/WRMSR来进行读写。寄存器地址的地址值在以后的intel 64和IA32处理器中是固定不变的。

执行SYSENTER

当执行SYSENTER,处理器会做下面的动作:

  1.   从IA32_SYSENTER_CS从取出段选择子加载到CS中。
    
  2.   从IA32_SYSENTER_EIP取出指令指针放到EIP中
    
  3.   将IA32_SYSENTER_CS的值加上8,将其结果加载到SS中。
    
  4.   从IA32_SYSENTER_ESP取出堆栈指针放到ESP寄存器中
    
  5.   切换到0层。
    
  6.   若EFLAGS中VM标志已被置,则清除VM标志。
    
  7.   开始执行选择的系统过程。
    

处理器不保存返回地址和调用过程的其他状态信息。

调用SYSEXIT指令前

  1. 设置EDX为ring3下要执行的指令的首地址。

  2. 设置ECX为ring3下的栈指针。

执行SYSEXIT

  1. 将IA32_SYSENTER_CS + 16保存到CS中。(ring3下代码段)

  2. 将EDX赋值给EIP

  3. 将IA32_SYSENTER_CS + 24保存到SS中。

  4. 将ECX赋值给ESP。

  5. 切换到ring3下继续执行ring3代码。

你可能感兴趣的:(学习)