SYSEXIT——快速系统调用的快速返回

来源:互联网 发布:预科生的贩毒网络插曲 编辑:程序博客网 时间:2024/05/11 12:05

SYSEXIT——快速系统调用的快速返回

 

SYSEXIT用来快速调用返回至3层的用户代码。SYSEXITSYSENTER的同伴指令。该指令经过了优化,它可以使将由操作系统或执行程序(运行在0层)至用户代码(运行在3层)的返回发挥最大的性能。该指令只能在0层的权限执行。

 

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

1.       IA32_SYSENTER_CS:一个32位值。低16位是0层的代码段的选择子。该值同时用来计算3层的代码段和堆栈段的选择子。

2.       EDX:包含一个32位的3层的代码指针,指向第一条指令。

3.       ECX:包含一个32位的3层的堆栈指针。

 

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

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

1.       IA32_SYSENTER_CS的值加上16,将其结果加载到CS中。

2.       EDX取出指令指针放到EIP

3.       IA32_SYSENTER_CS的值加上24,将其结果加载到SS中。

4.       ECX取出堆栈指针放到ESP寄存器中

5.       切换到3层。

6.       开始执行选择的系统过程。

关于使用SYSENTERSYSEXIT指令来调用和返回的的信息可以参看本章的“SWAPGS—Swap GS Base Register.

SYSEXIT指令总是转移到DPL3的保护模式下的代码段。这条指令需要操作系统首先满足下面的条件:

1.       选择的系统代码段必须是一个平坦的、32位最大为4G的代码段。此段必须是可执行的、可读、已存取、非一致的。

2.       选择的系统堆栈段必须是一个平坦的、32位最大为4G的数据段。此段必须可读写、已存取、可向上扩展。

 

SYSEXIT可在除实地址和V8086模式外所有其他模式下执行。

 

SYSENTERSYSEXIT指令是从Pentium II开始新加入到IA32位架构中来的。这两个指令在处理器上是否有效要看CPUID指令返回的EDX寄存器中SEP标记(SYSENTER/SYSEXIT存在标记)是否置上。操作系统若要检查SEP标记必须要同时检查处理器族(family)和型号(model),这样才能确保结果的准确性。例如

 

IF (CPUID SEP bit is set)

IF (Family == 6) AND (Model < 3) AND (Stepping < 3)

THEN

Fast System Call NOT supported

FI;

ELSE Fast System Call is supported

FI

 

CPUID指令在Penitum ProModel 1)上执行,虽然返回的SEP标志是置上的,但该处理器还是不支持SYSENTER/SYSEXIT指令的。

原创粉丝点击