1、 自旋锁(spinlock)
自旋锁(KSPIN_LOCK)只能用于内核模式的同步机制,定义为KSPIN_LOCK,自旋锁可以应用于IRQL>=DISPATCH_LEVEL保护并发操作的共享数据和资源的SMP(对称多处理器)机器上。
包括驱动在内的很多组件都会使用自旋锁,例如:大部分文件系统的驱动中会使用互锁工作队列用来存放文件系统工作线程和FSD(file system driver)的IRP,该队列通过一个执行自旋锁保护,用来解决FSD试图插入IRP的同时其它线程请求删除IRP。
XP及XP以后的系统可以使用KeAcquireInStackQueuedSpinLock和KeReleaseInStackQueuedSpinLock去请求和释放队列自旋锁。队列自旋锁可以保证在多处理器机器上,先到先获取spinlock。
对于简单的数据结构,可以使用ExInterlockedXxx函数保证数据的原子操作,使用这类函数的操作不需要使用自旋锁。
在驱动中根据以下原则使用自旋锁:
1) 保护的数据必须是非分页内存
2) 需要调用KeInitializeSpinLock去初始化自旋锁
3) 在合适的IRQL使用自旋锁,执行自旋锁<=DISPATCH_LEVEL,中断自旋锁<=DIRQL
4) 执行的过程要尽量快,没有程序可以保持一个自旋锁超过25ms
5) 不要在执行以下操作的时候保持自旋锁状态:
Ø 导致硬件异常或者提升软件异常
Ø 尝试访问分页内存
Ø 使用递归导致死锁或者保持自旋锁时间超过25ms
Ø 尝试请求另外一个自旋锁有可能会导致死锁
Ø 调用违反上述规则的函数
对于32位系统KeAcquireSpinLock函数分析:
可以通过wdm.h文件了解到
#