Флаг прерывания - Interrupt flag

В Флаг прерывания (ЕСЛИ) - системный флаг кусочек в архитектура x86 с Регистр ФЛАГОВ, который определяет, будет ли центральное процессорное устройство (CPU) будет реагировать на маскируемое оборудование прерывает.[1]

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

Настройка и очистка

Флаг можно установить или сбросить с помощью интерфейса командной строки (Clухо яnterrupts), STI (Sет яnterrupts) и POPF (Поп Fлаги) инструкции.

CLI очищает IF (устанавливается в 0), а STI устанавливает IF в 1. POPF выталкивает 16 битов из стека в Регистр ФЛАГОВ, что означает, что 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 в защищенном режиме и устанавливают свои собственные обработчики прерываний (обычно игры), используют инструкцию CLI в обработчиках для отключения прерываний и либо POPF (после соответствующего PUSHF), либо IRET (который восстанавливает флаги из стека как часть его эффекты), чтобы восстановить его. Это работает, если программа была запущена в реальном режиме, но вызывает проблемы, когда такие программы запускаются в DPMI на основе контейнера в современных операционных системах (например, НТВДМ под Windows NT или более поздней версии). Поскольку CLI является привилегированной инструкцией, она запускает вина в операционную систему, когда программа пытается его использовать. Затем ОС обычно перестает доставлять прерывания программе до тех пор, пока программа не выполнит STI (что может вызвать другую ошибку). Однако инструкция POPF не является привилегированной и просто не может восстановить IF без уведомления. В результате ОС перестает доставлять прерывания программе, которая затем зависает. Программы DOS, которые не используют расширитель защищенного режима, не страдают от этой проблемы, поскольку они выполняются в режиме V86, где POPF действительно вызывает ошибку.

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

CLI

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

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

ИППП

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

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

Смотрите также

Рекомендации

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

внешняя ссылка