Организация ввода-вывода. Драйверы WDM. Рощин А.В. - 53 стр.

UptoLike

Составители: 

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