ВУЗ:
Составители:
53
{
PIO_STACK_LOCATION stack = IoGetCurrentStackLocation(Irp);
PDEVICE_EXTENSION pdx =
(PDEVICE_EXTENSION) device->DeviceExtension;
…
}
Задача функции StartIo инициировать обработку IRP. Способ обработки
полностью зависит от типа устройства. Необходимо иметь в виду, что эта
функция получает управление на уровне DISPATCH_LEVEL.
3.12 Обработчик прерывания ISR
Завершив пересылку данных, устройство может выдать аппаратное
прерывание. Обработчик прерывания работает на уровне IRQL конкретного
устройства (DIRQL) и защищается спин-блокировкой.
Спин
-блокировки реализуются различным образом для многопроцессорных
и однопроцессорных систем. Эти блокировки используются для доступа к общему
ресурсу.
Для многопроцессорных систем: код, выполняемый на процессоре А,
обращается к общему ресурсу в некоторый момент t1. Он устанавливает спин-
блокировку и начинает работать с ресурсом. Если в следующий момент времени
t2 код, выполняемый на процессоре Б, также захочет получить доступ к этому
ресурсу, он захочет захватить спин-блокировку. Так как спин-блокировка
принадлежит процессору А, процессор Б входит в активный цикл, постоянно
проверяя состояние ресурса, и ожидая его освобождения. Когда процессор А
снимает спин-блокировку, процессор Б обнаруживает, что ресурс освободился, и
захватывает его. С этого момента процессор Б имеет неограниченный доступ к
ресурсу. После завершения работы с ресурсом, процессор Б освобождает
блокировку.
В однопроцессорных системах спин-блокировка реализована существенно
проще. Здесь установление спин-блокировки повышает уровень IRQL до уровня
DISPATCH_LEVEL. В этом случае блокировка обеспечивается тем фактом, что
{ PIO_STACK_LOCATION stack = IoGetCurrentStackLocation(Irp); PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) device->DeviceExtension; … } Задача функции StartIo инициировать обработку IRP. Способ обработки полностью зависит от типа устройства. Необходимо иметь в виду, что эта функция получает управление на уровне DISPATCH_LEVEL. 3.12 Обработчик прерывания ISR Завершив пересылку данных, устройство может выдать аппаратное прерывание. Обработчик прерывания работает на уровне IRQL конкретного устройства (DIRQL) и защищается спин-блокировкой. Спин-блокировки реализуются различным образом для многопроцессорных и однопроцессорных систем. Эти блокировки используются для доступа к общему ресурсу. Для многопроцессорных систем: код, выполняемый на процессоре А, обращается к общему ресурсу в некоторый момент t1. Он устанавливает спин- блокировку и начинает работать с ресурсом. Если в следующий момент времени t2 код, выполняемый на процессоре Б, также захочет получить доступ к этому ресурсу, он захочет захватить спин-блокировку. Так как спин-блокировка принадлежит процессору А, процессор Б входит в активный цикл, постоянно проверяя состояние ресурса, и ожидая его освобождения. Когда процессор А снимает спин-блокировку, процессор Б обнаруживает, что ресурс освободился, и захватывает его. С этого момента процессор Б имеет неограниченный доступ к ресурсу. После завершения работы с ресурсом, процессор Б освобождает блокировку. В однопроцессорных системах спин-блокировка реализована существенно проще. Здесь установление спин-блокировки повышает уровень IRQL до уровня DISPATCH_LEVEL. В этом случае блокировка обеспечивается тем фактом, что 53
Страницы
- « первая
- ‹ предыдущая
- …
- 51
- 52
- 53
- 54
- 55
- …
- следующая ›
- последняя »