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/7/19 6:47:41 阅读更多 →
从STM32到ESP32-S3:开源计算器移植实战

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

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

2026/7/19 6:47:41 阅读更多 →
2015年Android开发工具链与框架演进回顾

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

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

2026/7/19 6:47:41 阅读更多 →

最新新闻

C++高性能广告预算优化系统:算法原理、工程实现与性能调优

C++高性能广告预算优化系统:算法原理、工程实现与性能调优

1. 项目概述:当C遇上广告预算优化 在广告技术领域,预算优化是一个经典且核心的命题。简单来说,就是广告主手里有一笔钱,要在多个广告位、多个时间段、多个目标人群中分配,目标是花最少的钱,拿到最多的点击、…

2026/7/19 10:18:22 阅读更多 →
完整设备升级指南:让老旧Mac硬件重获新生

完整设备升级指南:让老旧Mac硬件重获新生

完整设备升级指南:让老旧Mac硬件重获新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为2017年之前的老旧Mac无法升级到最新macOS系统而烦…

2026/7/19 10:18:22 阅读更多 →
C++多线程编程:互斥量原理、应用与性能优化全解析

C++多线程编程:互斥量原理、应用与性能优化全解析

1. 项目概述:为什么我们需要互斥量? 如果你写过C多线程程序,大概率遇到过这种情况:两个线程同时对一个全局变量进行累加,比如各自加100万次,你满心期待最终结果是200万,但程序跑出来的数字却总是…

2026/7/19 10:18:22 阅读更多 →
Android开发实战:修复讯飞TTS原生库缺失导致的崩溃问题(附完整解决方案与调试技巧)

Android开发实战:修复讯飞TTS原生库缺失导致的崩溃问题(附完整解决方案与调试技巧)

简介 在移动开发中,集成第三方SDK时常常会遇到原生库缺失导致的崩溃问题。本文以真实项目场景为例,深度剖析讯飞离线TTS因 libAIKIT.so 缺失引发的崩溃问题,并提供完整的修复方案。 文章将覆盖以下核心内容: 原生库加载失败的根源分析 从静态方法到实例方法的架构重构 多…

2026/7/19 10:18:22 阅读更多 →
华为 MetaERP AI 智能体全景体系:从办公提效到业务赋能全场景落地框架一、体系总览:AI 原生一体化智能体架构定位MetaERP AI 智能体并非外挂 AI 插件,而是深度内嵌 ERP 内

华为 MetaERP AI 智能体全景体系:从办公提效到业务赋能全场景落地框架一、体系总览:AI 原生一体化智能体架构定位MetaERP AI 智能体并非外挂 AI 插件,而是深度内嵌 ERP 内

华为 MetaERP AI 智能体全景体系:从办公提效到业务赋能全场景落地框架一、体系总览:AI 原生一体化智能体架构定位MetaERP AI 智能体并非外挂 AI 插件,而是深度内嵌 ERP 内核的AI 原生全域协同智能系统,以「昇腾算力 盘古大模型 …

2026/7/19 10:18:22 阅读更多 →
KnpGaufretteBundle在微服务架构中的应用:分布式文件管理终极指南

KnpGaufretteBundle在微服务架构中的应用:分布式文件管理终极指南

KnpGaufretteBundle在微服务架构中的应用:分布式文件管理终极指南 【免费下载链接】KnpGaufretteBundle Easily use Gaufrette in your Symfony projects. 项目地址: https://gitcode.com/gh_mirrors/kn/KnpGaufretteBundle 在现代微服务架构中,分…

2026/7/19 10:17:22 阅读更多 →

日新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:00:40 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:00:40 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:00:40 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:00:40 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:00:40 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:00:40 阅读更多 →

月新闻