日刊OpenLibSys
RDMSR/WRMSR 命令は、存在しない MSR にアクセスすると一般保護違反が発生し、ブルースクリーンが発生してしまいます。その問題を回避するために、Windows 2000 以降では、Kernel Mode Structured Exception Handling を利用して一般保護違反が発生した場合の救済措置を行っております。(あっ、もちろんドライバ内部の話ですよ)
んが、RDMSR/WRMSR を呼び出す度に __try, __except を設定するのって実はオーバーヘッドが大きいのではないか??という気がしてきました。(未確認)実際バイナリファイルのサイズも増えてるから結構いろいろやってるんだろうし。(でも、やっぱり未確認)
どーしよ。高速版と安全版で分けようかなぁ~。私自身が CrystalCPUID で使う時を考えると MSR Walker/Editor 以外では SEH 必要ないんですよね。
SEHにどれくらい時間がかかるか実際に確認してみよう・・・。
RDMSR (index == 0x10, TSC) 1,000,000回実行
(Athlon 64 X2 2GHz) 時間は、QPC で測定
他のアプリも多々動いているので、精度は不明。
KM-SEH on
2.023031秒
2.349374秒
2.059292秒
KM-SEH off
2.387128秒
2.055282秒
2.123491秒
あれ?全然変わりませんね。じゃぁ安全な方だけでいいか(笑)
ちなみに、存在しない MSR にアクセスし、KM-SEH を発動させまくった場合
4.691893秒
4.894610秒
4.960273秒
こんなもんか・・・。
⇒ 現状維持
OpenLibSys.sys = KM-SEH on
OpenLibSysNT4.sys = KM-SEH off というか利用できないので。
OpenLibSysNT4.sys を OpenLibsys.sys にリネームすれば 2000 以降でも KM-SEH なしで RDMSR/WRMSR を実行できます。
RdmsrEx (Process Affinity Mask の設定可能版) + KM-SEH on
3.369919秒
3.220086秒
2.780387秒
3.213224秒
(4回やってしまった・・・)
まぁ、ちょっとオーバーヘッドあるよねってところでしょうか。