Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
SYSENTER
Влияние команды на флаги и форматы команды:
|
|
0 |
|
|
|
|
|
|
0F 34 |
SYSENTER |
Быстрый переход на системную точку входа |
Pentium II |
sysenter |
Описание:
Команда SYSENTER — это часть нового механизма быстрого системного вызова, введенного в процессорах, начиная с Pentium II. Команда оптимизирована для наиболее быстрого перехода на нулевой уровень привилегий.
Значения в следующих специальных регистрах модели процессора используются в процессе исполнения команды SYSENTER:
- SYSENTER_CS_MSR (174h) — копируется в регистр CS;
- SYSENTYER_EIP_MSR (175h) — копируется в регистр EIP;
- SYSENTER_ESP_MSR (176h) — копируется в регистр ESP.
С использованием значений, взятых из указанных регистров, команда SYSENTER помещает новые селекторы кодового и стекового сегментов в регистры CS, SS и новые указатели команд и стека в EIP, ESP. Далее процессор переключается на нулевой уровнь привилегий и начинается выполнение системной процедуры — обработчика системного вызова. Никакие значения регистров процессора при поступлении данной команды не сохраняются, программа должна сама позаботиться об этом перед выдачей команды SYSENTER.
Селектор CS, генерируемый командой, задает сегмент плоско проецируемый на все линейное адресное пространство 4 Гб с разрешенными любыми вариантами доступа. Аналогичные параметры имеет и стековый сегмент, начальное значение для селектора которого берется равным (Селектор CS +8).
Возможность использования команды SYSENTER определяется с помощью команды CPUID. Однако имеется одна особенность, дело в том, что некоторые процессоры Pentium Pro, хотя и не поддерживают команды SYSENTER/SYSEXIT, но выдают единицу в соответствующем бите по команде CPUID. Поэтому для подтверждения поддержки данных команд, после выполнения CPUID пользовательская программа должна убедиться, что у проверяемого процессора Family = 6, Model > 3 и Stepping > 3.
Операция:
IF CR0.PE = 0 THEN #GP(0); FI;
IF SYSENTER_CS_MSR = 0 THEN #GP(0); FI;
EFLAGS.VM = 0; (* Отключение режима V86 *)
EFLAGS.IF = 0; (* Маскирование внешних прерываний *)
CS.SEL = SYSENTER_CS_MSR; (* Загрузить предлагаемый ОС селектор CS *)
(* Установить поля CS в фиксированные значения *)
CS.SEL.CPL = 0; (* CPL = 0 *)
CS.SEL.BASE = 0; (* Плоская линейная модель памяти *)
CS.SEL.LIMIT = FFFFh; (* Предел 4Гб *)
CS.SEL.G = 1;
CS.SEL.S = 1;
CS.SEL.TYPE_xCRA = 1011b; (* Исполняемый, читаемый, доступ *)
CS.SEL.D = 1; (* 32-битный сегмент *)
CS.SEL.DPL = 0;
CS.SEL.RPL = 0;
CS.SEL.P = 1;
SS.SEL = CS.SEL+8;
(* Установить поля SS в фиксированные значения *)
SS.SEL.BASE = 0; (* Плоская линейная модель памяти *)
SS.SEL.LIMIT = FFFFh; (* Предел 4Гб *)
SS.SEL.G = 1;
SS.SEL.S = 1;
SS.SEL.TYPE_xCRA = 0011b; (* Чтение/запись, доступ *)
SS.SEL.D = 1; (* 32-битный сегмент *)
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 содержит 0.
Особые ситуации режима реальной адресации:
#GP при попытке использовать команду.
Особые ситуации режима V86:
#GP(0), если регистр SYSENTER_CS_MSR содержит 0.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru