日期:2014-05-16  浏览次数:20978 次

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

在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 &n