0
点赞
收藏
分享

微信扫一扫

整理关于Windows自旋锁实现


结合前面​​从IRQ到IRQL(APIC版) ​​和​​Windows 自旋锁分析(一) ​​

可以知道HalBeginSystemInterrupt通过用IRQL做索引在HalpIRQLtoTPR数组中获取该IRQL对应的任务优先级,
用该优先级设置任务优先级寄存器TPR,
并把TPR中原先的任务优先级/16做为索引在HalpVectorToIRQL数组中获取对应的原先的IRQL然后返回。

观察KeGetCurrentIrql的实现

hal!KeGetCurrentIrql:
mov eax,dword ptr ds:[FFFE0080h] <------------> ds:[FFFE0080h]是任务优先级寄存器TPR,eax存放了原任务优先级
shr eax,4
movzx eax,byte ptr hal!HalpVectorToIRQL [eax] ------> 在HalpVectorToIRQL数组中获取对应的原先的IRQL
ret

db hal!HalpVectorToIRQL: 任务优先级到IRQL的转换表(任务优先级/16做为索引,得到IRQL)内容
00 ff ff 01 02 ff 05 06 07 08 09 0a 1b 1c 1d 1e
00 00 00 00 00 00 00 00 2a 00 00 00 c4 00 00 00

KeAcquireSpinLock 在单核处理器的实现
hal!KfAcquireSpinLock:
mov edx,dword ptr ds:[0FFFE0080h] --->同KeGetCurrentIrql一样,获得之前任务优先级
mov dword ptr ds:[0FFFE0080h],41h --->设置当前任务优先级到任务优先级寄存器TPR
下次通过KeGetCurrentIrql获得IRQL时,得到任务优先级=0x41,再通过
HalpVectorToIRQL转换(/16=4),获得当前IRQL=DISPATCH_LEVEL
shr edx,4
movzx eax,byte ptr hal!HalpVectorToIRQL [edx]
ret

举报

相关推荐

0 条评论