2015-08-18 1 views
0

Wikipedia говорит, что флаг прерывания определяет, будет ли процессор обрабатывать маскируемые аппаратные прерывания. Если флаг установлен в 1, будут обрабатываться маскируемые аппаратные прерывания, если очищено - игнорируется.Каковы примеры практического использования флага прерывания процессора x86?

У меня возникли трудности с пониманием того, что является маскируемым или не маскируемым прерыванием.

  1. Каковы практические применения флага ЕС?
  2. Что такое маскируемое/не маскируемое прерывание и в чем разница?

P.S. Я только начинаю вникать в язык ассемблера и внутреннюю работу процессора, поэтому простой английский, как и для 5 лет, пожалуйста. Если это возможно, конечно, =).

+0

Прочитайте _ГЛАВА 6 ПРЕРЫВАНИЕ И ИСКЛЮЧЕНИЕ ОБРАЩЕНИЯ_ в Руководство разработчика программного обеспечения _Intel® 64 и IA-32 Volume 3A: Руководство по системному программированию, часть 1_. Практическое использование IF для программного обеспечения операционной системы, чтобы отключить прерывания. НМИ редко используется. – Jester

ответ

4

Типичный сценарий, например. в программировании DOS вы отключите прерывания, прежде чем изменять таблицу обработчиков прерываний и повторные прерывания, когда вы закончите.

Если прерываниям разрешалось возникать при изменении таблицы, вы не знали, будет ли использоваться старый или новый адрес обработчика (или половина каждого).

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

Несмашиваемые прерывания, как правило, происходят независимо от текущего состояния флага прерывания - я не помню, чтобы когда-либо приходилось иметь дело с ними.

2

Если вы изучаете asm, чтобы ускорить внутренние петли и прочее, вам не нужно беспокоиться об этом. Вы можете и должны оставить управление прерываниями в ОС. (cli/sti - это, конечно же, привилегированные инструкции, которые работают только в ядре.)

Драйверы устройств Linux (2-е издание), Chapter 9 касается обработки прерываний и упоминания с использованием cli/sti.

В дни, предшествовавшие SMP, прерывание прерываний работало как простая альтернатива блокировке. С многоядерными процессорами другое ядро ​​может касаться вашей структуры данных, даже когда прерывания отключены в ядре, в котором работает ваш код, поэтому он намного менее полезен. Это очень редко делается больше.

Есть несколько раз, когда необходимо отключить прерывания. Например, пока вы делаете то, что временно имеет указатель стека, не указывающий на действительную память. (NVM, mov ss, reg неявно отключает прерывания до завершения следующей команды. Таким образом, вы можете изменить сегмент стека, а затем указатель стека без cli/sti. Который не имеет никакого значения в 64-битном коде, где сегментные регистры являются по существу не используется.)

другой возможным примером является изменение других ключевых структур данных, используемых ЦП, чтобы решить, что делать, когда происходит прерывание. (таблица глобальных дескрипторов и/или таблица дескрипторов прерываний). Хотя IDK о них, если они разделяются с другими процессорами, тогда вам нужно всегда держать их в силе. Я думаю, что недавно я прочитал пример о случае, когда вам нужно было отключить прерывания во время пары подключаемых изменений в таблицах дескрипторов или что-то в этом роде, но я не помню, что.

Я не являюсь экспертом по i386 по материалу ядра, поэтому я не задираю все в this explanation of a case, где вам нужно отключить прерывания при использовании «ворот задач», что бы это ни было.

Этот документ выглядит как часть серии уроков низкого уровня: http://www.osdever.net/bkerndev/Docs/gdt.htm. Вам может показаться интересным, если вы хотите копать все сумасшедшие вещи, которые происходят под капотом на x86.