系列文章目录
【开源项目分享】可监控电脑CPU、显卡、内存等硬件的温度、功率和使用情况
(一)开源的硬件监控工具 LibreHardwareMonitor
(二)LibreHardwareMonitor 分层架构设计
(三)LibreHardwareMonitor 硬件检测机制
(四)LibreHardwareMonitor 扩展硬件支持
引言
LibreHardwareMonitor 是一个开源的硬件监控工具,能够实时读取和显示计算机的硬件状态,包括 CPU、GPU、内存、主板、存储等组件的温度、电压、负载、转速等信息。本文档旨在深入分析其分层架构设计,详细阐述从底层硬件访问到上层用户界面的完整数据流路径。
系统采用清晰的五层架构:硬件访问层、硬件抽象层、传感器管理层、核心控制层和 UI 展示层,每一层都有明确的职责边界和松耦合的设计。通过分析其源码,我们将揭示其如何通过端口 I/O、MSR 读取、WMI 查询和 NVMe 命令等多种技术安全地获取硬件数据,并通过事件驱动和访问者模式(Visitor Pattern)实现高效的数据更新与遍历。
项目结构
LibreHardwareMonitor 的项目结构体现了清晰的模块化设计。主要分为 UI 层、核心库(LibreHardwareMonitorLib)和第三方驱动/工具。
核心库 LibreHardwareMonitorLib 是整个系统的心脏,包含了所有硬件监控的逻辑。Interop 目录封装了与 Windows API 和底层驱动的交互。Hardware 目录是核心,实现了五层架构中的前三层。WMI 目录提供了通过 Windows Management Instrumentation 访问硬件信息的途径。UI 层则负责数据的可视化展示。

架构概览
LibreHardwareMonitor 采用分层架构,将复杂的硬件监控任务分解为职责单一的五个层次。这种设计提高了代码的可维护性、可扩展性和可测试性。数据流从物理硬件开始,逐层向上封装,最终在 UI 层呈现给用户。权限提升和驱动加载是硬件访问层的关键,确保了对底层硬件的合法访问。

技术细节
硬件访问层分析
硬件访问层是系统与物理硬件交互的最底层,负责执行具体的 I/O 操作。它主要依赖两个核心组件:InpOut 和 Ring0。
InpOut 用于直接的端口 I/O 操作,而 Ring0 则通过加载一个内核驱动(WinRing0.sys)来实现更高权限的操作,如读取 MSR(Model Specific Registers)和 PCI 配置空间。
硬件访问层序列图,如下:

硬件抽象层分析
硬件抽象层位于硬件访问层之上,其核心是 IHardware 接口和 Hardware 抽象基类。这一层将具体的硬件设备(如 CPU、GPU、主板)抽象为统一的模型。
- IHardware
接口定义了硬件的通用属性,如名称(Name)、唯一标识符(Identifier)、硬件类型(HardwareType)、传感器列表(Sensors)和子硬件(SubHardware)。 - Hardware 类实现了这些接口,并提供了 Update() 方法用于刷新硬件状态。通过继承 Hardware
类,可以创建针对特定硬件的实现,如 IntelCpu 或 AmdGpu,它们负责调用底层的硬件访问层来获取原始数据。

传感器管理层分析
传感器管理层负责管理硬件上的具体测量点,其核心是 ISensor 接口和 Sensor 实现类。
- ISensor
接口定义了传感器的类型(SensorType,如温度、电压、转速)、当前值(Value)、历史最大/最小值(Max/Min)以及历史数据记录(Values)。 - Sensor 类是具体的实现,它不仅存储了传感器的元数据(如名称、索引),还负责维护一个 SensorValue
结构的列表,用于记录一段时间内的采样数据。Value 属性的 set 访问器是关键,它在更新当前值的同时,会将旧值存入历史记录,并更新
Max 和 Min。

依赖分析
LibreHardwareMonitor 的依赖关系清晰,遵循了依赖倒置原则。
- 高层模块(如 Computer)依赖于抽象(IHardware, ISensor),而不是具体的实现。
- Computer 类依赖于 Ring0 和 InpOut 这样的具体驱动类,但这些驱动类本身是系统与操作系统交互的必要组件。
- Hardware 和 Sensor 类是核心抽象,被所有具体的硬件实现类所依赖。
- UI 层则完全依赖于 Computer 类提供的 Hardware 列表和 Sensor 数据,实现了与底层逻辑的解耦。

性能分析
系统的性能主要受数据采样频率和底层 I/O 操作的影响。频繁地通过 Ring0 或 InpOut 进行端口 I/O 操作是性能瓶颈。
为了优化性能,系统采用了以下策略:
- 首先,Computer.Traverse() 方法在遍历硬件时使用了 lock 语句来保证线程安全,但这也可能成为多线程环境下的瓶颈。
- 其次,Sensor 类对历史数据进行了聚合处理,例如在 Value 的 set 访问器中,每4个采样值才计算一次平均值并存入
_values 列表,这减少了历史数据的存储量和处理开销。 - 此外,Computer 类的 Is*Enabled 属性在 _open 状态下才会动态添加或移除硬件组,避免了在运行时频繁地重构硬件树。
总结
LibreHardwareMonitor 的分层架构设计精良,职责分明。从底层的 InpOut 和 Ring0 驱动,到 IHardware 和 ISensor 的抽象,再到 Computer 的统一控制,每一层都有效地封装了复杂性。系统通过访问者模式实现了高效、解耦的数据更新机制,并通过事件驱动模型响应硬件变化。尽管存在对管理员权限的依赖和潜在的性能瓶颈,但其清晰的代码结构和模块化设计使其成为一个强大且易于扩展的硬件监控框架。对于开发者而言,理解这五层架构是进行二次开发或贡献代码的基础。
项目地址
项目地址:https://github.com/LibreHardwareMonitor/LibreHardwareMonitor
如果访问不了GitHub,可下载我整理的压缩包,里面包含如下内容:
1、LibreHardwareMonitor-master.zip(GitHub下载的源码)
2、net472.zip(本地编译后的exe文件,实测可在Windows11正常运行使用)
3、README.zh-CN.md(项目描述文件)
4、目录文件说明.md(源码目录说明)
【点击下载(需要5积分)】
1072

被折叠的 条评论
为什么被折叠?



