Отключить аппаратные и программные прерывания

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

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

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

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


person Community    schedule 06.10.2009    source источник
comment
Вам нужно указать, какой процессор вы используете. И какая ОС, если есть. В современных настольных/серверных операционных системах пользовательский код обычно выполняется в непривилегированном режиме, что не позволяет вам сделать это.   -  person nos    schedule 06.10.2009
comment
MS Windows (XP SP2/SP3, Vista, 7) версии x86 и x64, современные процессоры Intel (например, Intel Core 2 Duo)   -  person    schedule 07.10.2009


Ответы (3)


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

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

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

person Ludwig Weinzierl    schedule 17.10.2009
comment
ты получил это задом наперёд. STI разрешает прерывания. CLI отключает. - person Alexey Frunze; 12.11.2011
comment
Он также не отключает программные прерывания или исключения. - person Stewart; 15.02.2012
comment
Спасибо, ребята, за ваши комментарии и правки: STI включает прерывания, CLI отключает прерывания, это действительно правильно. Я был уверен, что все наоборот, но я изучил свою сборку на C64, поэтому я посмотрел: у 6510 CLI отключается, а STI включается. Я в замешательстве;-) - person Ludwig Weinzierl; 16.02.2012

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

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

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

person Goz    schedule 06.10.2009
comment
На x86 вы можете ставить перед некоторыми инструкциями блокировку, чтобы сделать их атомарными. - person Gunther Piez; 07.10.2009
comment
Для какой платформы? Если это для Windows, то msdn.microsoft.com/en- us/library/ms684122(VS.85).aspx - person Goz; 07.10.2009

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

удачи!

person saeed eivazi    schedule 05.03.2013