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

Accelerated-KNOPPIX

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

試してみた。
ずいぶん速くなっています。素のKnoppixでは、QEMUで起動する気にならないくらい遅かったのですが、こんな感じでした。
QEMU-0.8.0/kqemu-0.7.2
qemu -L ./pc-bios -cdrom accel.img -m 256
で起動。
knoppix desktop=icewm のとき、1min 45sec
knoppix desktop=twm のとき、 1min 40sec
knoppix desktop=kde のとき、 2min 50sec
KDEでは、遅いなと思うけど、icewmなら何とかという感じ。-m 256 がないとスワップしてつらいと思います。
キーを押し続けてもリピートがうまくいかないみたいですけど。
ちなみに、Morphixは、1minで立ち上がるのでまだまだですけどね。

シリアルの名前つきパイプとファイル出力

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

シリアルのパッチとバイナリを作りました。
http://www.h6.dion.ne.jp/~kazuw/qemu-win/qemu-20060320-serial.zip
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060320-serial-3.patch
サポートすオプションは、
-serial pipe:com_1
-serial file:test.txt
です。pipe:とfile:は小文字を使ってください。-serialオプションは、1つだけサポートします。-serial pipe:オプションで、windbgと接続できます。
詳しくはこちらに書くつもり。
http://www.h7.dion.ne.jp/~qemu-win/DebuggingTips-ja.html#windbg
書いた。

非同期のWriteFile

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

非同期のWriteFileで、普通のファイルに書こうとするとファイルポインタが動かなくて、ファイルの先頭から毎度書き込もうとします。最初、1文字しか書かれなくてよくわからなかった。書こうとする位置を自分で管理しないといけないらしい。OVERLAPPED構造体のoffsetに書こうとする位置をセットするのだそうです。

名前つきパイプ

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

日本語キーボードと、シリアルのパッチをホームページに載せておきました。
名前つきパイプでwindbgと接続する方法を試してみた。
名前つきパイプのサンプルはMSのサイトにある。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ipc/base/interprocess_communications.asp
非同期の通信でやることにした。
CreateNamedPipeでパイプを作り、ConnectNamedPipeでクライアントからの接続を待ち、あとはReadFile/WriteFileするだけみたい。クライアントはwindbgになるけど。
パイプのタイプにBYTEとMESSAGEがあるけど、BYTEのほうでいいみたいだ。
作ってみるとすごい遅いんです。Win2kが立ち上がるのに8分ぐらいかかります。VMwareでwindbgを使ったリモートデバッグでもこんなもんなんですかね。実機でもすごく遅いみたいなんですけど、どれくらい遅いのかやったことがないのでわからない。
ときどきCPUが100%になってマウスのカーソルが動かないことも起きるし。
バッファのサイズとか変えてみたけど変化ないみたい。
仕方ないかなと思いますが、少し残念です。使えるようになっただけでOKとするかな。

シリアルのパッチとバイナリ

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

シリアルのパッチとバイナリを作りました。
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060311-serial-3.patch
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060311-16550a.patch
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060311-serial-win2kxp.patch
http://www.h6.dion.ne.jp/~kazuw/qemu-win/qemu-20060311-serial.zip
オプションは、次の通りです。
-serial COM1
COM番号に大文字を使ってください。
ダイアログが出てきますので、通信パラメータを設定してください。
パッチを当てた後、Windowsを起動すると最初に、デバイスがアップデートされたことを検出します。デバイスドライバがインストールされた後、再起動してください。
実際のCOMポートではテストしていません。
ComEmulDrvというWindows 2000/XP用に仮想COMポートのペアを提供するドライバを使って、COM5とCOM6を設定し、Win2kゲストとWinXPホストの間でHyperTerminalで通信できるのを確認しました。
http://mixw.net/related.htm#tncemu
通信パラメータは重要です。テストしたパラメータは次の通りです。
ビット/秒: 9600 bps
データビット: 8 bit
パリティ: なし
ストップビット: 1
フロー制御: なし
ホストとゲストとQEMUで同じパラメータを使う必要があります。
フロー制御をハードウェアにした場合、qemu-20060311-serial-win2kxp.patchを使わないと、Win2kゲストからWinXPホストへデータを送ることができません。
Windbgは、速度が遅すぎるととても使えないことがわかった。名前つきパイプを使えるようにしてみようと思います。
モデムをもってましたら試してみてくださいませ。

QEMUのシリアルの扱い方

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

QEMUの中では、次のようにシリアルに関するデータが渡されています。
vl.cで、
serial_hds[i] = qemu_chr_open(serial_devices[i]);
serial_hdsに、CharDriverState *chrが入る。
pc.cで、
serial_init( , , , serial_hds[i]);
で、シリアルに渡され、
serial.cで、
SerialState s->chr = chr;
として保存。
qemu_chr_add_read_handler(chr, serial_can_reveive, serial_receive1, s);
として、割り込みハンドラに渡される。
割り込みハンドラの登録と、データの送受信の関数など作り、とりあえずシリアルは動くようになりました。
ただ、Win2kゲスト/WinXPホストのHyperTerminal同士で通信したとき、通信パラメータのRTS/CTS制御を有効にすると、ゲストからホストに文字が送れないのです。ハードウェア制御がなしならばいいのですが。
QEMUのシリアルのエミュレーションに問題があるのか、使っているComEmulDrvという仮想COMポートに問題があるのかわからない…。
もっと細かく見ないといけないのかな。

シリアルのいろいろ

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

シリアルのメモ
シリアルのパラメータはいろいろあってよくわからない。ダイアログが出せるみたいなので、とりあえず使うことにした。RTS/CTSフロー制御を使うのが一般的なのかな。
ClearCommError()で、cbInQueにたまっているデータの数が入っているので、それでReadFileするとバッファからデータを読むことができる。
WaitCommEvent()でイベント待ちにして、WaitForMultipleObjects()/WaitForSingleObject()でシグナル状態になるのを待って、ReadFileする。
GetOverlappedResult( , FALSE)にすると完了を待たずに、抜ける。TRUEにすると、完了を待つ。
ReadFile/WriteFileは、デバイスドライバの送信/受信バッファに読み書きすること。データが届いたかどうかはわからない。
マルチスレッドにすれば、待ち受け関数をINFINITEで待つことができるけど、データの受け渡しにCriticalSectionを使ったりしないといけなく、バッファの取り扱いが面倒。
まず、マルチスレッドを使わずに動作を確認しようと思った。ReadFile/WriteFileは同期にすると問題があるそうなので、OVERLAPPEDを使った非同期にすることにした。
作ってみたけど、どうもうまく動かない。どうやらWaitForSingleObjectでイベント待ちにしてSleepしたところで何もいわずに落ちてしまう。テストプログラムだと大丈夫なんだけど。仕方ないので、WaitCommEventを使わないことにした。

シリアルの調査

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

シリアルポートについて調べてみました。
調べてみて、シリアルポートの使い方って歴史が古いなって感じました。なんといっても、Win95やWin3.1のころからあるわけで、現在までの間でCPUは10倍以上速くなっているわけですし。9x系からNT系に変わっているわけだし、プログラムの作り方も変わっていると思ったほうがいい気もします。
見ていると、シリアルのチップによっても癖があるみたいな報告もあって、なかなかどこでも動くプログラムを作るのは難しそうです。
プログラム上の問題は、大別すると2つあって、1つはシリアルポートの設定に関するもの、もう1つはAPIの使い方、スレッド、イベントの使い方になります。ネットワークのときのような定番となる使い方が見つけられないことが難しいところです。
参考にしたサイトは、次のようなところです。データの受け渡しが気になって、マルチスレッドを使ったものを調べてみました。Microsoftのサンプルがあるけど、よくわからなかった。CodeGuruのサンプルのほうが簡単かもしれません。CREATORS BANK, TETRAEDRE, Parsley, Expert Exchangeのサンプルは、MinGW用に少し変更して動かしてみました。貴重な情報に感謝。
CREATORS BANK
http://www.geocities.jp/terukat/_geo_contents_/win/index.html
TETRAEDRE
http://www.tetraedre.com/advanced/
Parsley's Web Resource
http://blog.so-net.ne.jp/SpicyParsley/2005-02-18
How to collect data from monitors
http://www.med.osaka-u.ac.jp/pub/anes/www/software/DataAcquisition.html
Expert Exchange
http://www.experts-exchange.com/Programming/Q_21083345.html
WindowsでRS232Cを使う
http://members.jcom.home.ne.jp/0434383301/vc10.htm
マルチスレッドの通信
http://homepage2.nifty.com/DSS/WinSys/Win/commthread.htm
CodeGuru
http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c2503
Serial Communications in Win32 (MTTTY)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp

タイマーの問題

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

タイマーの問題は前から気になっているのですが、なかなか有効な方法が見つからないのです。特に、KqemuやQvm86を使うと目立つので何とかしたいのですが、メーリングリストに出てくるパッチを試してみても、よくなるどころか悪くなったりして、どうしたものかなという状態です。
やるとすると、QEMU内での時間の進め方を解析したり、WindowsやLinuxの時間の刻み方を確認することが必要な気がするのですが、結構大変そう。
その前に、シリアルポートを使えるようにできないかなと思っています。シリアルポートを使ったWindowsのリモートデバッグをやってみたいなと思います。
それが終わったら、インストールの問題とあわせて見てみようかな。予定は未定ですけど。

USBのバイナリ

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

USBをサポートしたバイナリを作ってみました。これも、ドキュメントが不足していて、どうやって作ったり使ったりするのかよくわからなかった。
使い方としては、ホストにフィルタードライバをインストールして、-usbオプションつきでプログラムを起動します。そして、QEMUモニターでinfo usbhostでUSBデバイスのIDを調べ、usb_add host:xxxx:yyyyします。Windows 2000ゲストならPnPで使えるようになると思います。
その他ホームページのほうに書いておきました。
Kqemuを使うと、-win2k-hackがいらなくなるということは、Windows 2000の問題もCPUの問題なんですかね。IDEの問題だとばかり思っていたんですけど。