Windows XPと-kernel-kqemu

Windows XP SP1aは、-kernel-kqemuオプションつきでは動かないみたいです。ユーザーモードのkqemuだったら動くのですが。kqemu無しでは動かないのも相変わらずです。
Win2kでも、ツールバーの時計をクリックするとフリーズするのは、いつの間にか直っていますね。時間計測の方法が結構変わったからだと思うけれど。時間も正確に刻んでいるようです。

Win32のselect

Windowsホストだと、VLANが遅いということで、selectを使わずに、イベントとWSAEventSelectを使う改造をやってみています。
実装して、QEMU同士で通信させてみると、TCPで3倍から5倍、UDPでは10倍くらいスピードが速くなりました。なんか、すごいと思った。
Winsock FAQにも書いてありますけど、Windowsでselectを使うのはやめましょう。イベントを使った方が、はるかに効率がいいということですね。Windowsのネットワークスタックは、BSDのものを流用しているはずなんですけど、どうしてこんなことが起こるんですかね。
でも、VLANを使っている人がいるのかどうかわからないのですけど。
パッチとバイナリは、ホームページのほうを更新しておきました。

non-blocking socketには、WSA_FLAG_OVERLAPPEDが必要

なのだそうです。MSのKBに書いてあった。
そうでないと、WSAConnectがWSAEINVALを返すそうな…。道理でつながらないわけだ。ノンブロッキング動作には、socket()関数ではなくて、WSASocket()関数でソケットを作らないといけないということですね。
実際にconnectで調べてみると、最初はWSAEWOULDBLOCKが返って、次はWSAEINVALになる。やっぱりconnectを2回呼び出してはいけないみたい。あまり関係ないのかなあ。
これは、Winsock FAQに書いてあってもいい情報だと思うけど。
overlapped structure やcompletion functionをNULLにしておけば、ブロッキングと同じ動作にすることができるのだそうです。でも、CreateFileのところには、Overlapped動作のときはNULLにしてはいけないと書いてあったと思う。なんか複雑。
http://support.microsoft.com/kb/179942/EN-US/
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q181611

OS自作入門29日目&30日目

アプリケーションのお話でした。ごにょごにょしておきました。
やっと、読み終えることができました。
ウィンドウシステムのところから少しついていけなくて、思った以上に時間がかかってしまいました。途中何度も中断があったのですが、とりあえず最後まで読み通せてよかった。読み通してみて、少しはプログラムを作る力がついたならいいのですけど。どうでしょう。
取り上げられていないOSの話題としては、ページングを使ったメモリ管理、プロセス管理、ファイルシステム、ネットワークなど、いろいろありますよね。64ビットに関するものには興味があるので、いずれそれに関するプログラムができたらいいのですけど。
中級者向けの、もう少し違った書き方をした本が読みたいなと思います。

OS自作入門25日目&26日目

コンソールとウィンドウの話でした。ちょっと時間が空いてしまい、だんだん忘れかけているという…。
OSみたいな大きなプログラムを作ろうと思ったら、ある程度記憶力が無いとだめなような気がしてきた。記憶しておくといっても普通の人には限度がありますよね。忘れないことより、思い出しやすいということを心がけるしかないのかもしれませんね。よく理解したコーディングを積み重なることしかないのかな。

OS自作入門23日目&24日目

グラフィックとウィンドウの話だった。
正直言ってよくわからなかった。ウィンドウを作るうえで、基礎的なことは何でしょう。必要なことは何でしょう。注意することはどういうことなのでしょう。
ウィンドウシステムは、ハードウェアを扱うものとは違ってソフトウェアの自由度が大きいのでしょうけど、基本になることって何でしょうか。

QCOW/QCOW2用のバイナリとパッチ

いろいろ調べていたら、パッチを使わなくてもQCOW/QCOW2が動くことがわかった。気づかないうちにバグが修正されていたみたい。結構一生懸命バグをつぶしてみたんだけどがっくり。でも、勉強になったからいいか。小さな不具合がいろいろあるので、そのパッチを作りました。
バイナリも用意しましたので、興味があれば使ってみてください。
http://www.h6.dion.ne.jp/~kazuw/qemu-win/qemu-20060906-qcow.zip
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060906-qcow.patch

VM snapshots

WindowsホストでもQCOW2フォーマットが使えるようになって、VMスナップショットという機能を使うことができます。
loadvm/savevmとQCOW2フォーマットのハードディスクイメージを組み合わせることで、多段階のスナップショットを保存したり、復元したりできるようになります。
これにともなって、QCOW2以外を使用したときのloadvm/savevmの使用は出来なくなりました。
DOS> qemu-img convert -f raw redhat.img -O qcow2 test.qcow2
というように、QCOW2フォーマットのディスクを用意します。
DOS> qemu -L ../pc-bios -hda test.qcow2
で、ゲストOSを起動し、Ctrl-Alt-2でモニターに切り替え、仮想マシンの状態を保存します。
(qemu) savevm test
(qemu) info snapshots
ID TAG    VM SIZE DATE VM CLOCK
1 test 4M 2006-09-01 12:00:00 00:00:01.000
Ctrl-Alt-1でゲストOSに戻り、ファイルを作ります。
Guest OS$ echo test >test.txt
Guest OS$ ls
test.txt
Ctrl-Alt-2で、もう一度状態を保存します。
(qemu) savevm test2
(qemu) info snapshots
ID TAG    VM SIZE DATE VM CLOCK
1 test 4M 2006-09-01 12:00:00 00:00:01.000
2 test2 5M 2006-09-01 12:01:00 00:00:02.000
すると、IDもしくはTagでファイルを作る前の状態に戻したり、後の状態に戻したりできます。
(qemu) loadvm test
もしくは、
(qemu) loadvm 1
スナップショットを削除するのは、delvmです。
TAGを付け忘れても、それぞれのスナップショットは番号で指定することができます。
また、QEMUの起動時に-loadvmオプションを使うことで、瞬時にゲストOSを起動することも可能です。
DOS> qemu.exe -L ../pc-bios -hda test.qcow2 -loadvm test
使ってみると、結構使えそうです。以前のsavevm/loadvmは、メモリーの状態しか保存しなかったためゲストOSのディスクキャッシュとハードディスクの内容の整合性が問題になったのですが、ハードディスクの内容と一緒に保存され、問題が解消されています。
注意したほうがいいことは、状態を保存せずにloadvmをしてしまうと、それまでやっていた作業が消えてしまうこと。スナップショットの途中で作業を再開すると木の枝みたいに内容が枝分かれになってしまうことなどです。