操作碼 |
指令 |
說明 |
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 時從保護模式啟用。此指令要求操作系統滿足以下條件:
目標環 3 程式碼段的 CS 選擇器是 32 位,對映成普通 0-4 GB 地址空間,並且擁有執行、讀取以及非相容許可權。目標環 3 堆疊段的 SS 選擇器是 32 位,對映成普通 0-4 GB 地址空間,並且擁有擴充套件、讀取以及寫入許可權。
操作系統必須進行以下設定:
名稱 |
說明 |
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) - 如果未啟用保護模式。