zoukankan      html  css  js  c++  java
  • 获取cpu温度

    要获取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的温度。

    其中在上层读取这些寄存器的主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    BOOL WINAPI Rdmsr(DWORD index, PDWORD eax, PDWORD edx)
    {
        if(gHandle == INVALID_HANDLE_VALUE)
        {
            return FALSE;
        }
        if(eax == NULL || edx == NULL || gIsMsr == FALSE)
        {
            return FALSE;
        }
        DWORD   returnedLength = 0;
        BOOL    result = FALSE;
        BYTE    outBuf[8] = {0};
        result = DeviceIoControl(
            gHandle,
            IOCTL_OLS_READ_MSR,
            &index,
            sizeof(index),
            &outBuf,
            sizeof(outBuf),
            &returnedLength,
            NULL
            );
        if(result)
        {
            memcpy(eax, outBuf, 4);
            memcpy(edx, outBuf + 4, 4);
        }
        if(result)
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }


    如果是多核cpu可以通过 SetThreadAffinityMask函数切换cpu来获取每个核的温度代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    void   CCPUTemperatureDlg :: OnTimer ( UINT_PTR   nIDEvent )
    {
        
    CEdit   * edit =( CEdit *) GetDlgItem ( IDC_EDIT1 );
        
    CEdit   * edit1 =( CEdit *) GetDlgItem ( IDC_EDIT2 );
        
    DWORD   eax = 0 , edx = 0 ;
        
    ULONG   result ;
        
    char   s [ 20 ];
        
    result = SetThreadAffinityMask ( GetCurrentThread (), 1 );
        
    Rdmsr ( 0x19c ,& eax ,& edx ); //read Temperature
         SetThreadAffinityMask ( GetCurrentThread (), result );
        
    sprintf ( s , "%d" , 100 -(( eax & 0x007f0000 )>> 16 ));
        
    edit -> SetWindowText ( s );
        
    result = SetThreadAffinityMask ( GetCurrentThread (), 2 );
        
    Rdmsr ( 0x19c ,& eax ,& edx ); //read Temperature
         SetThreadAffinityMask ( GetCurrentThread (), result );
        
    sprintf ( s , "%d" , 100 -(( eax & 0x007f0000 )>> 16 ));
        
    edit1 -> SetWindowText ( s );
        
    CDialog :: OnTimer ( nIDEvent );
    }

    下面是读取结果图:


    程序的下载地址 http://download.csdn.net/detail/xiaibiancheng/5491513

  • 相关阅读:
    ReactiveCocoa -函数式编程和响应式编程
    关于即时通讯功能开发技术选型
    cordova 打包的项目里加入微信支付功能编译问题。
    OC和swift互相调用。
    有关 -all_load和-ObjC
    在一个项目中同时使用Swift和Objective-C代码混合编程的方法
    iOS开发中Static和Const关键字的的作用
    开发所有插件必须要这个插件
    phonegap 二维码扫描插件使用
    大数据基础---Kafka深入理解分区副本机制
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3111351.html
Copyright © 2011-2022 走看看