October 19 2017 17:25:32
Навигация
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации .

Забыли пароль?
Запросите новый здесь.
команды вызова системных процедур SYSENTER
ПРОЦЕССОРЫ ОБЩЕГО НАЗНАЧЕНИЯ И СИСТЕМЫ НА ИХ ОСНОВЕ

Команда INT3 имеет вектор с номером Ne = 3 (исключение типа #ВР - останов в контрольной точке) и используется для установки контрольных точек в процессе отладки программы. Программа, вызываемая этой командой, обеспечивает останов процессора и выдачу пользователю необходимой информации о его текущем состоянии. Команда INTO проверяет значение признака OF и вызывает соответствующую программу обслуживания, если OF = 1, т. е. результат предыдущей операции (число со знаком) вышел за пределы разрядной сетки. Эта команда обращается к вектору прерываний с номером Ne = 4 (исключение типа #OF - переполнение разрядной сетки). Команда UD2, введенная в процессорах семейства Р6, реализует прерывание с номером Ne = 7 (#UD - недействительный код операции). Эта команда используется для вызова программы обслуживания прерывания типа #UD в процессе выполнения текущей программы.

Команда IRET обеспечивает возврат из подпрограммы обслуживания прерывания путем извлечения из стека и возвращения в регистры содержимых EIP или IP, CS, EFLAGS или FLAGS, соответствующих прерванной процедуре.

Дополнительные команды вызова системных процедур SYSENTER, SYSEXIT введены в процессорах Pentium II и последующих моделях данного семейства. Эти команды используют специальные модельно-специфические регистры (MSR), которые имеют имена SYSENTER_CS_MSR (адрес 174h), SYSENTER_ESP_MSR (адрес 175h), SYSENTER_EIP_MSR (адрес 176h). В эти регистры с помощью команд WRMSR записываются адреса ячеек памяти, содержимое которых обеспечивает переход к определенной системной программе, имеющей максимальный уровень привилегии DPL = 0. При поступлении команды SYSENTER из этих ячеек памяти производится загрузка нового содержимого: в регистр CS - из ячейки, адресуемой регистром SYSENTER_CS_MSR, в регистр EIP - ячейки, адресуемой SYSENTER_EIP_MSR, в регистр SS - из ячейки, адрес которой равен (SYSENTER_CS_MSR) + 8, в регистр ESP - из ячейки, адресуемой SYSENTER_ESP_MSR. Таким образом, обеспечивается переход к новым сегментам команд и стека. При этом не сохраняется адрес возврата к выполняемой команде и содержимое каких-либо регистров. Если эта информация необходима для выполнения последующих процедур, то программист должен предварительно позаботиться о ее сохранении. Для возврата из системной программы с максимальным уровнем приоритета CPL = 0 к программе пользователя (DPL = 3) служит команда SYSEXIT, которая производит загрузку нового содержимого: в регистр CS из ячейки памяти с адресом (SYSENTER_CS_MSR) + 16, в регистр SS - из ячейки с адресом (SYSENTER_CS_MSR) + 24, в регистр SS - из регистра EDX, в регистр ESP - из регистра ЕСХ. В эти регистры и ячейки памяти предварительно должно быть записано содержимое, обеспечивающее переход к необходимой программе пользователя.

Команды управления признаками (табл. 2.23) обеспечивают запись-чтение содержимого регистра признаков и их изменение. Команды LAHF и SAHF выполняют загрузку младшего байта из регистра EFLAG в регистр АН и заполнение младшего байта в EFLAGS из регистра АН. Команды POPF, PUSHF производят загрузку в стек или выборку из стека содержимого FLAGS при обработке 16-разрядных операндов или EFLAGS при обработке 32-разрядных операндов. Команды CLC, STC осуществляют установку значений признака переноса CF = 0, CF = 1, а команда CMC вызывает инвертирование значения этого признака. Команды CLD, STD устанавливают значения признака направления DF = 0, DF = 1. Команды CLI, ST/ выполняют соответственно установку значений признака разрешения прерываний IF=0 (запрещение прерываний), IF=1 (разрешение прерываний). В защищенном режиме изменение значения IF с помощью этих команд производится при выполнении условия CPL < IOPL, как и для команд IN, OUT, INS, OUTS. При нарушении этого условия реализуется исключение типа #GP («нарушение защиты»).

Необходимо отметить, что команды IRET, POPF в защищенном режиме могут изменить значение признака IF в регистре EFLAGS только при выполнении такого же условия: CPL < IOPL. Содержимое поля IOPL в регистре EFLAGS эти команды могут изменять только при наиболее высоком уровне привилегий текущей программы: CPL = 0.

Комментарии
Нет комментариев.
Добавить комментарий
Пожалуйста, залогиньтесь для добавления комментария.
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, авторизуйтесьили зарегистрируйтесь для голосования.

Нет данных для оценки.

Время загрузки: 0.02 секунд 2,256,153 уникальных посетителей