Mersenne Twister

メルセンヌ・ツイスタ
擬似乱数生成アルゴリズムだって。線形合同法よりも良質な乱数を生成する。
乱数生成といってもいろいろあるのね。
ちなみに、tongue twisterというと早口言葉のこと。tongue(タン)は、舌のことです。牛肉のタンと一緒だったりする。
牛肉のハツは、hearts(ハーツ)からきているそうですね。なんか話が違っているような…。

OOB

OOB - Out of band
帯域外データ
telnetプロトコルでCtrl-Cのような割り込みで使っている。
send/recvにMSG_OOBを渡すことで送受信できる。
setsockoptにSO_OOBINLINEを設定することで、OOBデータを得ることもできる。<---設定しなければ、送ることができないの?不明。設定したときとしないときで、selectが反応するかどうかを調べればいいのだろうけど。 とりあえず使っていないからいいか。telnetも使えるようだし。

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
とすると、パッチができます。