windows获取CPU温度

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();
    }

    最后本人写了一个demo来获取硬件温度,https://download.csdn.net/download/dm569263708/87360682

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28001.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

温度传感器调试(HDC1080,TMP275)

我们需要对100C高温的金属进行温度测量。选择的传感器芯片是 HDC1080 和 TMP275。 HDC1080可以同时采集温湿度信息&#xff0c;但他主要是湿度传感器&#xff0c;老板说不用这个。于是最后我选择了单独的温度传感器 TMP275。 整个调试过程太辛苦了&#xff0c;在网上没能找到驱…

chatglm常用参数 :Top-k, Top-p, Temperature

LLM探索&#xff1a;GPT类模型的几个常用参数 Top-k, Top-p, Temperature&#xff1a; 总结&#xff1a; 1.Temperature 用于调整随机从生成模型中抽样的程度&#xff0c;因此每次点击“生成”时&#xff0c;相同的提示可能会产生不同的输出。温度为 0 将始终产生相同的输出。温…

Stable Diffusion攻略集(Stable Diffusion官方文档、kaggle notebook、webui资源帖)

文章目录 第一部分一、 Features&#xff1a;Textual Inversion&#xff08;文本反转&#xff09;1.1 Textual Inversion 简介1.1.1 摘要1.1.2 算法1.1.3 模型效果 1.2 Textual Inversion of webai1.2.1 预训练embedding用于图片生成1.2.2 训练embedding1.2.3 Finding embeddin…

Android开发的中年坎怎么跨?与其坐以待毙的焦虑,不如找准出路提高技能!

35岁程序员的中年危机是个魔咒 35岁&#xff0c;已经真的成了所有职场人都不容易迈过去的一道坎。找工作&#xff0c;大多数公司把年龄限制在35岁以下&#xff0c;35岁左右的人&#xff0c;连面试资格都没有。 各大公司一到大规模裁员&#xff0c;35岁以上的普通员工&#xf…

GPT- 4 标注能力直逼人类,成本大砍90%,数据众包危矣?

人类标注员很可能将面临来自大语言模型的残酷冲击。 人工智能本身并不是很智能&#xff0c;这是一个公开的“秘密”。机器学习系统通常依赖低薪众包工人进行标注和微调&#xff0c;很难脱离“有多少人工&#xff0c;就有多少智能”的魔咒。 即便强大如谷歌、微软这样的大公司…

Docker 更换镜像内部的软件源为国内源(apt-get源)

Docker 更换镜像内部的软件源为国内源&#xff08;apt-get源&#xff09; 1、查看镜像内部的软件源2、查看系统版本3、更换软件源3.1 在镜像内部更换3.2用Dockerfile构建时更换 1、查看镜像内部的软件源 rootb09e8f69dc59:/# cat /etc/apt/sources.list deb http://deb.debian…

国内镜像源详细使用教程!

WARNING: Retrying (Retry(total2, connectNone, readNone, 这些天一直肝金融学&#xff0c;脑子一直放空&#xff0c;看不太下去&#xff0c;于是乎就想股票的k线图&#xff0c;想着怎么下载k线图&#xff0c;然后从下载库开始就出现大问题了&#xff0c;就记录了一下自己这憨…

源、镜像、镜像源,更换镜像源apt-get、pip、conda 全部搞懂

源、镜像、镜像源&#xff0c;更换镜像源apt-get、pip、conda 全部搞懂 1. 源是什么&#xff1f;2. 镜像是什么&#xff1f;3. 镜像源是什么&#xff1f;4. 更换apt镜像源4.1 清华镜像源4.2 阿里镜像源 5. 更换pip源5.1 清华镜像源5.2 其他镜像源 6. 更换conda源6.1 清华镜像源…

【笔记】pip镜像源改为国内源(Windows、Linux、Mac)

pip镜像源修改 &#x1f3f7;简介&#x1f3f7;修改pip镜像源&#xff08;Windows&#xff09;&#x1f3f7;修改pip镜像源&#xff08;Linux&#xff09;&#x1f3f7;修改pip镜像源&#xff08;Mac&#xff09;&#x1f3f7;结语 &#x1f3f7;简介 当我们在使用Python的pip…

ubuntu更改镜像源(软件源)

更新Ubuntu软件下载地址 1. 寻找国内镜像源 所谓的镜像源&#xff1a;可以理解为提供下载软件的地方&#xff0c;比如Android手机上可以下载软件的91手机助手&#xff1b;iOS手机上可以下载软件的AppStore 2. 备份Ubuntu默认的源地址 sudo cp /etc/apt/sources.list /etc/apt/…

使用Amazon SageMaker构建高质量AI作画模型Stable Diffusion

使用Amazon SageMaker构建高质量AI作画模型Stable Diffusion 0. 前言1. Amazon SageMaker 与机器学习1.1 机器学习流程1.2 Amazon SageMaker 简介1.3 Amazon SageMaker 优势 2. AIGC 与 Stable Diffusion2.1 步入 AIGC 时代2.2 Stable Diffusion 介绍 3. 使用 Amazon SageMaker…

上海首个大模型产业发展研讨会圆满落幕,众顶尖专家共探大模型产业

4月21日&#xff0c;由上海市数据科学重点实验室携手达观数据、上海浦东软件园联合举办的“大模型产业发展研讨会”圆满落幕。本次研讨会是继达观数据在北京、成都顺利举办“ChatGPT及大模型专题研讨会”后的又一场科技盛会&#xff0c;当天大会汇聚了大模型产业国际和国内顶尖…

李永乐六套卷-2021

可以猜&#xff0c;应该是2-a&#xff0c;a-2和1比较 AB显然正确 看哪个可以对角化&#xff0c;且特征值为2,2,-1 注意乘2x,所以我们关注x^3 要加C

李永乐线性代数手写笔记-向量

李永乐线性代数基础知识&#xff0c;整理放在博客上面&#xff0c;方便自己复习查看。 概览请移步李永乐线性代数2020年基础课手写笔记汇总 文章目录 一 基本概念和运算二 线性表示三 相关和无关四 向量组和矩阵的秩 一 基本概念和运算 二 线性表示 三 相关和无关 四 向量组和…

B站李永乐讲解傅里叶变换--笔记

笔记目录 引言一、变换&#xff08;一&#xff09;举例&#xff08;图像<---->坐标&#xff09;&#xff08;二&#xff09;标准正交基 二、傅里叶变换&#xff08;一&#xff09;傅里叶级数&#xff08;二&#xff09;连续傅里叶变换&#xff08;三&#xff09;应用 三、…

李永乐660高等数学极限题目技巧

本文内容为李永乐660极限题目技巧&#xff0c;源文件已经上传到我的资源中,有需要的可以去看看, 我主页中的思维导图中内容大多从我的笔记中整理而来,相应技巧可在笔记中查找原题, 有兴趣的可以去 我的主页 了解更多计算机学科的精品思维导图整理 本文可以转载&#xff0c;但…

李永乐说股票

1.每股净资产 净资产/股本数 2.市值 每股价格 x 股本数 3.市净率 市值/净资产 每股价格/每股净资产 市净率越高表示市场对股票认可越高&#xff0c;越高估 越低说明股票越低估 买入会赚得多 市净率低&#xff0c;相对安全,越值钱 市盈率 1.每股利润净利润/股本数 2.…

线性代数 李永乐强化班

一、理解线代物理意义 数字强调大小&#xff0c;线代强调方向 别的向量是基向量缩放得到的 向量不平行就线性无关吗 无关的向量可以张成一个子空间&#xff0c;即表示某一维度里面的任意一个向量 A特征向量特征值E*特征向量 标准基向量表示的特征向量换一种基向量任然是 相同的…

李永乐老师卷积神经网络

https://www.youtube.com/watch?vAFlIM0jSI9I 卷积过程 卷积核表示图像特征&#xff0c;比如一个右下的线条。 卷积核在图像上移动&#xff0c;做运算&#xff0c;就会得图像的特征图&#xff08;粉色的。有右下线条的地方数字会特别大。 卷积核的维度和数目 也有竖着的卷…