前阵子帮人收拾一台 Z590 平台的机器,装完系统头一件事就是开 Libre Hardware Monitor 盯温度。结果打开一看,CPU 那一栏只有占用率在跳,温度节点整个是空的,主板温度和硬盘温度倒是活蹦乱跳。换成别的工具一测,CPU Package 温度好端端摆在 40 来度。这就很说明问题了——传感器没坏,是 Libre Hardware Monitor 没读到。后来陆续又碰到几台 Intel 11 代处理器的机器,症状高度一致:有的只显示核心温度不显示封装温度,有的干脆一个温度项都没有,还有的显示个 0 度或者负数。这篇就把这条线上的坑一次说透,从取数原理到三步修复,再到怎么验证修没修对,全给你捋清楚。不管你是刚装完机的新手,还是天天跟硬件打交道的运维,照着走一遍基本都能解决。
1. 先弄明白 LHM 是怎么把温度读出来的
1.1 三条完全不同的取数通道,坏一条就少一块数据
很多人以为监控软件读温度就是一个 API 调用的事,其实背后是三条互不相干的路子,任何一条断了,你在界面上看到的就是空白或者错值。
第一条是CPU 内核自带的数字温度传感器(DTS),走的是 MSR 寄存器通道。CPU 内部每个核心都有一个温度二极管,固件把「距离上限还有多少度」这个偏移量写进特定寄存器,软件读出来再做一次减法就得到绝对温度。这条路最准,也是所有监控软件显示「CPU Core #1」到「CPU Core #N」「CPU Package」这些项的来源。它的前提是软件必须拿到Ring 0 权限,因为读 MSR 指令在用户态是被禁止的。
第二条是主板上的 Super I/O 芯片,走 SMBus/LPC 通道。主板上那颗小芯片负责采集一堆电压、风扇转速和几个外接热敏电阻的温度,CPU 插座附近通常也挂一个。这条路读到的是「主板测到的 CPU 区域温度」,比核心温度滞后,参考价值有但精度差一截。
第三条是ACPI 热区(Thermal Zone),走 WMI 通道。这是主板固件按规范上报的粗略温度,很多消费级主板压根就不实现或者只给一个常量,所以你用 PowerShell 查MSAcpi_ThermalZoneTemperature查不到东西,是常态,不是故障。
把这三条理顺了,你就明白为什么会出现「主板温度有、CPU 温度没有」这种诡异组合——Super I/O 那条路通了,MSR 那条路断了。反过来的情况也存在。修的时候一定先判断断的是哪条,别上来就重装软件。
1.2 为什么偏偏是 11 代处理器容易哑火
Intel 11 代是分两个完全不同的架构的:桌面端叫 Rocket Lake,移动端叫 Tiger Lake。这两者在温度读取上的实现细节不同,但踩坑的逻辑是一致的,我总结成三点。
第一,温度上限(TjMax)的编码位置和取值在新平台上做了调整。软件算绝对温度靠的是绝对温度 = TjMax − 相对偏移量这个公式。老版本软件的型号库里没有新平台的条目,TjMax 取到 0 或者取错,减出来的结果自然是 0 度、负数或者离谱的高温。这不是传感器没数据,是换算的基准值错了。
第二,500 系主板换了一批新的 Super I/O 芯片。像 Nuvoton 的 NCT6798D、NCT6799D,ITE 的 IT8688E、IT8689E 这些型号,在 0.8.x 时代的软件里根本没有对应的寄存器映射表,软件扫描过去不认识,主板温度、风扇转速整块就消失了。这类问题的特征是「设备树里连 Mainboard 节点都残缺」。
第三,权限门槛被系统收紧了。较新的 Windows 版本默认开启了内核隔离相关功能,会拦截这类需要底层访问的驱动程序。软件启动看起来一切正常,界面也渲染出来了,但它拿不到 Ring 0,所有走 MSR 的读数静默失败,界面上就是一片空白,连个错误提示都不给你。
1.3 影响范围:对号入座看看你在不在圈里
我把这几年遇到的案例按平台归了个类,你可以直接对照自己的配置。
| 平台类型 | 典型型号 | 常见主板芯片组 | 典型症状 |
|---|---|---|---|
| 桌面 11 代 | i5-11400/11500/11600、i7-11700、i9-11900 系列 | B560、H510、Z590 | 温度项全空,或只显示 0 度/负数 |
| 移动 11 代 | Tiger Lake 低压/标压移动版 | 集成在整机方案里 | 只有 Package 温度,核心温度全缺 |
| 跨代混装 | 11 代 CPU 配 400 系老主板(需厂商支持) | B460、Z490 | 主板温度正常,CPU 温度缺失 |
| 软件版本侧 | 0.8.x 及更早版本 | 不限 | 新型号 Super I/O 完全识别不到 |
还有一个容易被忽略的维度是软件版本区间。同一台机器,用旧版打开是空白,换成新版可能就正常了,也可能是相反的——新版修好了 11 代的 TjMax 换算,但你系统里的驱动拦截还在,照样读不出来。所以「换版本」和「解权限」这两件事必须分开验证,别混在一起做,否则出了问题你都不知道是哪一步起的作用。
2. 第一步:先把权限和驱动这道关打通
2.1 别小看「以管理员身份运行」和安装路径
这是最容易被跳过、又最容易出问题的一步。Libre Hardware Monitor 这类工具不是装上就能用,它每次启动都需要向系统申请加载一个内核态驱动文件,目录里那个.sys后缀的文件就是干这个的。普通权限启动时,这个申请会被直接拒绝,软件不会弹窗报错,只是默默把需要底层访问的传感器全部跳过。
正确的做法不是每次右键点一下,而是把这个动作固化下来。最省事的方案是在快捷方式的属性里勾上「以管理员身份运行此程序」,一劳永逸。如果你像我一样喜欢用脚本批量拉起一堆工具,可以写个启动器:
@echo off cd /d "%~dp0" powershell -Command "Start-Process 'LibreHardwareMonitor.exe' -Verb RunAs"更优雅的方案是用系统自带的任务计划程序建一个任务,触发器设成用户登录,操作里指向程序路径,同时在「常规」页勾选「使用最高权限运行」。这样开机能自动起、还不用每次点确认框,做长期监控特别合适。
路径这块有两个硬性要求。一是不要把程序放在压缩包里直接双击运行,Windows 对压缩包内文件的处理方式很特殊,.sys驱动文件往往解不出来,软件自然加载不到驱动。二是路径里别带特殊字符和过长的中文目录,某些情况下驱动加载会因为这个失败,而且失败得毫无提示。老老实实解压到一个短路径下,比如D:\Tools\LHM\,能省掉一半玄学问题。
注意:如果解压后目录里压根找不到
.sys文件,别怀疑系统,是压缩包没解全。有些下载渠道会给一个残缺的包,重新下一份完整的即可。
2.2 内存完整性和驱动阻止列表,是这两年的头号拦路虎
如果说权限是第一道门,那这个就是第二道,而且更隐蔽。较新的 Windows 版本默认开启了一项基于虚拟化的代码完整性保护,它会拒绝加载任何未通过微软签名认证的内核驱动。Libre Hardware Monitor 用的驱动显然不在白名单里,结果就是软件正常运行、界面正常显示、但所有底层读数全部为空。
检查路径很固定:打开系统设置里的「Windows 安全中心」,进「设备安全性」,找到「内核隔离」区域,点「内核隔离详细信息」,看「内存完整性」这个开关的状态。如果是开的,关掉它,然后必须重启,改完不重启等于没改。
同一页面上还有一个「Microsoft 易受攻击驱动程序阻止列表」的选项,这个东西在较新的系统版本里会主动拦截一批历史上有安全争议的驱动。如果关了内存完整性还是不行,可以试着把这个也关掉。但这里必须把话说清楚:这两项都是实打实的安全防护,关掉会降低系统对恶意驱动的抵抗能力。我的建议是,只在排查阶段临时关闭,确认问题解决后,如果你不是长期挂着监控,可以考虑再打开;如果确实需要长期监控,那就接受这个取舍,并且把软件来源控制在自己信得过的渠道。
图形界面点不动的时候,也可以用管理员权限的命令行改注册表,改完同样要重启:
# 关闭内存完整性(需重启生效) Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity" -Name "Enabled" -Value 0 -Type DWord # 关闭易受攻击驱动阻止列表(需重启生效) Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\CI\Config" -Name "VulnerableDriverBlocklistEnable" -Value 0 -Type DWord还有一类情况是杀毒软件或终端防护软件在中间拦截。表现是软件启动瞬间有个一闪而过的报错,或者干脆静默退出。这时候去安全软件的拦截记录里翻一下,如果看到针对该程序目录下.sys文件的拦截条目,把它加入信任区就行。
2.3 怎么确认驱动到底加载没有
别靠猜,用三个手段交叉确认,五分钟就能定位到底卡在哪。
方法一,看程序目录。启动之后观察目录里有没有新增的日志文件或者驱动释放文件,有些版本会把驱动释放到系统临时目录,启动瞬间能看到。如果目录完全没变化,说明程序连驱动释放这一步都没走完。
方法二,看系统事件日志。打开事件查看器,进「Windows 日志」下的「系统」,按时间倒序排,看看程序启动那个时间点附近有没有驱动加载失败的记录。签名验证失败、加载被策略阻止这类事件,这里都会有痕迹,错误码通常能直接指向原因。
方法三,用设备管理器看非即插即用设备。在设备管理器里点「查看」菜单,勾上「显示隐藏的设备」,然后展开「非即插即用驱动程序」这一节。如果驱动加载成功,这里能看到对应的条目;加载被拦的,条目不存在或者带黄色感叹号。
这三步做完,你就能确定问题到底是「权限不够」「被系统拦了」还是「被安全软件拦了」,后面的处理才有针对性。我在实际排查里最常遇到的是第二种,占了七成以上,尤其是那种「以前好好的,重装系统后就不行了」的案例,基本都是这个原因。
3. 第二步:把传感器源和显示项配对正确
3.1 设备树里真正该盯的是哪几个节点
权限通了之后,软件界面左侧会出现一棵设备树。这棵树的层级结构是「设备 → 传感器类别 → 具体传感器项」,很多人看到一堆项就懵了,其实只需要盯住三个位置。
CPU 节点下的 Temperatures 分类。展开后应该能看到 CPU Core #1 到 CPU Core #N(N 等于物理核心数)、CPU Core Max、CPU Core Average、CPU Package 这几项。如果这个分类整个不存在,那就是第一步的驱动问题没解决。如果分类存在但里面是空的,说明驱动在、但 MSR 读取被别的东西干扰。
Mainboard 节点下的 Temperatures 分类。这里显示的是 Super I/O 芯片采到的值,通常会有「Temperature #1」「Temperature #2」这种编号项,具体含义得查主板手册。这一块有数据但 CPU 那块没有,基本可以断定是 MSR 通道的问题,而不是硬件坏了。
CPU 节点下的 Loads 分类。这个是占用率,走的是性能计数器,不需要底层权限,所以它永远都有数据。很多人被它骗了——看到 CPU 节点有内容就以为软件工作正常,其实那只是占用率在跳,温度压根没读到。
还有个小细节值得说:某些版本和某些平台上,CPU 节点下会多出一些名字很长的项目,比如带「Distance」字样的,那是「距离温度上限还有多少度」的原始偏移量,不是绝对温度,别拿它当温度看。看到这个数值随着负载升高而变小,说明方向是对的。
3.2 从 TjMax 和偏移量算一遍,你就懂 0 度和负数怎么来的
这一段是整篇文章最「硬」的部分,搞懂了它,你以后看任何监控软件的异常读数都能一眼判断出问题性质。
CPU 内部的温度传感器上报的不是绝对温度,而是相对值。具体来说,一个寄存器里存着「温度上限」,另一个寄存器里存着「当前距离上限还差多少度」。软件要做的是减法:
绝对温度 = TjMax − 相对偏移量举个具体例子。11 代桌面处理器常见 TjMax 是 100 摄氏度。假设当前读到的偏移量是 45,那么:
绝对温度 = 100 − 45 = 55 摄氏度负载上去了,偏移量变小,比如变成 20,那么:
绝对温度 = 100 − 20 = 80 摄氏度逻辑很顺,对吧。现在问题来了:如果软件从型号库里取到的 TjMax 是错的,取成了 0,会发生什么?
绝对温度 = 0 − 45 = −45 摄氏度软件内部一般会把负数钳制成 0 显示出来,于是你看到的就是一个永远不动的 0 度。这就是「显示 0 度」这个症状的根因——不是读不到,是算错了。
还有一种情况是有效位判定失败。这类寄存器的高位有个标志位,表示这次读数是否可信。如果软件读取时机不对,或者被虚拟化层拦截导致读到全零,标志位判定为无效,软件就直接跳过该项不显示,于是你看到的就是「分类在、项缺失」。
理解了这一点,你就能得出一个重要结论:「显示 0 度」和「什么都不显示」是两类不同的问题。前者通常是软件版本或型号库的问题,后者通常是权限和驱动的问题。分开处理,效率能高一大截。
| 界面表现 | 大概率根因 | 优先处理方向 |
|---|---|---|
| 温度分类整个不存在 | 驱动未加载 / 被系统拦截 | 第一步:权限与驱动 |
| 分类存在,里面一片空白 | 有效位判定失败 / 被虚拟化层干扰 | 第二步:交叉验证 + 第三步:换版本 |
| 显示 0 度或负数 | TjMax 取值错误 | 第三步:升级版本 |
| 只有 Package,没有 Core | 核心数识别异常 | 第三步:升级版本 + 换备用读取模式 |
| 主板温度也缺失 | Super I/O 型号不认识 | 第三步:升级版本 |
3.3 三种独立手段交叉验证,别被单一读数骗了
修完之后必须验证,而且不能只看一个来源,否则很容易得出错误结论。
验证手段一,用 PowerShell 查固件上报的热区。这是完全独立于监控软件的一条路,走的是系统的 WMI 接口。打开 PowerShell 跑这段:
Get-CimInstance -Namespace "root/WMI" -ClassName MSAcpi_ThermalZoneTemperature | Select-Object InstanceName, @{n='TempCelsius';e={[math]::Round(($_.CurrentTemperature / 10) - 273.15, 1)}}注意这里的原始单位是十分之一开尔文,所以要除以 10 再减 273.15 换成摄氏度,这是很多人第一次写会算错的地方。跑完如果返回了数据,说明固件至少上报了一个热区;如果返回空,也不代表机器有问题——相当多的消费级主板压根不实现这个接口,这是设计如此,不是故障。
验证手段二,进固件设置界面看硬件监控页。重启进 BIOS/UEFI 设置,找硬件监控或者 PC Health 那一栏,那里显示的是主板自己采的温度,不依赖任何操作系统。如果那里温度正常,说明硬件层面没问题,纯粹是软件侧的事。这个手段的价值在于排除硬件故障,避免你在一台真正散热有问题的机器上折腾软件。
验证手段三,跑个负载看数值动不动。空载记一个数,然后开个压力测试跑两三分钟,再看数值。真实的温度读数一定会跟着涨,通常能涨二三十度。如果读数纹丝不动,哪怕数值看起来很合理(比如恒定的 45 度),那也说明这个值是假的——很可能是某个固定常量或者读取失败的占位值。
这三条交叉下来,你对「修没修好」就有确定答案了。我一般还会加一条:同时开两个不同的监控工具对比,如果两个工具读数差在 3 度以内,基本可以信任;差出十几度,那就得怀疑其中一个的换算基准有问题。
4. 第三步:版本、固件与软件冲突的补刀
4.1 版本选择和目录规范,是很多人反复失败的原因
前两步做完还是不显示,八成是版本问题。这个软件的更新节奏很有意思:型号库和寄存器映射表是跟着版本走的,新平台的支持往往滞后硬件上市几个月甚至更久。11 代桌面平台刚上市那阵,旧版本对它的支持就是不完整的,TjMax 取值表里没有对应条目,Super I/O 表里也没有 500 系主板的新芯片。
所以第一步操作是换成当前的最新稳定版。别用那些来路不明的修改版、汉化版、绿色版,这类包经常被替换掉驱动文件或者阉割掉某些功能模块,问题会变得更难排查。去项目的官方发布页下原始包,解压到本地目录再用。
换版本的时候有个细节必须注意:新旧版本不要共用一个目录。有些人图省事把新文件覆盖到旧目录里,结果残留的旧配置文件还在生效,表现就是「换了新版还是一样」。正确做法是新建一个干净目录,把新版本解压进去,配置全部重新设一遍。配置文件通常就在程序同目录下,删掉它等于恢复出厂设置,遇到各种诡异问题时这招特别管用。
还有一个容易踩的坑是运行库依赖。这类基于 .NET 的工具对运行库版本有要求,系统里缺了对应版本,程序要么起不来,要么起来之后某些功能模块加载失败。表现是界面正常但部分传感器项永远为空。遇到这种情况,装一个较新的 .NET 桌面运行时,通常能一次性解决。
4.2 固件设置里几个容易被忽略的开关
软件侧折腾完还是不行,就得往固件层看了。这里有几个开关值得确认。
硬件监控功能是否启用。部分主板的固件设置里有独立的「硬件监控」开关,关掉之后 Super I/O 芯片就不再采集数据,操作系统侧自然什么都读不到。这个选项通常在「高级」菜单下的监控相关页面里,名字各厂商不太一样,找带 Monitor、Health、Sensor 字样的就对了。
虚拟化相关功能的影响。开启某些虚拟化功能后,底层寄存器的访问路径会经过虚拟化层,部分工具在这个环境下读取会失败或者读到无效值。如果你确实不需要这些功能(比如不跑虚拟机、不用某些基于虚拟化的安全特性),可以临时关掉验证一下。但我得说清楚,这只是排查手段,验证完该开还是得开,长期关掉虚拟化换一个温度读数,这笔账不划算。
快速启动的影响。系统的快速启动功能会让机器在「关机」时进入一种半休眠状态,硬件状态没有被完全重置,某些情况下会导致传感器初始化不完整。如果你发现「重启之后正常,关机再开机就不正常」,那就把快速启动关掉试试,这个因果关系虽然听起来离谱,但在实际案例里确实出现过。
4.3 总线争夺:谁在偷偷占用 SMBus
这一类问题比较隐蔽,症状是「CPU 核心温度正常,但主板温度、风扇转速整块消失或者数值乱跳」。
原因在于主板上的 SMBus 是一条共享总线,除了监控软件,还有一堆东西会去访问它:灯效控制软件、风扇调速软件、某些外设的管理工具、甚至部分键盘鼠标的驱动。同一时刻只能有一个程序占用总线,谁先抢到谁用,其他程序读到的就是垃圾数据或者干脆超时失败。
排查方法很直接:把系统托盘里所有跟硬件相关的常驻程序全部退出,包括灯效软件、风扇控制软件、外设管理工具,然后重启监控软件再看。如果这时候数据回来了,那就一个个往回加,加到哪个出问题,元凶就找到了。
解决思路有两条。一条是错峰使用,把监控软件的启动时间延后,等灯效软件初始化完了再启动,很多时候就能共存。另一条是二选一,如果你只是偶尔看看温度,那就别让灯效软件常驻;反过来如果灯效是刚需,那就接受监控软件读不到主板数据这个事实,反正 CPU 核心温度走的是 MSR 通道,不受总线争夺影响。
提示:判断是不是总线争夺,有个快速方法——看数据是「完全没有」还是「有但乱跳」。完全没有通常是驱动或权限问题,有但乱跳、时有时无、数值明显不合理,才更可能是总线被抢。
5. 速查表和我实际踩过的坑
5.1 症状、原因、处置一张表看完
排查的时候按这张表从上往下走,绝大多数情况三步之内能定位。
| 序号 | 症状表现 | 最可能原因 | 处置动作 | 验证方式 |
|---|---|---|---|---|
| 1 | 双击没反应或闪退 | 权限不足或运行库缺失 | 管理员运行,补装运行时 | 能正常出界面 |
| 2 | 界面正常,只有占用率没温度 | 内核驱动被系统拦截 | 关内存完整性并重启 | 设备管理器能看到驱动条目 |
| 3 | 主板温度也没有 | 安全软件拦截驱动文件 | 加入信任区 | 目录下驱动文件存在 |
| 4 | 温度显示 0 度 | 型号库 TjMax 取值错误 | 升级到最新版本 | 数值随负载变化 |
| 5 | 只有 Package 没 Core | 核心数识别异常 | 升级版本,清空配置重来 | 核心项齐全 |
| 6 | 主板数据乱跳或时有时无 | SMBus 被其他软件占用 | 退出灯效/风扇类软件 | 数据稳定不跳变 |
| 7 | 重启正常,关机再开不正常 | 快速启动导致初始化不完整 | 关闭快速启动 | 多次冷启动均正常 |
| 8 | 固件里温度就异常 | 真实硬件或散热问题 | 清灰、换硅脂、查散热器 | 固件监控页数值正常 |
5.2 我踩过的四个坑,个个都花了不少时间
坑一:以为关了开关就生效,忘了重启。这是最蠢也最常见的一个。关完内存完整性,直接双击程序,还是空白,然后开始怀疑人生,折腾了半小时才想起来没重启。这类安全特性的开关全部需要重启才生效,改完先重启再验证,能省掉大量无效排查。
坑二:在压缩包里直接运行。有个同事把压缩包下到桌面,直接双击里面的可执行文件运行,界面能出来,但温度永远是空的。查了半天权限、查了半天系统设置,最后发现目录里根本没有驱动文件。这类工具必须完整解压,这是硬性前提,没有例外。
坑三:新版本覆盖装到旧目录,配置残留导致假失败。我一度以为新版本也没修好,因为换上去症状一模一样。后来把整个目录删掉重新解压,配置全部重设,一次就正常了。升级这类工具的正确姿势是全新目录 + 重新配置,覆盖安装是给自己找麻烦。
坑四:拿「距离上限的偏移量」当温度看。有些版本会把原始偏移量也列出来,数值大概在 40 到 80 之间,看起来特别像温度。我第一次看到还以为温度异常低,折腾半天才发现那是距离上限还有多少度,方向完全反了。看到数值随负载升高而下降的,那不是温度,别搞反了。
5.3 想长期省心,就把启动和查看这两件事自动化
排查完只是解决当下,想以后不再折腾,可以做两件小事。
第一件是把启动固化成计划任务,前面提过,设成登录时触发、最高权限运行。这样每次开机自动起来,不用手动点、不用过权限确认框,也不会出现「忘了用管理员运行」这种低级失误。
第二件是开启程序自带的远程查看功能。较新版本里有个内置的小型 Web 服务,开启后可以用浏览器访问本机的一个端口查看传感器数据,菜单里找带 Server 字样的选项就能开。这个功能在压力测试的时候特别好用——你全屏跑着测试软件,旁边用手机或者另一台机器开个网页就能实时看温度,不用来回切窗口。不同版本的菜单名称和默认端口会有差异,具体以你手上那版的设置为准。
另外建议养成一个习惯:换硬件、换系统、换大版本更新之后,第一时间打开监控工具确认一遍读数是否正常。很多问题是在环境变动后才出现的,早发现早处理,比等到机器莫名其妙降频了才回头查要省事得多。
我个人在实际操作中的体会是,这类「读不到温度」的问题,九成以上都不是硬件故障,而是权限、版本、配置这三者中某一环没对上。真正需要拆机检查散热的比例很低。所以遇到问题先别慌着怀疑硬件,按「权限 → 版本 → 冲突」这个顺序走一遍,绝大多数情况下半小时内就能搞定。最后再补一句实在话:监控软件读数是给你做参考的,不同工具之间差个三五度很正常,别为了两三度的差异反复折腾,把时间花在确认散热器压没压紧、硅脂涂没涂匀上,收益要大得多。