Windows系统的线程调度与软件中断分发

这篇博客深入探讨了Windows内核如何处理软件中断,包括DISPATCH_LEVEL、APC_LEVEL和PASSVIE_LEVEL三个中断级别。文章详细介绍了线程调度的过程,如空闲线程时的DPC例程分发和线程切换算法,以及在HalpDispatchSoftwareInterrupt函数中的中断处理。此外,还讨论了线程调试和可能影响线程调度的因素。
摘要由CSDN通过智能技术生成

在Windows操作系统内核把软件中断分为三个中断级别:DISPATCH_LEVEL,APC_LEVEL,PASSVIE_LEVEL。同时他们与线程的调试相关,WINDOWS内核中没有一个专门的程序来做线程的调度工作,它是散落在系统各个部分的。总结一下主要以下几种情况。

当空闲线程运行时粗略讲是1.先检查当前处理的DPC例程队列,分发DPC调用。2.检查NextThread是否为空,如果存在不为空就切换到这个线程,若为空进行第三步3.执行线程的调试算法。

当HalpDispatchSoftwareInterrupt被调用时。这个函数主要流程还是比较简单的,判断了第一个参数是否为1(APC_LEVEL)如果是调用KiDeliverApc来分发APC例程。若不是接看是否为2(DISPATCH_LEVEL),是的话就调用KiDispatchInterrupt。KiDispatchInterrupt这个函数内容较多,不过流程上跟空闲进程差不多。只是它检查了当前处理器的QuantumEnd标记,若不为0就执行KiQuantumEnd,KiQuantumEnd这个函数进行了线程的调试。

hal!HalpDispatchSoftwareInterrupt:

83c1f8c6 8bff            mov     edi,edi

83c1f8c8 55              push    ebp

83c1f8c9 8bec            mov     ebp,esp

83c1f8cb51              push    ecx

83c1f8cc53              push    ebx

83c1f8cd56              push    esi

83c1f8ce 9c              pushfd

83c1f8cf58              pop     eax

83c1f8d08945fc          mov     dword ptr [ebp-4],eax

83c1f8d38b75fc          mov     esi,dword ptr [ebp-4]

83c1f8d681e600020000    and     esi,200h

83c1f8dc 8a4508          mov     al,byte ptr [ebp+8]

83c1f8df 64a224000000    mov    byte ptr fs:[00000024h],al

83c1f8e57501            jne     hal!HalpDispatchSoftwareInterrupt+0x22 (83c1f8e8)

 

hal!HalpDispatchSoftwareInterrupt+0x21:

83c1f8e7fb              sti

 

hal!HalpDispatchSoftwareInterrupt+0x22:

83c1f8e833db            xor     ebx,ebx

83c1f8ea381dbd6ac383    cmp    byte ptr [hal!HalpEnableIrqlAudit (83c36abd)],bl

83c1f8f0 7405            je      hal!HalpDispatchSoftwareInterrupt+0x31 (83c1f8f7)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值