Assembler - язык неограниченных возможностей


Системные и привилегированные команды - часть 7



  • Команда:
  • SYSENTER
  • Назначение:
  • Быстрый системный вызов
  • Команда:
  • SYSEXIT
  • Назначение:
  • Быстрый возврат из системного вызова
  • Процессор:
  • РII

    Команда SYSENTER загружает в регистр CS число из регистра MSR #174h, в регистр EIP — число из регистра MSR #176h, в регистр SS — число, равное CS + 8 (селектор на следующий дескриптор), и в регистр ESP — число из MSR #175h. Эта команда предназначена для передачи управления операционной системе — ее можно вызывать с любым CPL, а вызываемый код должен находиться в бессегментной памяти с CPL = 0. На самом деле SYSENTER модифицирует дескрипторы используемых сегментов — сегмент кода будет иметь DPL = 0, базу 0, лимит 4 Гб, станет доступным для чтения и 32-битным, а сегмент стека также получит базу 0, лимит 4 Гб, DPL = 0, 32-битный режим, доступ для чтения/записи и установленный бит доступа. Кроме того, селекторы CS и SS получают RPL = 0.

    Команда SYSEXIT загружает в регистр CS число, равное содержимому регистра MSR #174h плюс 16, в EIP — число из EDX, в SS — число, равное содержимому регистра MSR #174h плюс 24, и в ESP — число из ЕСХ. Эта команда предназначена для передачи управления в бессегментную модель памяти с CPL = 3 и она тоже модифицирует дескрипторы. Сегмент кода получает DPL = 3, базу 0, лимит 4 Гб, доступ для чтения, перестает быть подчиненным и становится 32-битным. Сегмент стека также получает базу 0, лимит 4 Гб, доступ для чтения/записи и 32-битную разрядность. Поля RPL в CS и SS устанавливаются в 3.

    Поддержку команд SYSENTER/SYSEXIT всегда следует проверять при помощи команды CPUID (бит 11). Кроме того, надо убедиться, что номер модели процессора не меньше трех, так как Pentium Pro (тип процессора 6, модель 1) не имеет команд SYSENTER/SYSEXIT, но бит в CPUID возвращается равным 1.

    SYSENTER выполняется только в защищенном режиме, SYSEXIT выполняется только с CPL = 0.





    Начало  Назад  Вперед