Обработка прерываний в системах SMP - PullRequest
3 голосов
/ 06 октября 2009

Назначены ли прерывания фиксированному ЦП (всегда обрабатываются одним и тем же ЦП)?

Чтобы поставить мой вопрос в контексте:

От: http://msdn.microsoft.com/en-us/library/ms795060.aspx

У спин-блокировки, защищающей общую область, IRQL равен DIRQL, при котором устройство прерывает работу. Пока подпрограмма критического раздела удерживает спин-блокировку и обращается к общей области в DIRQL, ISR нельзя запускать ни на однопроцессорном, ни на SMP-компьютере.

Это имеет смысл на однопроцессорной машине, поскольку прерывание не будет обслуживаться ЦП, пока не будет снята блокировка, поскольку IRQL ЦП не меньше, чем прерывание IRQL. Однако на компьютере SMP что помешает обработке прерывания другим процессором (а не процессору, владеющему блокировкой) и повредит данные ...?

Ответы [ 2 ]

2 голосов
/ 06 октября 2009

Чтение следующего раздела ...

В машине SMP ISR не может приобрести спиновый замок, который защищает общие данные в то время как подпрограмма критического сечения содержит спин-блокировка и доступ к общим данным на DIRQL.

... Я думаю, это говорит о том, что на SMP-машине может произойти прерывание ; но если произойдет прерывание, то подпрограмма обслуживания прерываний (запущенная на другом процессоре) все еще не сможет получить блокировку вращения: то есть она будет вращаться, тратить циклы, пытаться получить блокировку вращения, если вы не отпустите блокировку вращения, которая позволяет ожидающий ISR приобретает его.

Мне было интересно, почему он может позволить ISR работать на другом процессоре вместо маскирования прерываний (чтобы предотвратить запуск ISR), как это происходит в случае с одним процессором. Ответ на этот вопрос заключается в том, что независимо от того, могут ли новые ISR быть запущены на другом процессоре, пока удерживается спин-блокировка, факт заключается в том, что (в отличие от случая с одним процессором) ISR может уже работать на другом процессоре в момент запуска спин-блокировки DIRQL: и по этой причине такой ISR (если он существует на другом процессоре) должен вращаться (если он пытается получить спин-блокировку).

0 голосов
/ 06 октября 2009

Насколько я понимаю, когда система поднимает DIRQL до определенного уровня, любые прерывания с уровнем DIRQL или ниже эффективно отключаются на всех процессорах. Вот почему вы не должны поднимать IRQL дольше, чем это необходимо.

Очень маленький код драйвера должен поднять IRQL до уровня выше уровня диспетчеризации (который не маскирует прерывания). Единственный код драйвера, который должен поднять IRQL выше, - это код, который на самом деле должен взаимодействовать (обмениваться данными с) с обработчиком прерываний.

Редактировать : ChrisW получил лучшее описание того, что происходит в системе SMP - повышение IRQL на процессоре предотвратит обработку IRQ на этом конкретном процессоре. Если обработчик прерываний запланирован на другом ЦП, а спин-блокировка, защищающая общие данные, удерживается первым ЦП, обработчик прерываний будет вращаться на его ЦП до тех пор, пока первый ЦП не освободит спин-блокировку (для доступа к общим данным обработчик прерываний должен получить спин-блокировку, которая заставляет обработчик прерывания ждать).

Так что держите эти спин-блокировки как можно короче (и как можно реже).

...