操作碼 |
指令 |
說明 |
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 選擇器是 32 位,對映到普通的 0-4 GB 地址空間,並擁有執行與讀取許可權。目標環 0 堆疊段的 SS 選擇器是 32 位,對映到普通 0-4 GB 地址空間,並擁有讀取、寫入及訪問許可權。此選擇器(目標環 0 SS 選擇器)被賦予新值(CS 選擇器 + 8)。
操作系統通過在處理器中使用型號專用暫存器,給環 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) - 如果未啟用保護模式。