Intel® 64 and IA-32 Architectures Software Developer’s Manual によると、今使用中の ASUS P5LD2-V + Pentium 4 D では、MSR から CPU の温度が取れないことが判明した。
で、http://kariunten.homeip.net/programming/winring0.html
にマザーボードのI/Oコントローラからデータを取得する方法が載っていたので、OpenLibSys で試してみた。
ASUS P5LD2-Vのマニュアルを調べてみると、コントローラは W83627EHF だったので、そのマニュアル
http://www.winbond-usa.com/products/winbond_products/pdfs/PCIC/W83627EHF_W83627EHG.pdf
を調べてみた。それによると、このチップには温度センサーが3つ搭載されている。ただし、マザーボード上で使用されているのは、CPUTIN Temperature、SYSTIN Temperature の2つのみで、AUXTIN Temperatureは使用されていない模様。
このコントローラーからデータを取得するには、IO ポートからデータを取得すればよい。
取得する方法は、0x295 ポートにレジスタを指定、0x296 ポートからデータを取得するという手順。
ただし、バンクが 0, 1, 2, 3, 4 とあり、0x50 以上のレジスターにアクセスするには、バンクを切り替える必要がある。バンクの切り替え方法は、0x4E ポートの下位3ビットで指定する。
CPUTIN (CPUの温度)は、
バンク1、0x50 レジスタにハイビット(温度 ℃)
バンク1、0x51 レジスタにロービット(温度 7ビット目が立っていれば +0.5℃)
となっているので、次のようなコードになる。
//=======================================
// CPUTIN Temperature
//=======================================
// バンク1
ols.WriteIoPortByte(0x295, 0x4E);
ols.WriteIoPortByte(0x296, 0x81);
// データ読出し(50h Bank1)
ols.WriteIoPortByte(0x295, 0x50);
hi = ols.ReadIoPortByte(0x296);
// バンク1
ols.WriteIoPortByte(0x295, 0x4E);
ols.WriteIoPortByte(0x296, 0x81);
// データ読出し(10h Bank1)
ols.WriteIoPortByte(0x295, 0x51);
lo = ols.ReadIoPortByte(0x296);
Console.WriteLine("CPUTIN Temperature Low : …." + lo.ToString("X") + "\r\n");
Console.WriteLine("CPUTIN Temperature High: …." + hi.ToString("X") + "\r\n");
float CPUTIN = hi + ((lo & 0x80) != 0 ? 0.5f : 0);
Console.WriteLine("CPUTIN Temperature: …." + CPUTIN.ToString() + "\r\n");
同様に、SYSTIN (マザーボードの温度)は、バンク0、0x27 レジスタなので、
//=======================================
// SYSTIN Temperature
//=======================================
// バンク0 を指定
ols.WriteIoPortByte(0x295, 0x4E);
ols.WriteIoPortByte(0x296, 0x81);
// データ読出し(27h Bank0)
ols.WriteIoPortByte(0x295, 0x27);
hi = ols.ReadIoPortByte(0x296);
Console.WriteLine ("SYSTIN Temperature: …." + hi.ToString() + "\r\n");
なお、SYSTINでは、0.5℃単位の測定はできない仕様になっている。
結果は次の通り。
[CPUTIN Temperature]
CPUTIN Temperature Low : ….80
CPUTIN Temperature High: ….21
CPUTIN Temperature: ….33.5
[SYSTIN Temperature]
SYSTIN Temperature: ….24
下は、ASUS のおまけアプリの Probe II のデータ
おおおおっ、ちゃんと取れるじゃないですか。OpenLibSys 偉大だ。
というか、Core2にアップしてしまえば、MSRで取れるので、こんなことしないですむんだけどなぁ・・・
というか、こんなハード固有の実装させないように頑張ってよ >> MS
というか、温度を気にしないといけないような CPU 勘弁してよ >> Intel, AMD
0x295, 0x296というアドレスはLM78の頃から変わっていないようなので、ほぼデファクトスタンダードなアドレスになっているようですね。まぁCPUの温度を気にしなければならないって言うのは確かにあれですね。
http://www.init-main.com/acpirensai/acpi7.txtこんな記事も見つけました。
情報ありがとうございます。そうなんですか~、全然そのあたり知らなかったので、英文マニュアル読み解くのに苦労しました wこんなことしないで、Core2 買いに行ったほうが早そうですね。