Что произойдет, если другое прерывание будет вызвано до завершения первого действия прерывания?

Этот вопрос из темы обработки прерываний.

Предположим, что прерывание обслуживается. Что произойдет, если другое прерывание возникнет еще до завершения первого действия прерывания?


person Community    schedule 31.05.2009    source источник


Ответы (3)


Следующее относится только к архитектуре x86, но другие архитектуры вполне могут следовать тому же шаблону:

Существует флаг процессора, называемый IF (флаг прерывания), который определяет, могут ли аппаратные прерывания обрабатываться или должны быть приостановлены. Когда IF = 0, прерывания будут отложены до тех пор, пока флаг не будет снова установлен (за исключением NMI, немаскируемого прерывания, которое предназначено как «только аварийное» прерывание, которое не может быть заблокировано).

IF автоматически очищается процессором перед вызовом процедуры обслуживания прерывания. Это необходимо, чтобы предотвратить выход из-под контроля вызовов прерывания. Обратите внимание, что сам код обслуживания прерывания не мог бы сделать это сам по себе, потому что, если бы IF не было отключено перед входом в подпрограмму, могло бы произойти больше прерываний, прежде чем код обслуживания успеет выполнить хотя бы одну команду. Тогда «пожарный шланг» прерываний немедленно приведет (из всех вещей) к переполнению стека.

Итак, отвечая на ваш прямой вопрос: обычно, когда второе аппаратное прерывание происходит во время обслуживания начального, это прерывание будет приостановлено до тех пор, пока не завершится первое.

Как обычно, полная история немного сложнее. Руководство разработчика программного обеспечения для архитектуры Intel на сайте Intel. сайт дает более полное описание, начиная со страницы 10-4.

person Euro Micelli    schedule 31.05.2009

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

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

Обработчик прерывания может блокировать другие прерывания.

person Jonathan Leffler    schedule 31.05.2009

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

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

В архитектуре Intel инструкция «cli» отключает прерывания, а «sti» снова включает их.

person Mr. Shickadance    schedule 31.05.2009