SynchCritSection 例程简介
关键部分 是需要独占访问硬件资源或驱动程序数据的代码部分。 也就是说,代码不得被可引用相同资源或数据的其他代码中断,并且资源或数据不得一次由多个处理器引用。
关键部分应仅限于 ISR 和 SynchCritSection 例程。 只有在将当前处理器的 IRQL 提高到设备的 DIRQL 值并获取旋转锁后,系统才会调用这些例程。 在 SynchCritSection 例程返回后,系统会释放旋转锁并降低处理器的 IRQL。
将处理器的 IRQL 提高到设备的 DIRQL 值可防止当前处理器中断,但优先级较高的设备除外。 获取旋转锁可防止其他处理器执行与该旋转锁关联的任何关键节代码。 (此旋转锁有时称为 中断旋转锁。)
设备驱动程序的 StartIo 和 DpcForIsr 或 CustomDpc 例程必须经常访问某些与驱动程序的 ISR 相同的 硬件资源 (,例如设备寄存器或其他总线相对内存) 或驱动程序维护的数据。 根据驱动程序的设备或设计,其调度、 AdapterControl、 ControllerControl 或计时器例程也可能访问硬件资源或驱动程序维护的数据。
若要调用任何非 ISR 关键部分,驱动程序必须使用 KeSynchronizeExecution 例程。 此例程接受 SynchCritSection 例程的地址作为输入,以及驱动程序定义的上下文信息和中断对象指针。 系统使用中断对象指针来确定要与 SynchCritSection 例程一起使用的 DIRQL 和旋转锁。 (驱动程序之前使用 IoConnectInterrupt 函数的 SpinLock 和 SynchronizeIrql 参数提供这些值。)