news 2026/10/31 18:54:19

nt!KiQuantumEnd函数分析之KiComputeNewPriority后时间片加满和优先级降到基本优先级

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
nt!KiQuantumEnd函数分析之KiComputeNewPriority后时间片加满和优先级降到基本优先级

nt!KiQuantumEnd函数分析之KiComputeNewPriority后时间片加满和优先级降到基本优先级

Thread->Priority = KiComputeNewPriority(Thread, 1);


FORCEINLINE
SCHAR
KiComputeNewPriority (
IN PKTHREAD Thread,
IN SCHAR Adjustment
)
{

SCHAR Priority;

//
// Compute the new thread priority.
//

ASSERT((Thread->PriorityDecrement >= 0) && (Thread->PriorityDecrement <= Thread->Priority));
ASSERT((Thread->Priority < LOW_REALTIME_PRIORITY) ? TRUE : (Thread->PriorityDecrement == 0));

Priority = Thread->Priority;
if (Priority < LOW_REALTIME_PRIORITY) {
Priority = Priority - Thread->PriorityDecrement - Adjustment;
if (Priority < Thread->BasePriority) {
Priority = Thread->BasePriority;
}

Thread->PriorityDecrement = 0;
}

return Priority;
}

第二部分:


0: kd> g
Breakpoint 27 hit
eax=f789eedc ebx=ffdff000 ecx=00000041 edx=00002012 esi=00000000 edi=804edc60
eip=80a40778 esp=ba1b0bfc ebp=ba1b0c04 iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
nt!KiQuantumEnd:
80a40778 55 push ebp
0: kd> kc 2
#
00 nt!KiQuantumEnd
01 nt!KiDispatchInterrupt
0: kd> dx -id 0,0,89831250 -r1 ((basesrv!_KPRCB *)0xffdff120)
((basesrv!_KPRCB *)0xffdff120) : 0xffdff120 [Type: _KPRCB *]
[+0x000] MinorVersion : 0x1 [Type: unsigned short]
[+0x002] MajorVersion : 0x1 [Type: unsigned short]
[+0x004] CurrentThread : 0x895f2a78 [Type: _KTHREAD *]
[+0x008] NextThread : 0x0 [Type: _KTHREAD *]

0: kd> dx -id 0,0,89831250 -r1 ((basesrv!_KTHREAD *)0x895f2a78)
((basesrv!_KTHREAD *)0x895f2a78) : 0x895f2a78 [Type: _KTHREAD *]
[+0x000] Header [Type: _DISPATCHER_HEADER]
[+0x010] MutantListHead [Type: _LIST_ENTRY]
[+0x018] InitialStack : 0xba1b1000 [Type: void *]
[+0x01c] StackLimit : 0xba1ad000 [Type: void *]
[+0x020] KernelStack : 0xba1b0c5c [Type: void *]
[+0x024] ThreadLock : 0x0 [Type: unsigned long]
[+0x028] ContextSwitches : 0x470 [Type: unsigned long]
[+0x02c] State : 0x2 [Type: unsigned char]
[+0x02d] NpxState : 0xa [Type: unsigned char]
[+0x02e] WaitIrql : 0x0 [Type: unsigned char]
[+0x02f] WaitMode : 1 [Type: char]
[+0x030] Teb : 0x7ffd5000 [Type: void *]
[+0x034] ApcState [Type: _KAPC_STATE]
[+0x04c] ApcQueueLock : 0x0 [Type: unsigned long]
[+0x050] WaitStatus : 258 [Type: long]
[+0x054] WaitBlockList : 0x895f2b18 [Type: _KWAIT_BLOCK *]
[+0x058] Alertable : 0x0 [Type: unsigned char]
[+0x059] WaitNext : 0x0 [Type: unsigned char]
[+0x05a] WaitReason : 0x6 [Type: unsigned char]
[+0x05b] Priority : 15 [Type: char]
[+0x05c] EnableStackSwap : 0x1 [Type: unsigned char]
[+0x05d] SwapBusy : 0x0 [Type: unsigned char]
[+0x05e] Alerted [Type: unsigned char [2]]
[+0x060] WaitListEntry [Type: _LIST_ENTRY]
[+0x060] SwapListEntry [Type: _SINGLE_LIST_ENTRY]
[+0x068] Queue : 0x0 [Type: _KQUEUE *]
[+0x06c] WaitTime : 0x105ee7d7 [Type: unsigned long]
[+0x070] KernelApcDisable : 0 [Type: short]
[+0x072] SpecialApcDisable : 0 [Type: short]
[+0x070] CombinedApcDisable : 0x0 [Type: unsigned long]
[+0x078] Timer [Type: _KTIMER]
[+0x0a0] WaitBlock [Type: _KWAIT_BLOCK [4]]
[+0x100] QueueListEntry [Type: _LIST_ENTRY]
[+0x108] ApcStateIndex : 0x0 [Type: unsigned char]
[+0x109] ApcQueueable : 0x1 [Type: unsigned char]
[+0x10a] Preempted : 0x0 [Type: unsigned char]
[+0x10b] ProcessReadyQueue : 0x0 [Type: unsigned char]
[+0x10c] KernelStackResident : 0x1 [Type: unsigned char]
[+0x10d] Saturation : 0 [Type: char]
[+0x10e] IdealProcessor : 0x0 [Type: unsigned char]
[+0x10f] NextProcessor : 0x0 [Type: unsigned char]
[+0x110] BasePriority : 13 '\r' [Type: char]
[+0x111] Spare4 : 0x0 [Type: unsigned char]
[+0x112] PriorityDecrement : 2 [Type: char]
[+0x113] Quantum : -31 [Type: char]

0: kd> kv 2
# ChildEBP RetAddr Args to Child
00 ba1b0bf8 80b007e7 804ee6e5 ba1b0cac 804edc60 nt!KiQuantumEnd (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ke\dpcsup.c @ 246]
01 ba1b0bfc 804ee6e5 ba1b0cac 804edc60 badb0d00 nt!KiDispatchInterrupt+0xc7 (FPO: [Uses EBP] [0,0,3]) [d:\srv03rtm\base\ntos\ke\i386\ctxswap.asm @ 317]
windbg> .open -a ffffffff80b007e7
windbg> .open -a ffffffff80a40778

if ((Process->DisableQuantum != FALSE) &&
(Thread->Priority >= LOW_REALTIME_PRIORITY)) {

Thread->Quantum = MAXCHAR;

} else {
Thread->Quantum = Process->ThreadQuantum;

0: kd> p
eax=f789eedc ebx=ffdff000 ecx=00000041 edx=00002012 esi=00000000 edi=804edc60
eip=80a40781 esp=ba1b0bdc ebp=ba1b0bf8 iopl=0 nv up ei ng nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286
nt!KiQuantumEnd+0x9:
80a40781 648b3d20000000 mov edi,dword ptr fs:[20h] fs:0030:00000020=ffdff120
0: kd> p
eax=f789eedc ebx=ffdff000 ecx=00000041 edx=00002012 esi=00000000 edi=ffdff120
eip=80a40788 esp=ba1b0bdc ebp=ba1b0bf8 iopl=0 nv up ei ng nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286
nt!KiQuantumEnd+0x10:
80a40788 648b3524010000 mov esi,dword ptr fs:[124h] fs:0030:00000124=895f2a78
0: kd> p
eax=f789eedc ebx=ffdff000 ecx=00000041 edx=00002012 esi=895f2a78 edi=ffdff120
eip=80a4078f esp=ba1b0bdc ebp=ba1b0bf8 iopl=0 nv up ei ng nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286
nt!KiQuantumEnd+0x17:
80a4078f 33c0 xor eax,eax
0: kd> p
eax=00000000 ebx=ffdff000 ecx=ffdff9e4 edx=00002012 esi=895f2a78 edi=ffdff120
eip=80a407ae esp=ba1b0bdc ebp=ba1b0bf8 iopl=0 nv up ei ng nz ac pe cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000297
nt!KiQuantumEnd+0x36:
80a407ae ff15ac30a080 call dword ptr [nt!_imp__KeRaiseIrqlToSynchLevel (80a030ac)] ds:0023:80a030ac={hal!KeRaiseIrqlToSynchLevel (804edc14)}
0: kd> p
eax=00000002 ebx=ffdff000 ecx=ffdff9e4 edx=00000004 esi=895f2a78 edi=ffdff120
eip=80a407b4 esp=ba1b0bdc ebp=ba1b0bf8 iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
nt!KiQuantumEnd+0x3c:
80a407b4 ff150831a080 call dword ptr [nt!_imp__KeGetCurrentIrql (80a03108)] ds:0023:80a03108={hal!KeGetCurrentIrql (804edc6c)}
0: kd> p
eax=895f2a9c ebx=80a059f8 ecx=00000000 edx=00000004 esi=895f2a78 edi=ffdff120
eip=80a407ea esp=ba1b0bdc ebp=ba1b0bf8 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiQuantumEnd+0x72:
80a407ea ff150831a080 call dword ptr [nt!_imp__KeGetCurrentIrql (80a03108)] ds:0023:80a03108={hal!KeGetCurrentIrql (804edc6c)}
0: kd> p
eax=ffdff9bc ebx=80a059f8 ecx=00000000 edx=00000004 esi=895f2a78 edi=ffdff120
eip=80a40821 esp=ba1b0bdc ebp=ba1b0bf8 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiQuantumEnd+0xa9:
80a40821 388e13010000 cmp byte ptr [esi+113h],cl ds:0023:895f2b8b=e1
0: kd> dd 895f2a78+113h
895f2b8b 010100e1 00000300 54e02000 00000389
895f2b9b b207a000 5f2aac80 5f2ba889 00000089
895f2bab 00000000 00000000 00000000 00000000
895f2bbb 00000000 00000000 7c0d1800 1b0d64e1
895f2bcb 000012ba 00000400 1b100000 300012ba
895f2bdb 00000000 5f2a7800 5f2aac89 5f2aac89
895f2beb a4167a89 a4167e80 a416a880 00000080
895f2bfb 00000000 00000000 00000000 05000500
0: kd> p
eax=ffdff9bc ebx=80a059f8 ecx=00000000 edx=00000004 esi=895f2a78 edi=ffdff120
eip=80a4082d esp=ba1b0bdc ebp=ba1b0bf8 iopl=0 nv up ei ng nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286
nt!KiQuantumEnd+0xb5:
80a4082d 8b4644 mov eax,dword ptr [esi+44h] ds:0023:895f2abc=8954e020
0: kd> p
eax=8954e020 ebx=80a059f8 ecx=00000000 edx=00000004 esi=895f2a78 edi=ffdff120
eip=80a40830 esp=ba1b0bdc ebp=ba1b0bf8 iopl=0 nv up ei ng nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286
nt!KiQuantumEnd+0xb8:
80a40830 384869 cmp byte ptr [eax+69h],cl ds:0023:8954e089=00
0: kd> p
eax=8954e020 ebx=80a059f8 ecx=00000000 edx=00000004 esi=895f2a78 edi=ffdff120
eip=80a40847 esp=ba1b0bdc ebp=ba1b0bf8 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiQuantumEnd+0xcf:
80a40847 8a4063 mov al,byte ptr [eax+63h] ds:0023:8954e083=24
0: kd> p
eax=8954e024 ebx=80a059f8 ecx=00000000 edx=00000004 esi=895f2a78 edi=ffdff120
eip=80a40850 esp=ba1b0bdc ebp=ba1b0bf8 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiQuantumEnd+0xd8:
80a40850 8a8612010000 mov al,byte ptr [esi+112h] ds:0023:895f2b8a=02
0: kd> dx -id 0,0,89831250 -r1 ((basesrv!_KPRCB *)0xffdff120)
((basesrv!_KPRCB *)0xffdff120) : 0xffdff120 [Type: _KPRCB *]
[+0x000] MinorVersion : 0x1 [Type: unsigned short]
[+0x002] MajorVersion : 0x1 [Type: unsigned short]
[+0x004] CurrentThread : 0x895f2a78 [Type: _KTHREAD *]

[+0x928] ReadySummary : 0x0 [Type: unsigned long]

0: kd> dx -id 0,0,89831250 -r1 ((basesrv!_KTHREAD *)0x895f2a78)
((basesrv!_KTHREAD *)0x895f2a78) : 0x895f2a78 [Type: _KTHREAD *]
[+0x000] Header [Type: _DISPATCHER_HEADER]
[+0x010] MutantListHead [Type: _LIST_ENTRY]
[+0x018] InitialStack : 0xba1b1000 [Type: void *]
[+0x01c] StackLimit : 0xba1ad000 [Type: void *]
[+0x020] KernelStack : 0xba1b0c5c [Type: void *]
[+0x024] ThreadLock : 0x1 [Type: unsigned long]
[+0x028] ContextSwitches : 0x470 [Type: unsigned long]
[+0x02c] State : 0x2 [Type: unsigned char]
[+0x02d] NpxState : 0xa [Type: unsigned char]
[+0x02e] WaitIrql : 0x0 [Type: unsigned char]
[+0x02f] WaitMode : 1 [Type: char]
[+0x030] Teb : 0x7ffd5000 [Type: void *]
[+0x034] ApcState [Type: _KAPC_STATE]
[+0x04c] ApcQueueLock : 0x0 [Type: unsigned long]
[+0x050] WaitStatus : 258 [Type: long]
[+0x054] WaitBlockList : 0x895f2b18 [Type: _KWAIT_BLOCK *]
[+0x058] Alertable : 0x0 [Type: unsigned char]
[+0x059] WaitNext : 0x0 [Type: unsigned char]
[+0x05a] WaitReason : 0x6 [Type: unsigned char]
[+0x05b] Priority : 15 [Type: char]

[+0x112] PriorityDecrement : 2 [Type: char]
[+0x113] Quantum : 36 '$' [Type: char] [+0x113] Quantum : 36 '$'

第三部分:

Thread->Priority = KiComputeNewPriority(Thread, 1);//之后

15-2-1=12<13
13

0: kd> p
eax=8954e00d ebx=80a059f8 ecx=0000000d edx=00000004 esi=895f2a78 edi=ffdff120
eip=80a408b9 esp=ba1b0bdc ebp=ba1b0bf8 iopl=0 nv up ei ng nz ac pe cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000297
nt!KiQuantumEnd+0x141:
80a408b9 837f0800 cmp dword ptr [edi+8],0 ds:0023:ffdff128=00000000
0: kd> dx -id 0,0,89831250 -r1 ((basesrv!_KTHREAD *)0x895f2a78)
((basesrv!_KTHREAD *)0x895f2a78) : 0x895f2a78 [Type: _KTHREAD *]
[+0x000] Header [Type: _DISPATCHER_HEADER]
[+0x010] MutantListHead [Type: _LIST_ENTRY]
[+0x018] InitialStack : 0xba1b1000 [Type: void *]
[+0x01c] StackLimit : 0xba1ad000 [Type: void *]
[+0x020] KernelStack : 0xba1b0c5c [Type: void *]
[+0x024] ThreadLock : 0x1 [Type: unsigned long]
[+0x028] ContextSwitches : 0x470 [Type: unsigned long]
[+0x02c] State : 0x2 [Type: unsigned char]
[+0x02d] NpxState : 0xa [Type: unsigned char]
[+0x02e] WaitIrql : 0x0 [Type: unsigned char]
[+0x02f] WaitMode : 1 [Type: char]
[+0x030] Teb : 0x7ffd5000 [Type: void *]
[+0x034] ApcState [Type: _KAPC_STATE]
[+0x04c] ApcQueueLock : 0x0 [Type: unsigned long]
[+0x050] WaitStatus : 258 [Type: long]
[+0x054] WaitBlockList : 0x895f2b18 [Type: _KWAIT_BLOCK *]
[+0x058] Alertable : 0x0 [Type: unsigned char]
[+0x059] WaitNext : 0x0 [Type: unsigned char]
[+0x05a] WaitReason : 0x6 [Type: unsigned char]
[+0x05b] Priority : 13 '\r' [Type: char]

[+0x110] BasePriority : 13 '\r' [Type: char]
[+0x111] Spare4 : 0x0 [Type: unsigned char]
[+0x112] PriorityDecrement : 0 [Type: char]
[+0x113] Quantum : 36 '$' [Type: char]

if (Prcb->NextThread == NULL) {
if ((NewThread = KiSelectReadyThread(Thread->Priority, Prcb)) != NULL) {
NewThread->State = Standby;
Prcb->NextThread = NewThread;
}

} else {
Thread->Preempted = FALSE;
}


0: kd> dx -id 0,0,89831250 -r1 ((basesrv!_KPRCB *)0xffdff120)
((basesrv!_KPRCB *)0xffdff120) : 0xffdff120 [Type: _KPRCB *]
[+0x000] MinorVersion : 0x1 [Type: unsigned short]
[+0x002] MajorVersion : 0x1 [Type: unsigned short]
[+0x004] CurrentThread : 0x895f2a78 [Type: _KTHREAD *]
[+0x008] NextThread : 0x0 [Type: _KTHREAD *]
[+0x00c] IdleThread : 0x80b200c0 [Type: _KTHREAD *]


[+0x928] ReadySummary : 0x0 [Type: unsigned long]
[+0x92c] SelectNextLast : 0x0 [Type: unsigned long]
[+0x930] DispatcherReadyListHead [Type: _LIST_ENTRY [32]]


KiReleaseThreadLock(Thread);
if (Prcb->NextThread != NULL) { 不符合条件。

总体来说,时间片有加满了,优先级从15降到了13。基本优先级。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/30 17:04:27

nodejs+vue超能驾校线上学习管理系统的设计与实现_82fsoq6e

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 同行可拿货,招校园代理 nodejsVue超能驾校线上学习管理系统的设计与实现_82fsoq6…

作者头像 李华
网站建设 2026/10/31 3:25:14

set_exception_handler的工作流程的庖丁解牛

set_exception_handler() 是 PHP 中用于捕获未被捕获的异常&#xff08;uncaught exceptions&#xff09; 的核心机制。它的存在使得我们可以在异常“逃逸”出整个调用栈、导致脚本致命终止前&#xff0c;介入处理、记录日志、返回友好错误页面。一、核心定义&#xff1a;它做什…

作者头像 李华
网站建设 2026/10/31 9:20:51

vue和springboot框架开发的幼儿园管理系统_xfxm3eqe

文章目录 具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 同行可拿货,招校园代理 vuespringboot_xfxm3eqe 框架开发的幼儿园管理系…

作者头像 李华
网站建设 2026/10/30 6:04:57

OpenBB:开启金融数据开源新纪元,技术革新引领未来投资风向

摘要&#xff1a; 在金融科技日新月异的今天&#xff0c;OpenBB作为首个开源的金融数据平台&#xff0c;正以颠覆性的姿态重塑金融数据分析的格局。本文深入剖析OpenBB的技术架构、数据集成能力、AI智能应用以及其对企业级用户的创新贡献&#xff0c;旨在为金融分析师、量化交易…

作者头像 李华
网站建设 2026/10/30 23:00:42

计算机毕设java代驾服务 基于Java的智能代驾服务平台设计与实现 Java驱动的代驾服务管理系统开发

计算机毕设java代驾服务jfesz9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着信息技术的飞速发展&#xff0c;代驾服务行业迎来了新的机遇与挑战。传统的代驾服务管理方式因…

作者头像 李华