CPU温度监测发展历程和硬件支持

  1. 早期的CPU(2000以前),都是采用主板CPU插槽下面的温度探头来测量温度,因此准确性欠佳
  2. 到了2000以后,CPU开始逐步内置温度传感器。早期的CPU温度传感器的信息,是由CPU汇报给BIOS,通过WMI来获取,由于WMI只是操作系统层面的东西,所以准确性以及时效性都很差。此时的CPU温度数据一旦变化,必须要等到系统某些信息发生变化时数据才会刷新。 所以后来硬件默认放弃了往WMI里面写数据,现在通过wmi基本获取不到温度信息了。
  3. 再后来CPU制造商开始向CPU内加入DTS(Digital Thermal Sensor,数字温度传感器),所得的数据更为精确。(Intel是从Yonah核心的P-M处理器开始使用DTS的,官方文档里面有说明,而AMD官方确认DTS的存在,是从修订版本为F的Opteron )。
  4. DTS的工作原理是:Absolute Core Temperature = TJMax - DTS(实际温度=TJMax-DTS),Tjmax有固定和从寄存器读取两种方式。但由于每个CPU的TJMax值也肯定完全不同,CPU厂商不可能在每颗CPU出厂之前都进行测试和校正,只能根据ES版CPU来制定一个大概的TJMax值。 这些说明我们实际获取到的CPU温度不是很准确

获取CPU温度使用到的技术

  1. DeviceIoControl 函数是直接发送控制代码到指定的设备驱动程序,使相应的移动设备以执行相应的操作的函数。
  2. drivers.sys 底层驱动程序,主要目的是获取Ring0权限,为了能够无提供给开发者使用,需要做一个DLL提供对外的接口(mydrivers.dll)
  3. mydrivers.dll 加载mydrivers.sys与系统驱动层进行通讯,执行汇编指令,读写寄存器
  4. intel cpu 所有系列的CPU都是统一的使用用rdmsr指令读取特定寄存器的值,然后用TjunctionMax 减去这个值就是当前cpu的温度
  5. amd cpu,这个cpu分为10,16,17这三个系列,每个系列的对应的温度获取方式不一样

CPU温度获取的具体实现方式

  1. intel的DST的值就存放在2个寄存器里面:0x019C、0x1B1,读取出来后当前温度 = TJMax-dst。实现代码如下:

    void IntelCPU::GetTemperature(void)
    {DWORD eax = 0, edx = 0, ebx = 0;DWORD dwMax = 100;float fValue = 0.0;if (!m_bInit){GetCPUFamily();GetCPUCoreCount();m_bInit = true;}if(Rdmsr(IA32_TEMPERATURE_TARGET, &eax, &edx)){dwMax = (eax >> 16) & 0xff;}eax = 0;edx = 0;switch(m_CPUFamily){case 0x06:switch(m_CPUModel){case 0x0F:switch(m_CPUStepping){case 0x06:switch(m_CPUCore){case 2:dwMax = 80 + 10;break;case 4:dwMax = 90 + 10;break;default:dwMax = 85 + 10;break;}dwMax = 80 + 10;break;case 0x0B:dwMax = 90 + 10;break;case 0x0D:dwMax = 85 + 10;break;default:dwMax = 85 + 10;break;}break;case 0x17:dwMax = 100;case 0x1C:switch(m_CPUStepping){case 0x02:dwMax = 90;break;case 0x0A:dwMax = 100;break;default:dwMax = 90;break;}break;case 0x1A:case 0x1E:case 0x25:case 0x2c:dwMax = 100;}}if(WinRing0::RdmsrEx(IA32_THERM_STATUS_MSR, &eax, &ebx, (1L << 0))){if((eax & 0x80000000) != 0){float deltaT = (float)((eax & 0x007F0000) >> 16);m_Temperature = (float)dwMax - deltaT;}}else if(WinRing0::RdmsrEx(IA32_PACKAGE_THERM_STATUS, &eax, &ebx, (1L << 0))){if((eax & 0x80000000) != 0){float deltaT = (float)((eax & 0x007F0000) >> 16);m_Temperature = (float)dwMax - deltaT;}}
    }
  2. amd10系列温度获取,温度存储的寄存器有多个:0x1203、0x1303、0x1703、0x1603,分别进行读取

    void AMD10CPU::GetTemperature(void)
    {DWORD pciAddress = 0;int   nFamily = 10;pciAddress = CCPUBase::GetPciAddress(MISCELLANEOUS_CONTROL_FUNCTION, PCI_AMD_10H_MISCELLANEOUS_DEVICE_ID);if(pciAddress == 0){pciAddress = CCPUBase::GetPciAddress(MISCELLANEOUS_CONTROL_FUNCTION, PCI_AMD_11H_MISCELLANEOUS_DEVICE_ID);nFamily = 11;}if(pciAddress == 0){pciAddress = CCPUBase::GetPciAddress(MISCELLANEOUS_CONTROL_FUNCTION, FAMILY_12H_14H_MISCELLANEOUS_CONTROL_DEVICE_ID);nFamily = 12;}if(pciAddress == 0){pciAddress = CCPUBase::GetPciAddress(MISCELLANEOUS_CONTROL_FUNCTION, FAMILY_15H_MISCELLANEOUS_CONTROL_DEVICE_ID);nFamily = 15;}if(pciAddress != 0){DWORD value;if(WinRing0::ReadPciConfigDwordEx(pciAddress, REPORTED_TEMPERATURE_CONTROL_REGISTER, &value)){if(nFamily == 15 && (value & 0x30000) == 0x30000){m_Temperature = ((value >> 21) & 0x7FC) / 8.0f - 49;}else{m_Temperature = ((value >> 21) & 0x7FF) / 8.0f;}}}
    }
  3. amd16系列温度获取,需要先读取到DST的地址再来读取dst值

    void AMD0FCPU::GetTemperature(void)
    {DWORD value;pciAddress = WinRing0::FindPciDeviceById(PCI_AMD_VENDOR_ID, PCI_AMD_0FH_MISCELLANEOUS_DEVICE_ID, 0);if(pciAddress != 0xFFFFFFFF){if(WinRing0::WritePciConfigDwordEx(pciAddress, THERMTRIP_STATUS_REGISTER, THERM_SENSE_CORE_SEL_CPU0)){if(WinRing0::ReadPciConfigDwordEx(pciAddress, THERMTRIP_STATUS_REGISTER, &value)){m_Temperature = (float)((value >> 16) & 0xFF);}}}
    }
  4. amd17系列温度获取:

    void AMD17CPU::GetTemperature(void)
    {WinRing0Ins.WaitIsaBusMutex();if (!WinRing0::WritePciConfigDwordEx(0, WRITE_TEMPERATURE_CONTROL_REGISTER, FAMILY_17H_M01H_THM_TCON_TEMP)){m_Temperature = 0;WinRing0Ins.ReleaseIsaBusMutex();return;}DWORD value = 0;if (WinRing0::ReadPciConfigDwordEx(0, READ_TEMPERATURE_CONTROL_REGISTER, &value)){m_Temperature = ((value >> 21) & 0x7FF) / 8.0f;if ((value & FAMILY_17H_M01H_THM_TCON_TEMP_RANGE_SEL) != 0)m_Temperature -= 49;}m_Temperature -= m_tctlOffset;WinRing0Ins.ReleaseIsaBusMutex();
    }

windows获取CPU温度相关推荐

  1. windows用c++获取cpu温度

    很抱歉,获取 CPU 温度并不是一件简单的事情,因为 Windows 操作系统本身不提供直接获取 CPU 温度的 API.你可以使用第三方软件来读取 CPU 温度信息,然后通过 Windows API ...

  2. C# 获取CPU 温度 的两种方式

    上次接手了一个需要对服务器的检测系统软件,但是在获取CPU温度的时候总是出问题,查找了很多的资料,总结了以下两种方法,是比较常见的 //第一种方法 就是传统的 wimi 方式获取 ,需要引进一个命名空 ...

  3. 关于获取CPU温度的CSDN帖子

    关于获取CPU温度的CSDN帖子 (2008-02-19 13:27:28) 1:各位高手,回句话啊!!cpu的温度放在那里了!!有谁知道!! bios里面那个对么??可以通过读bios来得到cpu的 ...

  4. Zabbix添加对Windows 客户端CPU温度的监控

    标签:zabbix 温度是监测一台机器运行的重要参数 Zabbix预置的模板中没有对CPU温度的监控,所以我们需要使用自定义的KEY对温度进行监测 Windows没有温度监测的组件这时候需要借助第三方 ...

  5. RK3588 实现温控风扇之获取cpu温度(一)

    RK3588 实现温控风扇系列文章 第一章: RK3588 实现温控风扇之如何获取cpu温度(一) 第二章: RK3588 实现温控风扇之pwm驱动调试(二) 第三章: RK3588 实现温控风扇之通 ...

  6. Linux系统获取CPU温度

    Linux系统获取CPU温度 摘自:https://jingyan.baidu.com/article/cbf0e500407d072eab289343.html 各位好,本篇将简单介绍如何在不同系列 ...

  7. Windows获取主板温度

    Windows获取主板温度 原文地址:https://blog.csdn.net/weixin_39931683/article/details/112259469?utm_medium=distri ...

  8. 使用python获取cpu温度

    import clr import time #获取cpu温度 clr.AddReference(r'D:\temp\OpenHardwareMonitor\OpenHardwareMonitorLi ...

  9. Python在Linux下获取CPU温度、使用率、内存使用率、硬盘使用率

    方法一: psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于 ...

  10. 用C/C++获取CPU温度总结(一)

    最近在研究怎样获取CPU的温度,网上也有一些办法,但都不算完整,没有清晰的解决方案,现在把我的方法完整的说一下,其实是很简单的东西,没有什么很复杂的.因为我用的是Intel的CPU,所以只做了Inte ...

最新文章

  1. nginx配置参数详解
  2. iphone NSArray 数组越界
  3. Windows10记事本和Visual Studio Code文件encoding的设置
  4. NET问答:Select 和 SelectMany 的区别
  5. [蓝桥杯][算法提高VIP]扫雷-枚举
  6. Ubuntu+Win7+Samba实现文件共享
  7. 高德地图怎么搜索marker_百度、高德、腾讯地图坐标认证怎么弄,3分钟轻松自助认证...
  8. iOS in-app purchase详解
  9. js对联广告,顶部浮动广告,固定位置广告插件
  10. springboot接入微信,支付宝支付
  11. 运放电路的反馈电阻上并联一个电容是什么作用
  12. 程序员的爱情最纯洁?
  13. ,英式发音和美式发音有什么区别
  14. 情人节,让我们一睹数学的浪漫
  15. 数据科学导论python语言实现_数据科学导论:Python语言实现(原书第2版)
  16. LabVIEW控制Arduino实现RGB调色灯(基础篇—6)
  17. php里面substr函数,PHP substr()函数
  18. [C#]关于接口Interface的场景假设-代码模拟-引喻类比-知识快照等-B
  19. 2021.07.17【R语言】丨扩增子课程学习——α多样性简介
  20. 区块链的发展及优缺点

热门文章

  1. android7.0 投屏,流水断崖安卓投屏
  2. 目录穿越及文件包含漏洞
  3. jsonobject中getkey_获取JSON中所有的KEY
  4. facebook登录我游戏_Facebook对我的位置了解多少
  5. 利用F12下载网页高清图像
  6. 装Linux gpt还是mbr,装机、装系统必备:秒懂MBR和GPT分区表
  7. excel 隐藏和取消隐藏
  8. 电阻触摸屏 linux 校准软件,android 电阻单点触摸屏校准
  9. fifo的rdata_异步FIFO设计与实现
  10. MATLAB求分段函数最大值,如何用MATLAB求分段函数的最小值和最大值?