Отключить аппаратные и программные прерывания - PullRequest
5 голосов
/ 06 октября 2009

Можно ли отключить все прерывания с помощью программы ASM / C / C ++, чтобы получить полный контроль над процессором?

Если да -> как?

Если нет -> как работают «атомарные» вызовы операционной системы (например, вход в критический раздел)?

Спасибо за вашу помощь!

Ответы [ 3 ]

5 голосов
/ 17 октября 2009

В сборке x86 команды

  • sti установить бит разрешения прерываний
  • cli бит разрешения очистки прерывания

Эти команды устанавливают и сбрасывают флаг IF . Когда установлен флаг IF, ЦП будет обрабатывать аппаратные прерывания, а когда станет ясно, ЦП будет игнорировать аппаратные прерывания. Это не влияет на обработку немаскируемых прерываний, а также не влияет на программные прерывания или исключения. Эти инструкции также не работают в непривилегированном режиме (обычно все, что выше, чем кольцо 0, в зависимости от IOPL ).

3 голосов
/ 06 октября 2009

на x86 и большинстве других современных процессоров вы можете получить атомарные инструкции. Те, которые ГАРАНТИРУЮТСЯ, не будут завершены до того, как другой поток / процессор сможет получить доступ к этой памяти.

В Win32 у вас есть функции Interlocked *, которые абстрагируют вас от вас на поддерживаемых платформах.

В MIPS для многих команд может быть добавлен .I в конце инструкции, чтобы гарантировать блокировку.

0 голосов
/ 05 марта 2013

x86 имеет флаг прерывания (IF) в регистре FLAGS. Когда этот флаг установлен в 0, аппаратные прерывания отключены, в противном случае они включены. Команда cli устанавливает этот флаг на 0, а sti устанавливает его на 1. Инструкции, загружающие значения в регистр FLAGS (такие как popf и iret), также могут изменять этот флаг.

удачи!

...