rdmsr获取Intel CPU温度

最近调试intel 的x86 CPU单板,获取CPU温度遇到一些问题,在此记录下。

问题描述

原方案

原方案从 /sys/class/hwmon/下读取CPU温度,该目录下有hwmon0、hwmon1、hwmon2三个文件,其中hwmon2目录下有记录CPU温度的文件temp_input,从该文件能直接读取CPU温度。
但是后来发现temp_input文件有时在hwmon1下,有时在hwmon2下,不同环境位置不一样,无法统一。也不想再用直接读文件获取温度的方法,查看CPU手册找到了读寄存器获取温度的方法,该方案比较稳定。😆

rdmsr方案

intel cpu有以下两个寄存器可供实现读CPU温度。寄存器说明见文末。
0x1A2: 寄存器的bit23-16记录了TCC_ACTIVATION_TEMP值,改值可理解为CPU触发调温手段的阈值,该阈值出厂时设置;
0x19C: 寄存器的bit22-16记录了 TEMPERATURE—值,这个值是CPU温度相对于TCC_ACTIVATION_TEMP的温度值;

所以:
CPU温度 = TCC_ACTIVATION_TEMP - TEMPERATURE。

实现:

#define TEMP_TARGET_MSR_REG (0x1a2)
#define TEMP_STATUS_MSR_REG (0x19c)
static int get_cpu_msr_temp_info(void)
{
    int ucTempOffset;
    int ucTempActivation;
    int dwValh=0,dwVall=0;

    rdmsr(TEMP_TARGET_MSR_REG, dwVall, dwValh);
    /*bit23-16*/
    dwVall &= 0x00FF0000;
    ucTempActivation = (dwVall>>16)&0xff;

    dwVall=0;
    dwValh=0;
    rdmsr(TEMP_STATUS_MSR_REG, dwVall, dwValh);
    /*bit22-16*/
    dwVall &= 0x007F0000;
    ucTempOffset = (dwVall>>16)&0xff;

    return (ucTempActivation-ucTempOffset);
}

接口直接返回CPU实际温度。☺️
请添加图片描述请添加图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值