关于获取CPU温度的优快云帖子
(2008-02-19 13:27:28)
1:各位高手,回句话啊!!cpu的温度放在那里了!!有谁知道!! bios里面那个对么??可以通过读bios来得到cpu的温度么??
2:我对这个了解的不多。但是,我看过一些主板带的温度监视软件,应该是和主板的BIOS中的温度显示是联系的。希望楼主能够找一找关于读取BIOS方面的代码,或文档来研究一下。
3:但是那位高手能告诉我,bios显示的cpu温度是通过什么途径得到的!!我知道是读取cpu温度传感器的值!但是这个读取的值是否是存在bios的某个地址里面,或者是只是简单的读取与显示!!另外谁能告诉我那里还能得到cpu的温的值!!
4:学习ing
5:我也想知道,关注.........
6:有种方法大家看行不行,好像bios内容已经映射到了物理内存的0x00000000-0x00f00000范围内,我想读这部分的物理内存,但是现在又两个问题 1)不知道这样是否能读到我所需的温度值 2)不知道温度所映射到的物理地址
7:^_^,除非window或者厂商提供了这个API,否则的话,没辙!!读取物理内存,怎么可能呢?
8:呵呵,有点难度.很早以前就有人问过这个问题. 找主板提供的DLL接口看行不行.
9:这个应该可以通过ACPI或者WMI来获取,但是我的代码没有通过测试,不知道是不是因为我用的是笔记本的缘故。 uses ComObj, ActiveX; procedure TForm1.Button1Click(Sender: TObject); var Locator: OleVariant; WMI: OleVariant; RET: OleVariant; Enum: IEnumVariant; Tmp: OleVariant; Value: Cardinal; begin Locator := CreateOleObject('WbemScripting.SWbemLocator'); WMI := Locator.ConnectServer('.', '', '', ''); Ret := WMI.ExecQuery('SELECT * FROM MSAcpi_ThermalZoneTemperature'); Enum:= IUnknown(RET._NewEnum) as IEnumVariant; while (Enum.Next(1, Tmp, Value) = S_OK) do begin if not varisNull(Tmp.CurrentTemperature) then Memo1.Lines.Add(Format('%6.2f', [(Tmp.CurrentTemperature - 2732) / 10])); end; end;
10:谢谢tseug的提示,请问你有没有关于ACPI和WMI的资料,希望你能共享一下,谢谢!!我的e-mail:h6003113@yeah.net 谢谢了!!
11:学习
12:应该是与主板的硬件对应吧,因为我装过很多电脑,测温芯片不同,自带的显示程序不通用,想必BIOS里面对应的程序也是不同的。很多硬盘也有测温,这个应该有通用的吧
13:haha,嚴重學習中
14:学习,强烈认为应该有API函数可以调用
15:好象以前的帖子提过,读注册表的数据。并且说,不少监视CPU温度的软件也用这个方法。偶觉得这类东东都比较占CPU资源,所以不怎么用,也没怎么去关心。
16:还能编程控制CPU的温度?!厉害呀!学习!
17:现在我在使用WMI读取cpu温度传感器的温度,通过WMI我读到了bios的生产厂家,但是不知道为什么,当读到Win32_CurrentProbe是就没用了。请那位大虾指点一下!!
18:怎么没人回答啊!!
19:采用WMI和SMBIOS来读取CPU温度传感器的方式是不可行的。事实上WMI本质上微软依然走的是通过SMBIOS/DMI方式来获取生成WMI数据的,虽然BIOS规范的“Type 28”是温度传感器,并且还注明了偏移量为06H为温度最大值等...与Type 27的冷却设备区域类似,不过在最后14H偏移的温度值我发现是名义上的(即:不过是规范定义者的一厢情愿罢了),我曾经写过几个程序来获取几种主板(BIOS从2.0-2.31版)的各类别各偏移量的值,发现该值是无效的,同时也发现所谓Type 27中的风扇转速等,也无效,即便对于IBM的原装机也是如此。在此过程中,也发现凡有效部分往往与WMI获取的值一样。因此,也印证了从WMI获取诸如温度等参数的不可行,除非微软修改WMI信息的获取方式,否则,我看...呵呵...还不如我们另外想办法了。顺便说一下,我个人认为微软之所以采用上述方式获取温度传感器的信息,是因为WMI规范发布的时候,微软也认为主板生产商都会把温度的获取和刷新写到驱动里面---也就是刷新Type 28区域的信息,不过,遗憾的是,硬件生产商没有这样做。另外,我认为目前的温度检测软件几乎都是通过SMBUS来入手设计的,若你实在要详细了解这些与硬件紧密的软件开发步骤,不妨留下你Email,我在下次来看到后会与你联系。另外,无汇编经验,只用过Delphi等OO工具就不要留Email了。
20:首先谢谢LAMB 如果LAMB兄有时间还是可以发些相关的资料给小弟研究研究。小弟是搞自动化的,用过汇编,相信看相关的程序不会有很大的问题。最后留下我的E-Mail:h6003113@yeah.net 21:把厂商自带的温度监视软件中包含的DLL拿出来分析,有些接口直接能读到CPU温度,你用你的程序直接引用这些DLL应该能行吧。谁能接着这个讨论下去,我也能获得bios信息了,可惜不知道温度的偏移。
21:用winio读取的端口数据总是-1,希望高手指教
不同品牌的BIOS有不同的温控I/O调用, 具体得看BIOS程序调用手册.
22:cpu 温度,系统 温度,风扇转速,所有的系统电压,你要得到,首先你的主板线路做了对他的侦测,如果做了以上的所有值全存在一个叫着 superio 的device的isa space里面superio 一般常用的品牌有 winbound fintek ....等等,不同的型号的superio他们里面的INDEX是不一样的,这个你得要有对应的superio 的datasheet
没有通吃的方法,除非bios透过acpi告诉你,以上方法是透过 io access的方法
具体操作,任何一个bios工程师都知道,向他们请教吧
23:我最近一直在网上查关于获取CPU温度的资料,花了很多时间,可是没有结果。
DWORD temp_dwPortVal=0;
InitializeWinIo();
SetPortVal(0x6C,0x80,1);//将命令写入命令端口0x6C
SetPortVal(0x68,0x0E7,1);//将要访问的寄存器号写入数据端口0x68
GetPortVal(0x68,&temp_dwPortVal, 1);//将数据从数据端口读出
ShutdownWinIo();
代码只能写到这一层,得到的结果是-1,很多人结果和我一样。
原因可能是没有判断缓冲0x6c,可是就是不知道应该怎么判断,
24:觉得这个会和 硬件比较相关吧!
不同的平台,采用不同的components,操作的方法也会不太一样吧!
移动些列的电脑一般都会用EC的,这些动作可以让EC去做,我们可能可以发个command要EC reports我们想要的东西(一般通过 0x62和0x66 port),当然这个就需要看你和EC定义如何通信,没标准的!当然也不排除你直接操作EC,这种方法我没试验过,不知道说的对不对!
还有一个方法就是通过WMI-ACPI,EC的memory可以有一段是对Windows可见的,记得当初我们规定的是EC把类似这样的信息放到这个内存中(EC的内存),然后我们通过WMI-ACPI的方式去读。不过需要我们自己写ASL code然后includes到BIOS中。
台式机器一般会用supper I/O,常用的用ITE,Winbond!你若是想直接access to supper I/O, 恐怕你要读相关的datasheet了。一般是通过 0x2e/0x2f or 0x4e/0x4f端口!类似这样的tools我没有做过,以前是我的另外一个同事在负责玩,不仅仅是有HW monitor的功能,还有超频等功能!俺不是这方面的专家,欢迎大家指教了!