Подтвердить что ты не робот

Маскировка прерываний: почему?

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

4b9b3361

Ответ 1

ОС делает это, когда готовится запустить свой собственный код "let anchestrate world".

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Способ обработки "int3" , мы маскируем другие прерыватели с более низким приоритетом. То есть мы видим, что "int2" сигнализирует о CPU, но процессор не будет прерван им. После того, как мы закончим обработку "int3" , мы возвращаемся с "int3" и разоблачаем прерыватели с более низким приоритетом.

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

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

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

В случае 3, если приоритет "int2" выше, чем "int1" , тогда CPU будет прерван снова, когда он выполнит инструкции из обработчика "int1" , чтобы обрабатывать "int2" .

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