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

OpenGLの高速化

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

ゲストOS内のOpenGLの呼び出しをホストに伝えて、OpenGLの高速化を図るパッチが登場しました。Proof of conceptと言って、アイデアの検証をしてみたとのことですが、こちらで検証しようとしてもプログラムがうまく作れなくて検証できません。
LibGL.soというライブラリ作って、ゲストOS内のOpenGLの呼び出しを横取りし、ホストOSで普通のプログラムのOpenGLの関数の呼び出しに変換して表示するという仕組みみたいです。ユーザーモードネットワークの仕組みを、グラフィックの表示でも行うみたいな感じかな。
同じような仕組みで、Direct3Dを表示することもできるんじゃないかという気がします。かなりのハックが必要になると思いますけど。
ゲストの表示速度の遅さは問題でしたので、安定して動くようになるといいのですけど。ただ、高速化の仕組みには問題があって、ゲストのメモリを直接コピーしたりしていて、i386のLinuxホスト/ゲストでしか使えません。PCIの仮想ディスプレイアダプタをアクセスしてデータをやり取りする方法がいいという意見が出てましたけれど、作れる人がいるのかな。メンテナンスする人が現れないと、このまま消えていってしまうような気がします。
まずは、自分の目で確かめたいのですが、OpenGLをよくわかってなかったりするのでした。

コマンドプロンプトをでなくするには

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

ここにあるNoConsoleというユーティリティを使うと、Windowsプログラムからコンソールを取り除くことができます。
http://dliboon.freeshell.org/?view=programming.bcx
DOS> noconsole qemu.exe
とやって、実行ファイルにパッチを当てます。バッチファイル内では、
start qemu.exe [options]
とします。
やっぱり、コンソールは邪魔に感じますかね。開発者の人が、QEMUはまだコンソールプログラムでGUIを持ったWindowsプログラムじゃないからといって、コンソール付のプログラムになっているのですけど。実は自分もあまりかっこよくないなと思っていたりします。少し手間はかかりますが、自分で変更してみてください。

gdbでのDLLのデバッグ

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

MinGWで、dllのデバッグをしようとすると、ブレークポイントを設定するのにちょっとしたコツが必要になります。
具体的には、QEMUでSDL.dllのデバッグをしようとしたのですが、まず、-gオプション付でSDLのコンパイルをします。
SDL-1.2.11>$ CFLAGS="-O0 -g" configure
SDL.dllをQEMUのある場所にコピーします。そして、gdbでのデバッグを開始します。
ここで、QEMUを走らせてからDLL内の関数を指定する方法と、走らせる前に指定する方法の2つがあります。
[その1]QEMUを走らせてから設定
いったんmain関数で実行を止めて、ブレークポイントを設定します。
$ gdb qemu
(gdb) set args -L ../pc-bios -hda ../../linux.img
(gdb) b main
(gdb) run
止まったら、調べたい関数を指定します。
(gdb) b SDL_VideoInit
(gdb) continue
これで、DLL内で止まると思います。
[その2]QEMUを走らせる前に設定
dll-symbolsでSDL.dllを指定します。
$ gdb qemu
(gdb) set args -L ../pc-bios -hda ../../linux.img
(gdb) dll-symbols SDL.dll
listで調べたい関数を表示します。
(gdb) list SDL_VideoInit
141
142 /*
143 * Initialize the video and event subsystems -- determine native pixel format
144 */
145 int SDL_VideoInit (const char *driver_name, Uint32 flags)
146 {
147 SDL_VideoDevice *video;
148 int index;
149 int i;
150 SDL_PixelFormat vformat;
表示された行番号をブレークポイントに指定します。
(gdb) break 145
(gdb) run
これで、runをすればブレークポイントで止まるはずです。ソースコードが表示されない場合、directoryでソースコードの位置を指定する必要があるかもしれません。
(gdb) directory ~/sdl-1.2.11/src/video/
なぜQEMUを実行してからでないと、ブレークポイントを設定できないかというと、SDL.dllがメモリーにロードされないとアドレスが解決できないせいだと思います。

SPARCのバイナリ

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

SPARCで、-nographicオプションが使いたいという人が現れた。でも、lukewarmさんに作ってもらったコンソールパッチは、かなり古くなってしまっていて、使えない。そこで、Ctrl-Alt-3のシリアルコンソールを使う方法と、-serialオプションと、ComEmulDrvドライバを使って、ハイパーターミナルからシリアルコンソールを使う方法を紹介しておいた。
Linuxのシリアルコンソールはほとんど使ったこと無いから、あまり詳しいことは言えないけれどね。
パッチを全部当ててバイナリを更新しておきました。
いろんな使い方をしている人がいるんですね。

デンマーク語キーボードの結果

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

どうやら、ちゃんと動くようになったようです。
今まで、プログラムの国際化はその国の人がやらないと意味無いと思ってきました。言葉の細かいところなどは、その言葉を習った人でないとわからないと思いますし。たとえば、日本語の入力メソッドを外国の人がチェックするのってとても難しいことだと思います。でも、QEMUの場合、いつまで待っても自分でバグを直してしまおうという人は現れませんでした。それに、各国に一人ずつ、そんな人が出てくると考えるほうがおかしいとも思うようになりました。
幸い、ドイツ語、デンマーク語と対応してみることで、ツールを駆使するとWindows XPで、各国の環境を再現できることがわかりました。手間はかかりますけど、1つ1つ確認した方がいいのかなと思います。

デンマーク語キーボード

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

デンマークの人から、キーボードが動かないというメールをもらった。-kオプションを使っているってことだったけれど、Windowsホスト上では-kオプションは-vncオプションと一緒で無いとうまく動かないです。
キーボードのレイアウトについては、ここが詳しいそうです。世界にはいろいろなキーボードがあるものですね。
http://en.wikipedia.org/wiki/Keyboard_layout
キーの番号付けには、こちら。
http://www.penticoff.com/nb/kbds/nbkeynumbers.htm
Windows XPのスクリーンキーボードも入力環境を変えると、キーの表示が変わります。イマイチだけど、確認するにはちょうどいいです。
また、-vncオプションを使わないときは-kオプションを無視するバイナリを作って上げておきました。

ドイツ語キーボード

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

結局、いつも使っているWinXPの設定を変更して確認しました。
いろいろ調べた結果、SDL_VIDEODRIVER=windibとSDL_VIDEODRIVER=directxで挙動が違うことが確認できました。
右Altを押してみると、windibの時はleft ctrlのイベントがright altの前に入るんですよね。どうもAltGrキーというのは、無い場合に左Ctrl+左Altで代用するみたいです。でも、実際に生成されるイベントは左Ctrl+右Altで謎が残りますけど。
調べていく過程で、SDLをSDL_VIDEODRIVER=dirextxにすると、右Altキーを押したときにleft ctrlのスキャンコードが送られてこないことがわかりました。
left ctrlのコードが悪さをしているみたいなので、削除すればよさそうなのですけど、実際に試してもらうしか確認はできないと思います。メーリングリストに聞いてみるしかないけれど、調べてくれる人がいるかどうか。
聞いてみたら、答えてくれました。なんか、フランス語も問題みたいです。left ctrlを消すことで直るかどうか。