用C C 獲取CPU溫度總結(一)

2021-06-28 18:36:09 字數 1473 閱讀 3684

最近在研究怎樣獲取cpu的溫度,網上也有一些辦法,但都不算完整,沒有清晰的解決方案,現在把我的方法完整的說一下,其實是很簡單的東西,沒有什麼很複雜的。因為我用的是intel的cpu,所以只做了intel的,apu的沒辦法測試,感興趣的可以研究。

通過dts獲取溫度並不是直接得到cpu的實際溫度,而是兩個溫度的差。第乙個叫做tjmax,這個intel叫tcc activation temperature,意思是當cpu溫度達到或超過這個值時,就會觸發相關的溫度控制電路,系統此時會採取必要的動作來降低cpu的溫度,或者直接重啟或關機。所以cpu的溫度永遠不會超過這個值。這個值一般是100℃或85℃(也有其他值),對於具體的處理器來說就是乙個固定的值。第二個就是dts獲取的cpu溫度相對tjmax的偏移值,暫且叫toffset,那cpu的實際溫度就是:currenttemp=tjmax - toffset。

這兩個溫度值都是通過msr來獲得,獲得msr暫存器中的值用彙編指令rdmsr,tjmax值相關的msr的signature是1a2h,執行

mov ecx, 0x1a2

rdmsr

後,eax中16~23位就是tjmax的值。

同理,toffset值相關的msr的signature是19ch,執行

mov ecx, 0x19c

rdmsr

後,eax中16~22(注意這裡是7位)位就是toffset的值。

問題在於,rdmsr指令需要ring0許可權,而windows下應用程式的許可權都是ring3,所以如果在c中直接build-in彙編執行,程式立即停止工作。

在網上搜尋了怎樣獲取cpu的ring0許可權,可惜沒有找到相關的**。這時我參考了open hardware monitor這個軟體,open hardware monitor是用c sharp寫的,可以檢測各個硬體的溫度和頻率等,可惜我不懂c#**。但在裡面找到了winring0.sys,winring0也是開源的,看到它的實現之後大吃一驚,裡面直接提供rdmsr指令的c函式,已經幫你繞過了windows的重重城牆。

所以直接呼叫rdmsr()函式就可以了,沒有其它。當然要具體了解winring0是怎樣獲得ring0許可權的,可以直接看它的**。

在執行msr讀取時,要先用cpuid判斷處理器是否支援dts,最近的處理器都是支援的。具體是cpuid.06h:eax[bit0]是否被置位。置1時就是可以的。

另外,我的是處理器是4核,每個物理核心都應該對應乙個溫度,可我只獲得了乙個。跟open hardware monitor對比之後,這個值總是4個核心中最小的那個,怎樣獲得4個核心加乙個package的溫度,還需要再研究。無聊還跟魯大娘對比了一下,大娘不太靠譜,在我的處理器上低了大概10度。cpu負載突然變大時,溫度會瞬間提高,大娘基本沒反應。

網上還有另處一種方法我覺得是可行的,是讀pmu值,埠號是68h和6ch,同樣是繞過windows來獲得ring0許可權,用的是wini/o,不過我沒有試。

以上的方法適用與windows。 linux下不需要所謂ring0,因為在linux下我們有root,我們怕誰。

讀取cpu溫度的api 獲取CPU的溫度的方法

獲取 cpu的溫度的方法 在記憶體配置較低的計算機中 比如記憶體 32mb windows 98第二版 cpu的占有率是較高的,一般能夠達到 50 這可能是由於系統 需要cpu 進行許多的運算模擬來彌補資源的不足。下面是收集獲取 cpu溫度的方法,歡迎閱讀。作為乙個系統級程式設計師或者程式設計愛好者...

vs2013 獲取cpu溫度

環境 window7 64位 cpu intel i3 4170 i3 4170是雙核四執行緒。我暫時沒有找出區分執行緒數跟核心數的區別。這個問題以後再去解決吧 需要用到的檔案如下 winring0.dll winring0.sys winring0x64.dll winring0x64.sys w...

linux獲取cpu溫度控制風扇頻率

思路 底層驅動端建立執行緒不通過上層控制獲取cpu溫度模擬pwm控制風扇頻率 主要函式 kthread run 執行緒建立函式 filp open 底層用於開啟檔案 get fs 取得當前的位址訪問限制值 set fs 設定當前的位址訪問限制值,其巨集值有兩個kernel ds設定為核心空間,use...