整理关于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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值