Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Критически важные разделы — это разделы кода, требующие эксклюзивного доступа к аппаратным ресурсам или данным драйвера. То есть код не должен прерываться другим кодом, который может ссылаться на те же ресурсы или данные, и ресурсы или данные не должны ссылаться на несколько процессоров одновременно.
Критические разделы должны быть ограничены подпрограммами ISR и SynchCritSection . Система вызывает эти подпрограммы только после повышения IRQL текущего процессора до значения DIRQL устройства и приобретения спин-блокировки. После возврата подпрограммы SynchCritSection система освобождает спиновую блокировку и снижает IRQL процессора.
Повышение уровня IRQL процессора до значения DIRQL устройства предотвращает прерывание текущего процессора, за исключением случаев, когда устройство с более высоким приоритетом вызывает прерывание. При захвате спин-блокировки другие процессоры не выполняют критически важный код раздела, связанный с этой спин-блокировкой. (Эта спин-блокировка иногда называется спин-блокировкой прерываний.)
Подпрограммы драйвера устройства StartIo и DpcForIsr или CustomDpc часто должны получать доступ к некоторым из таких же аппаратных ресурсов (например, регистров устройств или другой памяти, относящейся к шине) или данных, поддерживаемых драйвером, что и ISR драйвера. В зависимости от устройства или дизайна драйвера, его диспетчерских функций, AdapterControl, ControllerControl или функций таймера могут также получить доступ к аппаратным ресурсам или данным, поддерживаемым драйверами.
Чтобы вызвать любую критически важную секцию, не связанную с ISR, драйвер должен использовать подпрограмму KeSynchronizeExecution. Эта подпрограмма принимает адрес подпрограммы SynchCritSection в качестве входных данных, а также сведения о контексте, определяемые драйвером, и указатель объекта прерывания. Система использует указатель объекта прерывания для определения DIRQL и спинлока для использования с подпрограммой SynchCritSection. (Драйвер ранее предоставил эти значения с помощью параметров SpinLock и SynchronizeIrql функции IoConnectInterrupt.)