Что произойдет, если другое прерывание будет инициировано до того, как будет выполнено первое действие?
Этот вопрос из темы обработки прерываний.
Предположим, прерывание обслуживается. Что произойдет, если другое прерывание будет инициировано еще до того, как будет выполнено первое действие?
3 ответа
Следующее относится только к архитектуре x86, но другие архитектуры вполне могут следовать той же схеме:
Есть флаг процессора под названием IF
(Флаг прерывания), который определяет, могут ли аппаратные прерывания обрабатываться или должны быть приостановлены. Когда IF = 0, прерывания будут откладываться до повторного включения флага (за исключением NMI, немаскируемое прерывание, которое предназначено как прерывание "только для экстренных случаев", которое не может быть заблокировано).
IF
автоматически очищается процессором перед вызовом процедуры обработки прерываний. Это необходимо для того, чтобы вызовы прерывания не выходили из-под контроля. Обратите внимание, что сам код обработки прерываний не может сделать это сам по себе, потому что если IF
не были отключены перед входом в подпрограмму, было бы возможно сделать больше прерываний, прежде чем обслуживающий код успеет выполнить даже одну инструкцию. Тогда "пожарный шланг" прерываний немедленно приведет к (во всех отношениях) переполнению стека.
Итак, в ответ на ваш прямой вопрос: обычно, когда второе аппаратное прерывание происходит во время обслуживания начального, это прерывание будет отложено до завершения первого.
Как обычно, полная история немного сложнее. В Руководстве разработчика программного обеспечения для архитектуры Intel на веб-сайте Intel приведено более полное описание, начиная со страницы 10-4.
Это зависит от системы. Обычно, если новое прерывание имеет более высокий приоритет, чем первое, то оно отвечает, приостанавливая обработчик для первого прерывания. Когда его обработчик завершает работу, оригинальный обработчик прерываний возобновляется. Наконец, если больше нет прерываний, исходный обработчик завершает работу и возобновляет нормальное обслуживание. Иногда возобновленный процесс будет процессом, который был прерван; иногда это больше не будет наиболее приемлемым процессом, а какой-то другой возобновится.
Аналогично, если второй или последующий экземпляр исходного прерывания происходит до завершения первого обработчика, или если происходит прерывание с более низким или равным приоритетом, оно будет удерживаться до завершения первого обработчика. Перед возобновлением нормальной обработки ядро проверяет наличие ожидающих прерываний, которые должны были быть обработаны, но были заблокированы.
Обработчик прерываний может блокировать другие прерывания.
Что ж, если прерывания не были отключены после первого прерывания, второе вызовет повторный вызов вашей подпрограммы обработки прерываний. Вы должны убедиться, что прерывания отключены, чтобы избежать такого явно нежелательного поведения.
Итак, если ваша подпрограмма обработки прерываний делает свое дело, а затем происходит другое прерывание, это будет так же, как если бы вы делали что-нибудь еще: будет вызвана соответствующая подпрограмма прерывания.
В архитектуре Intel инструкция "cli" отключит прерывания, а "sti" включит их снова.