Что произойдет, если другое прерывание будет инициировано до того, как будет выполнено первое действие? - PullRequest
8 голосов
/ 31 мая 2009

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

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

Ответы [ 3 ]

4 голосов
/ 31 мая 2009

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

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

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

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

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

2 голосов
/ 31 мая 2009

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

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

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

0 голосов
/ 31 мая 2009

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

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

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

...