Прерывание маскировки: почему? - PullRequest
20 голосов
/ 07 февраля 2011

Я читал о прерываниях.Возможно приостановить некритические прерывания с помощью специальной маски прерываний.Это называется маскированием прерываний.Что я не знаю, так это когда / почему вы можете захотеть или вам необходимо временно приостановить прерывания?Возможно, семафоры или программирование в многопроцессорной среде?

Ответы [ 4 ]

36 голосов
/ 07 февраля 2011

Операционная система делает это, когда готовится запустить собственный код «Давайте организуем мир».

Например, в какой-то момент планировщик потока ОС имеет контроль. Он подготавливает регистры процессора и все остальное, что необходимо сделать, прежде чем запускать поток, чтобы была настроена среда для этого процесса и потока. Затем, прежде чем позволить этому потоку работать, он устанавливает прерывание таймера, которое будет вызвано после истечения времени, которое он намеревается дать потоку на процессоре.

По истечении этого периода времени (кванта) прерывание повышается, и планировщик ОС снова получает управление. Нужно выяснить, что нужно делать дальше. Для этого ему необходимо сохранить состояние регистров ЦП, чтобы он знал, как отменить побочные эффекты кода, который он выполняет. Если по какой-либо причине возникает другое прерывание (например, некоторые асинхронные операции ввода-вывода завершаются) во время сохранения состояния, это приведет к тому, что ОС окажется в ситуации, когда ее мир не в действительном состоянии сохранение состояния должно быть атомарной операцией).

Чтобы не оказаться в такой ситуации, ядро ​​ОС отключает прерывания во время выполнения любых таких операций, которые должны быть атомарными. После того, как он выполнил все, что нужно, и система снова находится в известном состоянии, она включает прерывания.

15 голосов
/ 07 февраля 2011

В дополнение к уже даным ответам есть элемент приоритета.Есть некоторые прерывания, которые вам нужны или вы хотите, чтобы иметь возможность реагировать как можно быстрее, и другие, о которых вы хотели бы знать, но только когда вы не очень заняты.Наиболее очевидным примером может быть заполнение буфера записи на устройстве записи DVD (где, если вы не сделаете это вовремя, какое-то оборудование просто запишет DVD неправильно), а не обрабатывает новый пакет из сети.Вы отключаете прерывание для последнего при получении прерывания для первого и оставляете его отключенным на время заполнения буфера.

На практике довольно много ЦП имеют приоритет прерывания, встроенный непосредственно ваппаратное обеспечение.Когда происходит прерывание, отключенные флаги устанавливаются для меньших прерываний и, зачастую, они прерываются одновременно с чтением вектора прерывания и переходом к соответствующему адресу.Указание на то, что получение прерывания также неявно маскирует прерывания до конца обработчика прерываний, имеет приятный побочный эффект, заключающийся в ослаблении ограничений на аппаратное прерывание.Например, вы можете просто сказать, что высокий уровень сигнала запускает прерывание и оставляет внешнему оборудованию решать, как долго он хочет удерживать линию на высоком уровне, не беспокоясь о непреднамеренном срабатывании нескольких прерываний.и 6502) как правило, существует только два уровня прерывания - маскируемый и немаскируемый, что, как мне кажется, является источником языка включения или отключения прерываний.Но даже начиная с оригинального 68000, у вас есть восемь уровней прерываний и текущий уровень приоритета в ЦП, который определяет, какие уровни входящего прерывания действительно будут иметь силу.

15 голосов
/ 07 февраля 2011

Раньше я программировал на плате ARM, в которой могло произойти около 10 прерываний.Каждая конкретная программа, которую я написал, никогда не интересовала более 4 из них.Например, на плате было 2 таймера, но мои программы использовали только 1. Я бы маскировал прерывание второго таймера.Если бы я не маскировал этот таймер, он мог бы быть включен и продолжать делать прерывания, которые замедлили бы мой код.

Другой пример состоял в том, что я использовал бы полное прерывание приема RART UART и поэтому никогда бы не нуждалсяUART получает полное прерывание BUFFER.

Надеюсь, это даст вам некоторое представление о том, почему вы можете отключить прерывания.

1 голос
/ 19 декабря 2014

Представьте, что ваш процессор сейчас находится в обработчике "int3", и в это время происходит "int2", а недавно появившееся "int2" имеет более низкий приоритет по сравнению с "int3". Как бы мы справились с этой ситуацией?

В случае обработки «int3» мы маскируем другие прерыватели с более низким приоритетом. То есть мы видим, что «int2» сигнализирует ЦП, но ЦП не будет прерван им. После того, как мы закончили обработку «int3», мы возвращаемся из «int3» и снимаем маску с прерывателей с более низким приоритетом.

Место, куда мы вернулись, может быть:

  1. Другой процесс (в упреждающей системе)
  2. Процесс, который был прерван "int3" (в системе без вытеснения или в системе с вытеснением)
  3. Обработчик int, который прерывается "int3", скажем, обработчик int1.

В случаях 1 и 2, поскольку мы сняли маскировку с прерывателей с более низким приоритетом, а «int2» по-прежнему сигнализирует ЦП: «Привет, есть что-то, что вам нужно обработать немедленно», тогда ЦП будет снова прерван, когда выполняет инструкции от процесса для обработки "int2"

В случае 3, если приоритет «int2» выше, чем «int1», тогда ЦПУ будет снова прерван, когда он выполняет инструкции из обработчика «int1», для обработки «int2».

В противном случае обработчик "int1" выполняется без прерываний (поскольку мы также маскируем прерыватели с приоритетом ниже, чем "int1"), и ЦП возвращается к процессу после обработки «int1» и снятия маски. В это время "int2" будет обработан.

...