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 других. Поэтому там для синхронизации кода с обработчиками прерываний надо дополнительно использовать объекты синхронизации (обычно спин-блокировки). Например, в ядре Linux есть функция spin_lock_irqsave, которая запрещает прерывания и пытается захватить объект спин-блокировки.
Синхронные (программные) прерывания, вызываемые инструкциями INT, INT3, INTO, BOUND обрабатываются независимо от состояния флага IF.
Поскольку инструкция HLT останавливает процессор, до тех пор, пока не произойдёт прерывание, комбинация CLI/HLT приводит к полной остановке машины.