SYSENTER - 快速轉換到系統呼叫入口

操作碼

指令

說明

0F 34

SYSENTER

轉換到“系統呼叫入口”

說明

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

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

CS 暫存器設定為 (SYSENTER_CS_MSR) 的值;EIP 暫存器設定為 (SYSENTER_EIP_MSR) 的值;SS 暫存器設定為(8 與 SYSENTER_CS_MSR 的值之和);ESP 暫存器設定為 (SYSENTER_ESP_MSR) 的值

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

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

SYSENTER 指令總是轉換到 CPL 0 級的普通保護模式內核。SYSENTER 可以從除真實模式以外的所有模式啟用。此指令要求操作系統滿足以下條件:

操作系統通過在處理器中使用型號專用暫存器,給環 0 入口的 CS、EIP、SS 以及 ESP 提供值。這些暫存器可以使用 RDMSR 與 WRMSR 指令進行讀取和寫入。在支援此項功能的未來處理器中,這些暫存器地址定義為固定到以下地址。

 

名稱

說明

地址

SYSENTER_CS_MSR

目標環 0 CS 選擇器

174H

SYSENTER_ESP_MSR

目標環 0 ESP

175H

SYSENTER_EIP_MSR

目標環 0 入口 EIP

176H

此項功能的存在與否由 CPUID 的位 11“SYSENTER 存在”(SEP) 指出。檢測到存在 SEP 位的操作系統還必須判斷處理器的系列與型號是否符合,以確保確實存在 SYSENTER/SYSEXIT 指令。例如:

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

奔騰 Pro 處理器(型號 1)返回一組 SEP CPUID 功能位,但不支援 SYSENTER/SYSEXIT 指令。

操作

SYSENTER
IF CR0.PE == 0 THEN #GP(0)
IF SYSENTER_CS_MSR == 0 THEN #GP(0)

EFLAGS.VM := 0 // Prevent VM86 mode
EFLAGS.IF := 0 // Mask interrupts

CS.SEL := SYSENTER_CS_MSR // Operating system provides CS

// Set rest of CS to a fixed value
CS.SEL.CPL := 0 // CPL 0
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, Accessed
CS.SEL.D := 1 // 32 bit code
CS.SEL.DPL := 0
CS.SEL.RPL := 0
CS.SEL.P := 1
SS.SEL := CS.SEL+8

// 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 // Read/Write, Accessed
SS.SEL.D := 1 // 32 bit stack
SS.SEL.DPL := 0
SS.SEL.RPL := 0
SS.SEL.P := 1

ESP := SYSENTER_ESP_MSR
EIP := SYSENTER_EIP_MSR

異常

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

數值異常

無。

實地址模式異常

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