「QEMU」カテゴリーアーカイブ

VLANのsocketオプション

***本記事にはプロモーションが含まれています。***

とりあえず、VLANのsocketオプションを動かすことに成功。まだ、人様にお見せできる状態じゃないですけど。ゲスト同士で、sshでアクセスできるみたいです。
ただ、わからないことがいくつかあって、どうしたもんかなと考え中。selectのexceptional file descriptorをセットするところがあって、Out of Bandデータを扱うそうなんですけど、OOBってなに?な状態ですので、調べないといかんのかなあ。
ファイルディスクリプタのセットはどう扱えばいいのか、とか。メモリーを確保しているけど、freeしていないのはどうして、だとか。
selectじゃなくて、eventを使ったほうがいいのかな。とも思うけど、実際に作ってみないとなんとも言えないし。BSDソケットと互換にしておいたほうがいいかなとも思ったり。
わからないところはそのままにしておくのかな。

パフォーマンスチェック

***本記事にはプロモーションが含まれています。***

速くなったかも、という声があったので、OSの起動時間を比較してみました。
kqemuはなしです。

OS 0.7.2 0.8.0
Linux 4 sec 4 sec
Redhat7.2 29 sec 28 sec
Win98 53 sec 16 sec
Win2k 起動不能(以前は52sec) 47 sec

全体にほんの少し速くなっているみたい。Win98は、特に起動が速くなっています。PCIバスのコントローラーが変更になったことによると思います。また、その影響で、一度0.8.0で起動するとそのハードディスクイメージは0.7.2では使えなくなりました。

ハイパースレッドの問題

***本記事にはプロモーションが含まれています。***

ハイパースレッドで聞いたことをまとめておくと、QEMUは、一定時間ごとに割り込みなどを処理することでエミュレーションします。Windowsホストでは、10msごとにマルチメディアタイマーを使ってコールバックルーチンを呼ぶことで処理します。マルチメディアタイマーのライブラリの内部では、スレッドを使っているようです。そのため、タイマーからコールバックルーチンが呼ばれたとき、QEMU内でのもともとの処理とコールバックルーチンの処理が並列動作となります。そのときのデータの扱いが問題となってプログラムが動作しないようです。
スレッドが並列動作となることが問題になるため、システムがハイパースレッドだったり、マルチコアなどのマルチプロセッサの時に問題となります。
Linuxはシグナルを使って、関数を呼んでいるため、プロセスは一時停止になるみたいで、動作がLinuxとWindowsで異なるようです。
これを直すには、プログラム内のどこがマルチスレッドセーフでないのかを探し出して、直すしかないです。今のSMPのサポートは、1つのプロセッサごとに時間的に順番に処理を行うことでエミュレーションしています。将来的にスレッドを使ってやろうとすると、マルチスレッドがLinux上でも問題になると思います。また、ディスクアクセスをノンブロッキングでやるパッチも出ていますが、これも問題になりそうです。
マルチスレッドのバグは見つけるのが難しいそうですけど、どうやってやるんですかね。

0.8.0のバイナリ

***本記事にはプロモーションが含まれています。***

バージョン0.8.0のバイナリを作りました。ネットワークとサウンドのオプションが変わっているので注意してください。
SPARCとARMのLinuxも動くことが確認できましたので、加えることにしました。
とりあえずこんなとこかな。

CVSのリポジトリ

***本記事にはプロモーションが含まれています。***

QEMUのCVSのリポジトリの位置が変わったようです。次のようにするといいみたい。
export CVS_RSH="ssh"
cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/souces/qemu co qemu
一度、ダウンロードしてしまえば、qemuのディレクトリの中で、
cvs update
することで、アップデートできます。
パッチを作る場合は、
cvs diff -u > ../qemu-xxx.patch
とすると、パッチができます。

全部入りのバイナリ

***本記事にはプロモーションが含まれています。***

QEMUにパッチをすべて当てたバイナリを作ってみました。Windowsがゲストのときはインストールしなおさないといけないですけど。
ディスクアクセスは少し速くなるみたいです。

VLANのaccept

***本記事にはプロモーションが含まれています。***

acceptは、使えるようにはできた。pollをselectで代用しようとしたけど、selectの使い方をよく知らないのでした。

VLAN

***本記事にはプロモーションが含まれています。***

新しいネットワークオプションをWindowsで使えるかどうか見てみた。-net socket,listenというオプションはpollを使うみたい。けど、pollなんてWinsockにはないし、どうしよう。