Из Википедии, свободной энциклопедии
  (Перенаправлен из IF (флаг x86) )
Перейти к навигации Перейти к поиску

Флаг прерываний ( IF ) представляет собой флаг , система немного в архитектуре x86 «ы регистра флагов , который определяет , является ли центральный процессор (ЦП) будет реагировать на маскируемых аппаратных прерываний . [1]

Бит, который является битом 9 регистра FLAGS, может быть установлен или сброшен программами с достаточными привилегиями, как обычно определяется операционной системой . Если этот флаг установлен 1, будут обрабатываться маскируемые аппаратные прерывания. Если этот параметр не установлен (установлен в 0), такие прерывания будут игнорироваться. IF не влияет на обработку немаскируемых прерываний (NMI) или программных прерываний, генерируемых инструкцией INT .

Установка и очистка [ править ]

Флаг может быть установлен или сброшен с помощью CLI ( Cl уха I nterrupts), STI ( S е т I nterrupts) и POPF ( Поп F LAGS) инструкции .

CLI очищает IF (устанавливается в 0), а STI устанавливает IF в 1. POPF выталкивает 16 битов из стека в регистр FLAGS , что означает, что IF будет устанавливаться или очищаться на основе девятого бита на вершине стека. [1]

Уровень привилегий [ править ]

Во всех трех случаях только привилегированные приложения (обычно ядро ОС ) могут изменять IF. Обратите внимание, что это относится только к коду защищенного режима . ( Код реального режима всегда может изменять IF.)

CLI и STI - это привилегированные инструкции, которые вызывают общий сбой защиты, если непривилегированное приложение пытается его выполнить, в то время как POPF просто не будет изменять флаг IF, если приложение непривилегированное.

Уровень привилегий, необходимый для выполнения инструкции CLI или STI или установки IF с помощью POPF, определяется IOPL (уровень привилегий ввода-вывода) в EFLAGS. Если IOPL установлен, например, на 2, любая программа, работающая только в кольце 0, может выполнять CLI. Большинство современных операционных систем устанавливают IOPL равным 0, поэтому только ядро ​​может выполнять CLI / STI. Причина этого в том, что, поскольку очистка IF заставит процессор игнорировать все прерывания, ядро ​​может никогда не вернуть управление, если оно не будет снова установлено в 1.

Старые программы DOS [ править ]

Некоторые старые программы DOS , которые используют расширитель DOS в защищенном режиме и устанавливают свои собственные обработчики прерываний (обычно игры), используют инструкцию CLI в обработчиках для отключения прерываний и либо POPF (после соответствующего PUSHF), либо IRET (который восстанавливает флаги из стека). как часть его эффектов), чтобы восстановить его. Это работает, если программа была запущена в реальном режиме, но вызывает проблемы, когда такие программы запускаются в контейнере на основе DPMI в современных операционных системах (например, NTVDM под Windows NT или новее). Поскольку CLI является привилегированной инструкцией, она вызывает ошибку.в операционную систему, когда программа пытается ее использовать. Затем ОС обычно прекращает доставлять прерывания программе до тех пор, пока программа не выполнит STI (что может вызвать другую ошибку). Однако инструкция POPF не является привилегированной и просто не может восстановить IF без уведомления. В результате ОС перестает доставлять прерывания программе, которая затем зависает. Программы DOS, которые не используют расширитель защищенного режима, не страдают от этой проблемы, поскольку они выполняются в режиме V86, где POPF действительно вызывает ошибку.

Есть несколько удовлетворительных решений по этому вопросу. Обычно невозможно изменить программу, поскольку исходный код обычно недоступен, а в потоке инструкций нет места для введения STI без массового редактирования на уровне сборки. Удаление интерфейса командной строки из программы или полное игнорирование интерфейса командной строки хостом V86 может вызвать другие ошибки, если обработчики прерываний гостя не являются безопасными для повторного входа (хотя при выполнении на современном процессоре они обычно выполняются достаточно быстро, чтобы избежать перекрытия прерываний).

CLI [ править ]

CLI обычно используется как механизм синхронизации в однопроцессорных системах. Например, интерфейс командной строки используется в операционных системах для отключения прерываний, поэтому код ядра (обычно драйвер ) может избежать состояния гонки с помощью обработчика прерывания . Обратите внимание, что CLI влияет только на флаг прерывания для процессора, на котором он выполняется; в многопроцессорных системах выполнение инструкции CLI не отключает прерывания на других процессорах. Таким образом, состояние гонки драйвера / обработчика прерываний все еще может возникать, потому что другие процессоры могут обслуживать прерывания и выполнять обработчик прерываний, вызывающих нарушение. Для этих систем другие механизмы синхронизации, такие какблокировки должны использоваться в дополнение к CLI / STI, чтобы предотвратить все состояния гонки.

Поскольку инструкция HLT останавливается до тех пор, пока не произойдет прерывание, комбинация CLI, за которой следует HLT, обычно используется для намеренного зависания компьютера.

STI [ править ]

Инструкция STI разрешает прерывания, устанавливая IF.

Одна интересная особенность инструкции STI заключается в том, что, в отличие от интерфейса командной строки, который имеет немедленный эффект, прерывания фактически не разрешаются до тех пор, пока не будет выполнена инструкция, следующая сразу за STI. Одним из побочных эффектов этого может быть IF = 0, тогда выполнение инструкции CLI сразу после инструкции STI означает, что прерывания никогда не распознаются. Команда STI устанавливает флаг IF, но прерывания не проверяются до тех пор, пока не будет выполнена следующая инструкция, которая в данном случае будет CLI, которая вступает в силу немедленно. Такое поведение существует, поэтому процессор, который постоянно принимает прерывания, может продолжать работу. См. Подробности в руководствах IA-32 .

См. Также [ править ]

  • Регистр FLAGS (вычислительный)
  • Intel 8259
  • Расширенный программируемый контроллер прерываний (APIC)
  • Прерывать
  • Обработчик прерывания
  • Немаскируемое прерывание (NMI)
  • Программируемый контроллер прерываний (PIC)
  • x86

Ссылки [ править ]

  1. ^ a b «Руководство разработчика программного обеспечения для архитектуры Intel, том 2: Справочное руководство по набору инструкций» (PDF) . Проверено 13 июля 2007 .

Внешние ссылки [ править ]

  • Руководства разработчика программного обеспечения для архитектур Intel 64 и IA-32 - дата обращения 14 сентября 2017 г.