CLI (x86)

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

В системе команд x86 совместимых процессоров инструкция CLI — сокращение от «Clear Interrupt-Enable Flag». Она сбрасывает interrupt flag (IF) в регистре EFLAGS. Когда этот флаг сброшен процессор игнорирует все прерывания (кроме NMI) от внешних устройств.

Опкод данной инструкции — 0xFA.

Обзор[править | править вики-текст]

Инструкция CLI относится к классу инструкций ввода-вывода. В защищённом режиме, если её вызывает код, CPL которого численно больше IOPL, то процессор генерирует исключение #GP(0). Например, если IOPL = 2, то выполнять эту команду может код в 0, 1 и 2 кольцах защиты. Современные операционные системы устанавливают IOPL = 0, чтобы только ядро могло исполнять эту инструкцию.

Следует обратить внимание, что IF может также быть изменён загрузкой EFLAGS, к примеру инструкцией POPF.

CLI обычно используется как средство синхронизации в однопроцессорных системах. Пара инструкций CLI/STI может быть использована, чтобы выделить код, выполнение которого нельзя прервать, асинхронными прерываниями. В многопроцессорных системах инструкция CLI изменяет только IF того процессора, на котором она запущена и не изменяет IF других. Поэтому там для синхронизации надо применять другие механизмы.

Синхронные (программные) прерывания, вызываемые инструкциями INT, INT3, INTO, BOUND обрабатываются независимо от состояния флага IF.

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

См. также[править | править вики-текст]