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

ドキュメント

サウンドが変というつっこみが入って、オーディオ関係をいじっております。
ところが、ドキュメントが全然ないですよね。せっかくいろいろ作ってあっても、これでは使えない。
結局、ソースコードを見つつ試行錯誤して動かしています。
今まで、サウンドカードなるものは買ったことがないですし、SoundBlasterくらいは知っていても、その他のことはまったく知らず。ES1370と聞いても何それ?な状態ですのでドライバ1つ入れるのにも四苦八苦です。やっぱり、プログラムを作った人がドキュメントを作ってくれないと、どうしようもないのに。と思ってしまいます。
他の、プロジェクトなんかはどんな感じなんでしょう。

Intel版Mac OS X

Intel版Mac OS Xが、QEMUにパッチを当てると起動するという話が載っています。CPUIDの時返す値をAMDから、Intelに変えるみたい。
http://qemu.dad-answers.com/viewtopic.php?t=223
メーリングリストによると、10.4.1は動くそうですけど、10.4.4とかはEFIを使うため動かないそうです。
http://lists.gnu.org/archive/html/qemu-devel/2006-01/msg00200.html
そのうち動くようになるのかな。

splauncher

ハイパースレッド、マルチコア、SMPで動かない問題については、splauncherがうまく回避してくれます。中では、SetProcessAffinityMaskを使用してプロセッサを限定してプロセスを実行する、ということをやっています。
SetThreadAffinityMaskを使うと同様のことがスレッドでもできるそうです。似たものにSetThreadIdealProcessorというのがあって、こちらは強制じゃなくてできるだけ1つのプロセッサでということらしい。
Linuxでも、Linux 2.5.8以降sched_setaffinity, sched_getaffinityが導入され、glibc 2.3以降で利用可能になっているそうです。
マルチコアだと、パフォーマンスカウンタがプロセッサごとに違うという記述も見つけた。これもいずれ問題になるかも。すでにメーリングリストでは話題になっているけど。
実際の使用例を見ていると、プロセスのプライオリティをREALTIME_PRIORITY_CLASS、スレッドのプライオリティをTHREAD_PRIORITY_TIME_CRITICALにしてQueryPerformanceCounterしている。こういうものなのか。
http://www.flipcode.com/cgi-bin/fcarticles.cgi?show=64089

tapとsocket

なんとかtapを使えるようになりました。
わりと簡単にできたなと喜んでいたのですが、しばらく使ってみて、socketと一緒に使うことができないことが判明。ぬぁぜだぁーーーっと叫んでいたのですが、それもほどなく判明。メモリーのバグも見つけて直せたからいいか、という感じです。少し遊んでおります。
デバッグで、Etherealまで入れることになってしまったのですが、これって、プログラムで開いたソケットを監視することってできないんですね。なんか知らないだけかもしれないですけど。
しばらくしたら公開することにしようかな。

tapの調査

0.7.2では、
qemu_add_read_packetで、
qemu_add_fd_read_handlerが呼ばれる。
ne2000_can_receiveとne2000_receiveを登録するのに使われている。
0.8.0では、
qemu_set_fd_handler(s->fd, tap_send, NULL, s)
で、IOハンドラを登録。データが来たときに反応する。
qemu_new_vlan_clientでne2000_receiveを登録。ne2000_can_receiveは登録されなくなっている。
これで、1つのclientから出たデータを他のclientに分配するときの関数を登録している。
0.7.2では、
n = tap_win32_readで、データがあれば、
first_io_handler->fd_read
これは、ne2000_receiveが呼ばれる。
その後、
tap_win32_free_bufferしている。
などなど、やっております。

VLANのパッチとバイナリ

VLANのパッチとバイナリを作りました。
次のようにするとゲストOS同士で通信ができます。ゲストOSを2つ用意し、2つのコマンドプロンプトから起動します。
Prompt1> qemu.exe -L ./ -hda redhat1.img -net nic -net socket,listen=localhost:1234
Prompt2> qemu.exe -L ./ -hda redhat2.img -net nic,macaddr=52:54:00:12:34:57 -net socket,connect=localhost:1234
OSが立ち上がったら、IPアドレスを設定します。
Redhat1> ifconfig eth0 10.0.2.16
Redhat2> ifconfig eth0 10.0.2.17
もう少し詳しい使い方は、作成中です。
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060102-vlan-2.patch
http://www.h6.dion.ne.jp/~kazuw/qemu-win/qemu-20060102-vlan.zip