2012-02-22 2 views
0

Я следую за драйверами устройств Linux. Когда он вводит штифты, он дает следующий пример:Что произойдет, если обработчик прерывания начнет вращаться?

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

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

Это связано с тем, что подпрограмма в обработчике прерываний не может быть выгружена? Если это так, то сказать, что процедура прерывания должна быть атомарной?

+0

Обработчик прерываний вращается, потому что он попытался взять спин-блокировку, которая уже удерживается кодом без прерывания, последний из которых может не запускаться до завершения прерывания. –

ответ

2

Это потому, что подпрограмма в обработчике прерываний не может быть выгружена?

Не по процессуально-контекстному коду.

Если это так, то сказать, что процедура прерывания должна быть атомарной?

Он может быть прерван прерыванием с более высоким приоритетом или NMI (или SMM).

Смежные вопросы