KiIdleLoop 函数分析
KiIdleLoop 函数分析概述KiIdleLoop是 ReactOS 内核空闲线程的主循环。当 CPU 上没有任何可运行的线程时调度器选择空闲线程运行进入此循环。它永不返回是引导 CPU 在完成KiInitializeKernel后进入的最终状态。文件[ke/i386/thrdini.c#L260](file:///d:/reactos/ntoskrnl/ke/i386/thrdini.c#L260)KiSystemStartupBootStack() [kiinit.c:691] └─ KiInitializeKernel() [kiinit.c:433] └─ ExpInitializeExecutive() └─ PsCreateSystemThread(Phase1Initialization) └─ Thread-Priority 0 └─ KiIdleLoop() [thrdini.c:260] └─ 永不返回完整源码DECLSPEC_NORETURN VOIDKiIdleLoop(VOID){PKPRCB PrcbKeGetCurrentPrcb();PKTHREAD OldThread,NewThread;/* Now loop forever */while(TRUE){/* Start of the idle loop: enable interrupts briefly */_enable();YieldProcessor();// PAUSE/HALT 提示YieldProcessor();_disable();/* Check for pending work */if((Prcb-DpcData[0].DpcQueueDepth)||(Prcb-TimerRequest)||(Prcb-DeferredReadyListHead.Next)){/* Clear DPC software interrupt */HalClearSoftwareInterrupt(DISPATCH_LEVEL);/* Process all pending DPCs */KiRetireDpcList(Prcb);}/* Check if a thread is ready to run */if(Prcb-NextThread){_enable();OldThreadPrcb-CurrentThread;// 空闲线程自己NewThreadPrcb-NextThread;// 要切换到的线程Prcb-NextThreadNULL;Prcb-CurrentThreadNewThread;NewThread-StateRunning;KiSwapContext(APC_LEVEL,OldThread);// ← 上下文切换}else{/* No work — let HAL put CPU to sleep */Prcb-PowerState.IdleFunction(Prcb-PowerState);}}}执行流程分析循环前 — 中断短暂使能并暂停_enable(); // sti — 开中断让挂起的中断有机会被处理 YieldProcessor(); // pause 指令 — 提示 CPU 处于自旋等待 YieldProcessor(); _disable(); // cli — 关中断检查共享状态前关中断YieldProcessor()在 x86 上映射为_mm_pausePAUSE 指令作用是提示 CPU 当前处于自旋等待循环优化流水线避免内存顺序违规的惩罚在 Hyper-Threading 场景尤其重要等同于__asm__ __volatile__(pause);短暂的sti使中断在空闲循环顶部能被响应之后cli关中断再检查共享数据结构DPC 队列、定时器请求、就绪线程链表符合关中断访问内核调度数据结构的规范。分支 A有挂起工作 — 处理 DPCif((Prcb-DpcData[0].DpcQueueDepth)||(Prcb-TimerRequest)||(Prcb-DeferredReadyListHead.Next)){HalClearSoftwareInterrupt(DISPATCH_LEVEL);KiRetireDpcList(Prcb);}检查三个条件条件含义DpcQueueDepth当前 CPU 的 DPC 队列中有待处理的延迟过程调用TimerRequest有定时器过期需要更新重计算就绪线程优先级等DeferredReadyListHead.Next有延迟就绪的线程等待被插入调度数据库如果任一条件为真HalClearSoftwareInterrupt(DISPATCH_LEVEL)— 清除 DPC 软件中断请求避免重复触发KiRetireDpcList(Prcb)— 执行所有挂起的 DPC同时处理定时器请求和延迟就绪线程KiRetireDpcList完成后可能已经有线程被加入Prcb-NextThread因此不会直接 fallthrough 到检查 NextThread 的分支而是从头开始下一轮循环。分支 B有待切换线程 — 上下文切换if(Prcb-NextThread){_enable();// 切换前开中断OldThreadPrcb-CurrentThread;// 空闲线程NewThreadPrcb-NextThread;// 要切换到的线程Prcb-NextThreadNULL;// 清空Prcb-CurrentThreadNewThread;NewThread-StateRunning;// 标记为运行中KiSwapContext(APC_LEVEL,OldThread);// ← ★ 上下文切换 ★}关键变量Prcb-CurrentThread— 当前 CPU 正在执行的线程空闲线程Prcb-NextThread— 调度器KiQuantumEnd/KiDispatchInterrupt/KiRetireDpcList等选择的下一个要运行的线程KiSwapContext 调用链KiSwapContext(APC_LEVEL, OldThread) [ctxswitch.S:79] └─ KiSwapContextInternal └─ KiSwapContextEntry(KSWITCHFRAME, OldThread~) ├─ 保存 OldThread-KernelStack ESP └─ KiSwitchThreads(OldThread, NewThread-KernelStack) mov esp, NewThread-KernelStack ← ★ 切换栈 └─ KiSwapContextExit(OldThread) ├─ 检查进程切换 → 切换 CR3 ├─ TSS.Esp0 NewThread-InitialStack ├─ TEB 设置 └─ 异常链 恢复非易失寄存器 ret → KiThreadStartup (新线程的 CtxSwitchFrame.RetAddr)KiSwapContext 返回后KiSwapContext返回时CPU 已经在新线程的栈上。OldThread参数就是当前的空闲线程这意味着当空闲线程下次被调度时KiSwapContext会返回到KiIdleLoop中KiSwapContext的下一行空闲循环继续执行while (TRUE)的下一轮迭代分支 C无工作 — 空闲节能else{Prcb-PowerState.IdleFunction(Prcb-PowerState);}当既无 DPC/定时器待处理也无就绪线程时调用空闲节能函数。PopIdle0[power.c#L501](file:///d:/reactos/ntoskrnl/po/power.c#L501)VOID FASTCALLPopIdle0(IN PPROCESSOR_POWER_STATE PowerState){HalProcessorIdle();}HalProcessorIdle[halx86/pic/processor.c#L46](file:///d:/reactos/hal/halx86/pic/processor.c#L46)VOID NTAPIHalProcessorIdle(VOID){_enable();// sti — 开中断__halt();// hlt — 暂停 CPU 直到下一个外部中断}HLT 指令的作用CPU 暂停执行进入低功耗模式等待下一个外部中断硬件中断或 IPI唤醒中断触发后CPU 继续执行HalProcessorIdle的下一行即返回为什么 PopIdle0 不带中断使能/关闭— 根据注释 “Note the HAL returns with interrupts on”IdleFunction返回时中断已经开启。HalProcessorIdle在执行hlt前通过_enable()开中断hlt后的隐式中断处理完成后控制流返回 IdleLoop 的while (TRUE)顶部重新走_enable()→YieldProcessor()→_disable()流程。与调度器的协作关系中断/异常 │ ▼ KiDispatchInterrupt ← 时钟中断、IPI 等 │ ├─ 选择新线程 → Prcb-NextThread NewThread ├─ 请求 DPC 软件中断 └─ 返回到被中断的线程也可能是空闲线程 │ ▼ (如果是空闲线程且 IRQL 降至 PASSIVE_LEVEL) KiIdleLoop 的下一条指令执行 → 发现 NextThread → 上下文切换调度器不会直接调用KiIdleLoop而是通过设置Prcb-NextThread来间接通知空闲线程进行切换。典型的唤醒路径设备中断 → ISR → 请求 DPC → 软件中断 → KiDispatchInterrupt → 线程被唤醒 → 插入就绪队列 → Prcb-NextThread NewThread → 返回到空闲线程 → KiIdleLoop 发现 NextThread → KiSwapContext第一次上下文切换从 KiIdleLoop 到 Phase1Initialization引导 CPU 的第一次KiSwapContext发生在KiIdleLoop() → Prcb-NextThread Phase1Initialization 线程 (由 KiInitializeKernel → ExpInitializeExecutive 创建) → KiSwapContext(APC_LEVEL, IdleThread) → 切换到 Phase1Initialization 内核栈 → ret → KiThreadStartup → PspSystemThreadStartup → Phase1Initialization()之后 Phase1 初始化线程完成所有初始化工作最终创建 SMSS.EXE而空闲线程继续在KiIdleLoop中循环随时准备切换到新的就绪线程。设计要点总结特性说明永不返回DECLSPEC_NORETURNwhile(TRUE)是 CPU 的最终归宿节能设计无工作时执行HLT指令暂停 CPU等待中断唤醒DPC 处理在空闲上下文中执行 DPC避免占用工作线程时间片中断窗口循环顶部短暂sti让挂起中断有机会执行竞态保护检查共享调度状态时cli关中断微架构优化PAUSE指令提示 Hyper-Threading / 流水线优化SMP 安全KiSwapContext在SYNCH_LEVEL执行#ifdef CONFIG_SMP

相关新闻

2026年7类热门职业证书官方报考指南:陪诊师 | 物业经理 | 人力资源管理师 | 心理咨询师 | 图书管理员 | 健康管理师 | 公共营养师全汇总

2026年7类热门职业证书官方报考指南:陪诊师 | 物业经理 | 人力资源管理师 | 心理咨询师 | 图书管理员 | 健康管理师 | 公共营养师全汇总

进入 2026 年,职业技能标准化建设持续推进,持证上岗逐步成为多行业的准入标配。从民生服务到企业管理,从健康领域到文化服务,各类职业证书的含金量与职场适配度不断提升。本文整理 7 类当下热度高、就业前景广的职业证书&#xff…

2026/8/4 14:53:12 阅读更多 →
从STM32到ESP32-S3:开源计算器移植实战

从STM32到ESP32-S3:开源计算器移植实战

1. 项目概述去年夏天,我在GitHub上偶然发现了NumWorks计算器的开源项目,这个基于STM32平台的图形计算器以其优雅的UI设计和完整的数学功能吸引了我。作为一名嵌入式开发者,我萌生了一个大胆的想法:能否将它移植到性能更强、价格更…

2026/8/4 0:53:50 阅读更多 →
2015年Android开发工具链与框架演进回顾

2015年Android开发工具链与框架演进回顾

1. 2015年Android开发生态全景回顾2015年是Android开发史上具有里程碑意义的一年。Material Design设计语言在经历2014年的发布后开始全面普及,Android Studio 1.0正式版发布取代Eclipse成为官方IDE,Gradle构建系统也日趋成熟。这一年涌现了大量优秀的开…

2026/8/3 11:23:33 阅读更多 →

最新新闻

Wand-Enhancer:彻底解锁WeMod专业功能的本地增强神器

Wand-Enhancer:彻底解锁WeMod专业功能的本地增强神器

Wand-Enhancer:彻底解锁WeMod专业功能的本地增强神器 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 想象一下,你正在《赛博…

2026/8/4 14:53:34 阅读更多 →
如何利用APK安装器打破Windows与Android生态壁垒

如何利用APK安装器打破Windows与Android生态壁垒

如何利用APK安装器打破Windows与Android生态壁垒 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在跨平台应用需求日益增长的今天,Windows用户经常面临一个…

2026/8/4 14:53:34 阅读更多 →
专业做手绘地图导览的公司,如何用独特画笔描绘旅行之美?

专业做手绘地图导览的公司,如何用独特画笔描绘旅行之美?

专业手绘地图导览公司如何用独特画笔描绘旅行之美?在数字地图无处不在的时代,手绘地图导览却悄然成为一种流行。它不仅是方向的指引,更是一种文化表达。面对同质化的导览体验,专业公司如何用独特画笔,真正描绘出旅行之…

2026/8/4 14:53:34 阅读更多 →
TPS5430电源芯片18V转3V的电源电路,效率可高达90%

TPS5430电源芯片18V转3V的电源电路,效率可高达90%

电路设计,电源部分是必须要考虑的内容,电源都处理不好怎给其他芯片电路模块供电?所以做电路设计的必须学会电源部分处理,如果实现各种电源之间转换,是否隔离、过流、过压保护等。下面为大家介绍一种由18V转3V的电源电路…

2026/8/4 14:53:34 阅读更多 →
WarcraftHelper:魔兽争霸3终极优化指南,让你的经典游戏焕然一新

WarcraftHelper:魔兽争霸3终极优化指南,让你的经典游戏焕然一新

WarcraftHelper:魔兽争霸3终极优化指南,让你的经典游戏焕然一新 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争…

2026/8/4 14:53:34 阅读更多 →
AI工具降重降AIGC率实测

AI工具降重降AIGC率实测

许多同学完成初稿后都遇到过:查重没问题,但AIGC检测率却很高。明明自己写的,或者AI辅助后反复改过,还是被标为“疑似AI生成”。这时候,一款能切实降低AIGC率的工具就成了刚需。我们测试了多款工具,发现逢君…

2026/8/4 14:52:34 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →