Флаг прерывания
Флаг прерывания ( IF флага ) — это бит в процессора , который определяет , регистре FLAGS будет ли процессор немедленно реагировать на маскируемые аппаратные прерывания . [ 1 ] Если флаг установлен на 1
маскируемые прерывания включены. При сбросе (установлено значение 0
) такие прерывания будут отключены до тех пор, пока прерывания не будут разрешены. Флаг прерывания не влияет на обработку немаскируемых прерываний (NMI) или программных прерываний, генерируемых инструкцией INT .
Настройка и очистка
[ редактировать ]системе, использующей x86 инструкции CLI ( Clear , используются Interrupt ) и STI ( Set Interrupt архитектуру В ). POPF ( Pop Flags ) удаляет слово из стека в регистр FLAGS , что может привести к установке или очистке флага прерывания на основе бита в регистре FLAGS из вершины стека. [ 1 ]
Уровень привилегий
[ редактировать ]В системах, поддерживающих привилегированный режим, только привилегированные приложения (обычно ядро ОС ) могут изменять флаг прерывания . В системе x86 это применимо только к защищенного режима коду (код реального режима всегда может изменять флаг прерывания ). CLI и STI — это привилегированные инструкции, которые вызывают общую ошибку защиты, если непривилегированное приложение пытается их выполнить. Инструкция POPF не будет изменять флаг прерывания , если приложение непривилегировано.
Старые программы DOS
[ редактировать ]Некоторые старые программы DOS , использующие расширитель DOS в защищенном режиме и устанавливающие собственные обработчики прерываний (обычно игры), используют в обработчиках инструкцию CLI для отключения прерываний и либо POPF (после соответствующего PUSHF), либо IRET (который восстанавливает флаги из стека). как часть его эффектов), чтобы восстановить его. Это работает, если программа была запущена в реальном режиме, но вызывает проблемы, когда такие программы запускаются в контейнере на основе DPMI в современных операционных системах (например, NTVDM под Windows NT или более поздней версии). Поскольку CLI является привилегированной командой, она вызывает ошибку в операционной системе, когда программа пытается ее использовать. Затем ОС обычно перестает выдавать прерывания программе до тех пор, пока программа не выполнит STI (что может вызвать еще одну ошибку). Однако инструкция POPF не является привилегированной и просто не может автоматически восстановить IF. В результате ОС перестает доставлять прерывания программе, которая затем зависает. Программы DOS, которые не используют расширитель защищенного режима, не страдают от этой проблемы, поскольку они выполняются в режиме V86, где POPF действительно вызывает ошибку.
Удовлетворительных решений этой проблемы немного. Модифицировать программу обычно невозможно, поскольку исходный код обычно недоступен, а в потоке команд нет места для введения STI без масштабного редактирования на уровне сборки. Удаление CLI из программы или полное игнорирование CLI хостом V86 может привести к другим ошибкам, если обработчики прерываний гостя не предназначены для повторного входа (хотя при выполнении на современном процессоре они обычно выполняются достаточно быстро, чтобы избежать перекрытия прерывает).
Отключение прерываний
[ редактировать ]В x86 наборе команд CLI обычно используется в качестве механизма синхронизации в однопроцессорных системах. Например, CLI используется в операционных системах для отключения прерываний, чтобы код ядра (обычно драйвер ) мог избежать состояний гонки внутри обработчика прерываний . Это необходимо при непрерывном изменении нескольких связанных структур данных.
Включение прерываний
[ редактировать ]STI x86 набора команд разрешает прерывания, устанавливая IF.
В некоторых реализациях команды, разрешающей прерывания, прерывания не разрешаются до тех пор, пока не будет выполнена следующая инструкция. В этом случае последовательность разрешения прерываний, за которой сразу же следует запрет прерываний, приводит к тому, что прерывания не распознаются.
Соображения о многопроцессорности
[ редактировать ]Флаг прерывания влияет только на один процессор. В многопроцессорных системах обработчик прерываний должен использовать другие механизмы синхронизации, такие как блокировки .
См. также
[ редактировать ]- Прерывать
- Регистр ФЛАГОВ (вычисления)
- Интел 8259
- Усовершенствованный программируемый контроллер прерываний (APIC)
- Обработчик прерываний
- Немаскируемое прерывание (NMI)
- Программируемый контроллер прерываний (PIC)
- х86
Ссылки
[ редактировать ]- ^ Перейти обратно: а б «Руководство разработчика программного обеспечения для архитектуры Intel, том 2: Справочное руководство по набору команд» (PDF) . Проверено 13 июля 2007 г.
Внешние ссылки
[ редактировать ]- Руководства для разработчиков программного обеспечения для архитектур Intel 64 и IA-32 — дата обращения 14 сентября 2017 г.