SpeedStepとPowerNow!

Pocket

Linuxホストで、時計が正確にならないことがあるそう。どうやら、Mobile Pentium ⅢがTSC(Time Stamp Counter)を動的に変更しているみたいです。よくわからないけど、SpeedStepはソフトウェアの助けがなくても動くんですかね。
これには、ticks_per_secという変数が関係しています。ticks_per_secは、プログラムの起動時にCPUのTSCを読んで、一秒あたりのカウント数として算出しています。でも、途中で変わってしまうと時計の進み方がおかしくなってしまいます。
最近のPentium 4は、CPUのクロックにかかわらずTSCのカウント数が上昇するようになっているそうです。ますますわけわかんなくなってきているような気がする。CPUのモデルによって動作が違うのは対応するソフトウェアとしては悪夢ですね。
ticks_per_secをLinuxホストの/proc/cpuinfoから算出するパッチが出ていたので、改造して動くようにしてみました。Athlon 64 3000+で、cpuspeedサービス(PowerNow!)が動いている状態でも、Window 2000ゲストの時計がちゃんと動くことは確認しました。
Linuxゲストのときは、ゲストの起動時にclock=pitというオプションをつけないといけないです。TSCは変化しますので。
SpeedStepが有効なときでも、ちゃんと動くといいですけど。
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060517-tps_from_proc.patch
CPUの状態の変化をキャッチして、ticks_per_secを較正できるといいなと思います。
とか思っていたら、常にTSCを測定したほうがいいといわれた。較正するには、それなりに時間がかかるんだけど。
SpeedStepがOSに因らないということは、WindowsホストでもQueryPerformanceCounterがTSCを使っていた場合は同じ問題が起こりうるということかな。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください