SYSEXIT - 從系統呼叫入口快速轉出

操作碼

指令

說明

0F 35

SYSEXIT

從“系統呼叫入口”轉出

說明

SYSEXIT 指令是在奔騰(R) II 處理器上引入的“快速系統呼叫”功能的一部分。SYSEXIT 指令經過優化,能以最佳效能從保護環 0 (CPL 0) 轉到保護環 3 (CPL 3)。

根據操作系統在特定的型號專用暫存器或通用暫存器中指定的值,SYSEXIT 指令設定以下暫存器。

CS 暫存器設定為 16 與 SYSENTER_CS_MSR 的值之和EIP 暫存器設定為 EDX 暫存器中包含的值。SS 暫存器設定為 24 與 SYSENTER_CS_MSR 的值之和ESP 暫存器設定為 ECX 暫存器中包含的值。

處理器不儲存內核堆疊或返回地址資訊,也不儲存任何暫存器。

SYSENTER 與 SYSEXIT 指令不構成一對呼叫/返回;因此,使用者程式碼執行的系統呼叫“存根”例程(通常在共享庫或 DLL 中)必須負責還原所需的暫存器狀態,以建立一對系統呼叫/返回。

SYSEXIT 指令總是轉換到 CPL 3 普通保護模式使用者級別。SYSEXIT 只能在 CPL 0 時從保護模式啟用。此指令要求操作系統滿足以下條件:

操作系統必須進行以下設定:

 

名稱

說明

CS 選擇器

目標環 3 CS 選擇器。它被賦予 16 與 SYSENTER_CS_MSR 的值之和。

SS 選擇器

目標環 3 SS 選擇器。它被賦予 24 與 SYSENTER_CS_MSR 的值之和。

EIP

目標環 3 返回 EIP。這是目標入口,被賦予 EDX 暫存器中包含的值。

ESP

目標環 3 返回 ESP。這是目標入口,被賦予 ECX 暫存器中包含的值。

此項功能的存在與否由 CPUID 的位 11“SYSENTER 存在”(SEP) 指出。檢測到存在 SEP 位的操作系統還必須判斷處理器的系列與型號是否符合,以確保確實提供 SYSENTER/SYSEXIT 指令,具體如關於 SYSENTER 指令的說明所述。奔騰 Pro 處理器(型號 1)返回一組 SEP CPUID 功能位,但不支援 SYSENTER/SYSEXIT 指令。

操作

SYSEXIT
IF SYSENTER_CS_MSR == 0 THEN #GP(0)
IF CR0.PE == 0 THEN #GP(0)
IF CPL <> 0 THEN #GP(0)

// Changing CS:EIP and SS:ESP is required

CS.SEL := (SYSENTER_CS_MSR + 16) // Selector for return CS
CS.SEL.RPL := 3

// Set rest of CS to a fixed value
CS.SEL.BASE := 0 // Flat segment
CS.SEL.LIMIT := 0xFFFF // 4G limit
CS.SEL.G := 1 // 4 KB granularity
CS.SEL.S := 1
CS.SEL.TYPE_xCRA := 1011 // Execute, Read, Non-Conforming Code
CS.SEL.D := 1 // 32 bit code
CS.SEL.DPL := 3
CS.SEL.P := 1

SS.SEL := (SYSENTER_CS_MSR + 24)
SS.SEL.RPL := 3

// Set rest of SS to a fixed value
SS.SEL.BASE := 0 // Flat segment
SS.SEL.LIMIT := 0xFFFF // 4G limit
SS.SEL.G := 1 // 4 KB granularity
SS.SEL.S := 1
SS.SEL.TYPE_xCRA := 0011 // Expand Up, Read/Write, Data
SS.SEL.D := 1 // 32 bit stack
SS.SEL.DPL := 3
SS.SEL.CPL := 3
SS.SEL.P := 1

ESP := ECX
EIP := EDX

異常

#GP(0) - 如果 SYSENTER_CS_MSR 包含零。

數值異常

無。

保護模式異常

#GP(0) - 如果 CPL 不為零。

實地址模式異常

#GP(0) - 如果未啟用保護模式。