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

MIPSのエミュレータ

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

MIPSのエミュレータがWindowsホストでも動くことを確認しました。Debianのインストーラの画面は壊れてしまっていて使えないけれど。
qemu-system-mips.exeが、ビッグエンディアンのゲストOS向け、qemu-system-mipsel.exeがリトルエンディアンのゲストOS向けです。Ctrl-Alt-3を押すとプロンプトを見ることができます。
serial-threadパッチを使うと、Windbgの接続が不安定になることがわかり、それを取り除いたバイナリと一緒にアップしておきました。

KVM

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

KVMという、LinuxのカーネルドライバーとしてIntel VTやAMD-Vを使うプロジェクトができていますね。PCのエミュレーションとしてQEMUを使っているようです。最近まで、アナウンスが無くて知りませんでした。使った人はいるでしょうか。どれくらい速いものなんでしょう。もっとも、Xenの事もあまりわからなかったりするのですけどね。
試してみたいのは山々なのですが、CPUが対応していないと試せないですよね。そろそろ、パソコンの買い替えの時期かも。
それにしても、KVMと聞くと、キーボード/ビデオ/マウススイッチに見えてしまうんですけど、ネーミングは何とかならなかったものですかね。K Virtual MachineというJavaの仮想マシンもありましたっけ。
性能がよければ、Windowsホストでも動かせるようにできないかなと思いますけれど。
Linux 2.6.20には、取り込まれるみたいですね。
http://kvm.sourceforge.net/
少し調べてみると、lhypeというのもあるんですね。Rusty Russelさんがつくっているのだそうですけど。簡単な使い方がここにあります。
http://virt.kernelnewbies.org/RustyvisorQuickstart

NoConsole ユーティリティ

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

コマンドプロンプトを出なくしたいというメールをまたもらったので、NoConsoleのことを教えてあげた。そしたら、ソースコードが簡単だったので、Rubyで書いてしまったというメールが返ってきた。
自分はRubistではないので、よくわからないけど、日本人だったらRubyくらい知らないといけないかなと、なぜか思った。
ARGV.each do |file_name|
File.open(file_name, "r+b") do |f|
f.seek(220)
kar1 = f.read(1)
int1 = kar1.unpack("c").shift
if int1 == 2
int2 = 3
elsif int1 == 3
int2 = 2
end
kar2 = [int2].pack("c")
f.seek(220)
f.write(kar2)
puts "Converted from DOS-Box to GUI." if int2 == 2
puts "Converted from GUI to DOS-Box." if int2 == 3
end
end

CygwinのXのクライアント

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

CygwinのXサーバは、startxとか、startxwin.shで立ち上がります。
そこで立ち上がったxtermでクライアントを動かすのはいいのですが、別のCygwinのシェルからクライアントを起動したい場合は、DISPLAY変数を設定しておく必要があるようです。
bash>$ export DISPLAY=localhost:0.0
bash>$ ./hogehoge

CygwinのXで、OpenGLプログラミング

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

CygwinのX環境でも、OpenGLのプログラムが作れます。
Cygwinで、XとOpenGL related libraryをインストールしました。
コンパイルは、
gcc test.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lGL -lGLU
とかです。-lX11の順序が重要のようです。
MSのサイトにあるサンプルをコンパイルしてみたのですが、glXChooseVisualが、失敗してしまいました。GLX_RGBAを引数につけると大丈夫のようです。よくわからないんですけど、完全に同じというわけにはいかないのかな。動くだけでもすごいですけど。

GLXとWGL

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

GLX(OpenGL extension to the X Window)をWGL(Windows GL?)に移植する情報が、MSDNにあった。
ここにあるサンプルを基に調べてみようと思います。
http://msdn2.microsoft.com/en-us/library/ms537731.aspx
探してみたけれど、GLXの情報が少ないです。Xlibのマニュアルは見つけられました。

OpenGLのGLUT

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

GLUT(OpenGL Utility Toolkit)は、最近は開発が止まっていて、Fedora Core 4とかだとfreeglutがインストールされています。調べてみたのですが、MinGWで使う方法は、紹介されていました。が、プログラムをコンパイルするとSTDCALLが使われているという警告がでて、うまく解除する方法が見つかりませんでした。
それで、freeglutを試してみました。これも、コンパイルしてみるとundefined referenceというエラーが出てうまくコンパイルできません。結局、staticリンクのライブラリを作るようにして解決しました。
まず、freeglut-2.4.0を-DFREE_GLUT_STATICをつけてコンパイルします。作成したlibglut.aは、他のライブラリに合わせて、libglut32.aに名前を変えて使います。
freeglut-2.4.0$ CFLAGS="-O2 -g -DFREEGLUT_STATIC" ./configure
freeglut-2.4.0$ make -C src
freeglut-2.4.0$ mv /mingw/lib/libglut32.a /mingw/lib/libglut32.a.orig
freeglut-2.4.0$ cp src/.libs/libglut.a /mingw/lib/liblut32.a
freeglut-2.4.0$ cp include/GL/free* /mingw/include/GL
freeglut-2.4.0$ cp include/GL/glut.h /mingw/include/GL
使うときは、<GL/glut.h>の前に#define FREEGLUT_STATICを付けます。
#include <GL/gl.h>
#define FREEGLUT_STATIC
#include <GL/glut.h>
コンパイルは、次のオプションで行います。-lglut32の順序が重要で最初にないといけないみたいです。
gcc test.c -lglut32 -lglu32 -lopengl32 -lwinmm -lgdi32

PCIバスが動かない

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

PCIバスが動かないというメールをもらって調べてみたら、BIOSファイルを更新するのを忘れていました。すみません。
qemu-20061030-all.zipは、うまく動きませんでした。
新しいすべてのパッチをあてたバイナリはちゃんと動くと思います。
それと、libusb0.dllを同梱することにしました。USBのフィルタドライバがインストールされていなくても動くと思います。Win98/Meホストでも起動すると思うけれど、確認していません。もちろん、Win98/Meホストではドライバがインストールできないので、USBは使えませんけれど。
http://www.h6.dion.ne.jp/~kazuw/qemu-win/qemu-20061123-all.zip

OpenGLの扱い方

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

mrtさんに言われて考えてみたのですが、今後の方針としてWindowsホストでもOpenGLが高速化されるようにパッチの移植にトライしてみようと思います。CVSにとりこまれる実装が変わる可能性があるけれど、1度動かし方がわかれば何とかなるでしょう。
wineの完成度はどのくらいなんでしょうね。実際、どのくらいのプログラムが動くようになっているのでしょう。
まずは、OpenGLとか勉強してみて動かせそうかどうか見てみないといけないですけど。DirectDraw/Direct3Dについても調べてみる必要がありそう。
高速化を図る仕組みとしては、ライブラリのレベルで手を入れるのか、デバイスドライバ/ディスプレイアダプタのレベルにするかというのがありますね。対象にするものがOpenGLかDirectXかによっても話が違ってくるわけで、結局どうするのが一番手間がかからなくて性能がいいんだろう、とか考えてしまいました。

OpenGLのglxgears

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

やっとパッチを当てて動くようになりました。バグがあったのと、gccの最適化をかけるとコンパイルできなくて、試行錯誤しました。結局最適化無しでしかコンパイルできなかったです。それと、LD_LIBRARY_PATHで、用意したライブラリを設定してゲストOSでプログラムを動かす必要があるのですが、メールで説明されていた方法が間違っていました。ライブラリを直接指定するのではなく、パスを指定するのがLD_LIBRARY_PATHでした。
glxgearsというプログラムを動かしてみると、別のウィンドウが出て、そこに表示されます。アクセラレート無しで24FPSくらいなのが、170FPSくらいになりました。ホストで実行した場合は、670FPSくらいですので、実機の4分の1くらいまで加速されます。
修正したパッチはメーリングリストに送っておきました。
作り方は、まず、パッチを当てます。そして、makeすると、i386-softmmuにlibGL.soというファイルができます。
QEMUは、-enable-glオプションを付けて起動します。
ゲストOSが立ち上がったら、libGL.soを、ゲストOSにftpなどでコピーします。そして、libGL.so.1にリンクを張ります。これは、glxgearsが、libGL.so.1を必要とするからです。
guest>$ ln -s libGL.so libGL.so.1
LD_LIBRARY_PATHに、カレントディレクトリなら'.'、もしくはlibGL.so.1のあるディレクトリを指定します。
guest>$ LD_LIBRARY_PATH=. glxgears
すると、別のウィンドウが開くはずです。
こんなの作れてしまう人ってすごいなと思います。