日期:2014-05-16 浏览次数:21018 次
在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