本篇文章个人在北京喝咖啡的时候突然想到的...今天就有想写几篇关于温度读取的文章,所以回家到之后就奋笔疾书的写出来发表了
要获得cpu的温度可以通过汇编指令来读取,这里以intel cpu为例,用rdmsr指令读取 IA32_THERM_STATUS_MSR(0x019C)的值,然后用TjunctionMax 减去这个值就是当前cpu的温度,对于一般的intel cpu 的TjunctionMax值是牢固的,比如我的cpu是Intel Core 2 (45nm),在官网上可以查到其值是100摄氏度,到前面的intel cpu专门有个寄存器IA32_TEMPERATURE_TARGET(0x01A2)保存TjunctionMax的值,可以通过rdmsr指令读取。但是rdmsr指令只能在Ring0层运行,在应用层是执行不了的,必须通过驱动的方式才能执行,在驱动层专门有个函数__readmsr担任读取相似IA32_THERM_STATUS_MSR(0x019C)和
IA32_TEMPERATURE_TARGET特殊寄存器的值,所以只要在驱动层写好调用程序后在下层用DeviceIoControl函数就可读取这些特殊寄存器的值,信号别人已写好了现有的驱动(驱动名 WinRing0.sys),你只要在你的程序里面加载这个驱动然后就可读取这些寄存器的值,获得intel cpu的温度。