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