ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

Athlon64 CnQ

Cool'n'Quiet について調べてたのでメモ。

Cool'n'Quiet の仕組み

そもそも Cool'n'Quiet は、システム内の特殊なレジスタにクロック倍率や電圧の値を持ってて
それに応じて CPU が動的に実際の電圧などを変化させて動作する。


ここまでがハードウェアでの実装。


で、AMD 純正ドライバを入れると、現在の負荷状況に応じてそのレジスタの値を操作することで
間接的に電圧やクロック倍率を操作することができる。


こっちがソフトウェアでの実装。
つまり、レジスタの値を書き換えてるだけで CnQ を使うことが可能。

システムレジスタについて


そもそも i386 系の CPU には、MSR ( Model Specific Register ) という特殊なレジスタがあり、
特権命令 ( カーネルモードでのみ実行可能 ) である rdmsr, wrmsr 命令で読み書きできる。


で、CnQ に対応した CPU では
MSR の 0xc0010042 番地(?)に CnQ の状態があり、
0xc0010041 番地に書き込むことで設定ができる。


0xc0010042 番地の方は 64bit 整数値になっており、
16進数にしたときに xxxxxxVV xxxxxxFF の VV の部分に電圧、FF の部分にクロック倍率が含まれる。


K8 シリーズでは、FF x 0.5 + 4.0 がクロック倍率になり、1550 - VV x 25 が電圧(mV)になる。


0xc0010041 番地の方は実験してないので不明。


遊ぶなら CrystalCPUID に MSR Walker と MSR Editor がある。

アクセス方法


rdmsr, wrmsr は特権命令 ( ring0 ) であるため、
正攻法ならデバイスドライバを書いてアクセスすることになる。


しかし、Windows XP にはセキュリティホール ( 仕様 ) があり、
ntdll.dll に含まれる ZwSystemDebugControl API を使って MSR を読み書きできるらしい。
ただし、DEBUG 権限が必要となる。あと Windows 2000 SP4 で試したら動かなかった。


ちなみに MS 社の主張としては
「ZwSystemDebugControl が叩けるということは既に DEBUG権限を奪取されてるいのでセキュリティホールではない。」
だそうですw