一 MSR寄存器介绍
MSR寄存器简介MSR(Model Specific Register)是一类x86CPU提供的特殊寄存器,可以用来存储各种模型特定的数据,如配置、状态等信息。
温度相关MSR寄存器在Intel CPU中,和温度检测相关的MSR寄存器主要有:
IA32_THERM_STATUS (0x19C) : 包含温度数据
IA32_TEMPERATURE_TARGET (0x1a2) : 温度目标值
读取MSR寄存器需要使用rdmsr/wrmsr汇编指令来读取/写入MSR寄存器。例如:
mov ecx, 0x19C ; 温度状态MSR
rdmsr ; 读取温度寄存器值
mov ecx, 0x1a2 ; 温度目标MSR
wrmsr ; 写入温度目标
温度转换公式从0x19C寄存器读取的温度数据需要按公式转换:
Temp = ((MSR值 >> 16) & 0xFF) - 100即温度 = 第16-23位的值 - 100
问题及注意事项
需要Ring 0特权级才能访问MSR寄存器
不同CPU型号MSR寄存器可能不同,需要区分
读取MSR需要使用rdmsr指令,写入使用wrmsr指令
二 Dos系统下读取msr温度的示例代码:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<dos.h>
#include<math.h>
//#define DEBUG
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;
//----------------------------------------------------------
//Get temperature
//----------------------------------------------------------
WORD getTemp()
{
WORD i;
__asm{
mov ecx,0x19c
rdmsr
mov i,eax
}
return i;
}
void main(){
WORD TEM;
TEM = (getTemp()>>16)&0xff;
TEM = 0x64-TEM;
printf("\nCPU Temperature:%d C\n\n",TEM);
}
运行结果图:
如图,显示CPU温度为35°