***本記事にはプロモーションが含まれています。***
Linuxホストのタイマーのパッチを作りました。いろいろ試行錯誤したのですが、結局いつも/dev/rtcを使うようにトライしてみるようにするだけでした。
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060407-linux-timer.patch
時計を正確にするには、2つのことをしてください。
(1) まず、ホストOSで、rootでmax-user-freqを1024に設定します。
[Linux host]#echo 1024 >/proc/sys/dev/rtc/max-user-freq
ホストOSを起動するごとに設定する必要があります。/etc/rc.d/rc.localに書いておくといいと思います。
(2) パッチをあてて、バイナリを作ります。patch -p0オプションで当てられます。
必須なのは、max-user-freqを設定することです。最近のカーネルならば、パッチは必要ないと思います。kernel-2.6.11-1.1369_FC4ホストではパッチが必要でしたが、kernel-2.6.15-1.1831_FC4ホストではその必要がありませんでした。
max-user-freqを設定しないと、Windows 2000でIEを立ち上げたとき、時計が速くなったり遅くなったりします。
タイマーは、RTC(Real Time Clock)が使えると1msのタイマーが使えます。Linux 2.6ゲストの時計が正確になります。そうでないと、setitimer/getitimerで設定していますが、これがLinuxゲストで時計が1/2に遅くなった原因でした。最近のカーネルでは、時計は1/4に遅くなると思います。
テストした環境は、次のとおりです。
Windows 2000 guest /FC4 kernel-2.6.11-1.1369_FC4 host
FC4-i386-rescuecd.iso guest/FC4 kernel-2.6.11-1.1369_FC4 host
Windows 2000 guest/FC4 kernel-2.6.15-1.1831_FC4 host
FC4-i386-rescuecd.iso guest/FC4 kernel-2.6.15-1.1831_FC4 host
Linux 2.4のホストではテストしていません。
x86_64のホストでは、Windows 2000ゲストの時計がとても不安定です。1ms間隔の割り込みは起こっているのですが、時計がうまく動きません。遅れることはないみたいだけど。