QEMUの64bit Windowsホストの対応状況

Pocket

久しぶりに、Windows 7 x64ホストでQEMUの64 bitバイナリをつくってみました。ところが、なかなか動かせる環境が見つけられなくて試行錯誤したのでまとめてみます。

1. ライブラリのバージョン

gtk+ライブラリは、

ダウンロード先がなくなってしまいました。(2017/06/18追記)

gtk+-bundle_2.16.6-20100208_win64.zip -> NG
gtk+-bundle_2.22.1-20101229_win64.zip -> OK

バージョン2.22.1のものを使いました。バージョン2.16.6は、Pixmanというライブラリが入っていません。また、それを加えてもglibがリンクできませんでした。

SDLとzlibライブラリは、

SDL-1.2.15.tar.gz
zlib-1.2.7.tar.gz

を使いました。

2. GCCとQEMUの関係

GCCのバージョンとQEMUのバージョンで動いたり動かなかったりします。いろいろ組み合わせを試しました。

動作確認は、i386-softmmuのみで行っています。Perlやpod2manとかが必要にならないよう、--disable-docsをつけました。また、CCを最初につけないとエラーになります。

CC=gcc ./configure --target-list=i386-softmmu --disable-docs

makeは最初のほうで並列makeできないので、途中で止めて並列に切り替えて継続しています。

make
Ctl-Cで止める
make -j8

GCCは、MinGW-w64プロジェクトからです。どれを選んでいいのかわからなかったので、いろいろ試しました。
linux.imgは、qemu.orgのリファレンスイメージです。
CD-ROMは、Morphix 0.4のisoイメージを用いました。

動かしてみると、クラッシュしたりアサーションが起こったりいろいろです。
結果に書かれたクラッシュは、プログラム自体が途中で止まってしまう場合です。
Assertion failedというのは、qemu-coroutine-lock.cのqemu_in_coroutine()でアサートが起こっています。
kernel panicというのは、Linuxの起動の最後でkernel panicしてフリーズします。
無限ループというのは、画面が無限ループしています。

GCCのバージョンに分けて結果を並べていきます。

2.1 GCC-4.5.4の場合

mingw-w64-bin_x86_64-mingw_20111101_sezero.zip

QEMU linux.img CD-ROM
v1.2.0 無限ループ 無限ループ
v1.4.0 OK OK
v1.6.0 OK OK
v1.7.0 kernel panic Assertion failed

2.2 GCC-4.6.3の場合

x86_64-w64-mingw32-gcc-4.6.3-2-release-win64_rubenvb.7z

QEMU linux.img CD-ROM
v1.2.0 クラッシュ クラッシュ
v1.4.0 クラッシュ OK
v1.5.0 OK クラッシュ
v1.6.0 OK Assertion failed
v1.7.0 kernel panic Assertion failed

2.3 GCC-4.6.4の場合

x64-4.6.4-release-win32-sjlj-rev0.7z

QEMU linux.img CD-ROM
v1.2.0 クラッシュ クラッシュ
v1.4.0 クラッシュ OK
v1.6.0 OK Assertion failed
v1.7.0 kernel panic Assertion failed

2.4 GCC-4.8の場合

x86_64-w64-mingw32-gcc-4.8-stdthread-win64_rubenvb.7z

QEMU linux.img CD-ROM
v1.4.0 クラッシュ OK
v1.6.0 OK Assertion failed
v1.7.0 kernel panic Assertion failed

2.5 番外編GCC-4.6.3 32bitの場合

i686-w64-mingw32-gcc-4.6.3-2-release-win32_rubenvb.7z
gtk+-bundle_2.24.8-20111122_win32.zip

QEMU linux.img CD-ROM
v1.2.0 クラッシュ OK
v1.4.0 クラッシュ OK
v1.5.0 OK クラッシュ
v1.6.0 OK Assertion failed
v1.7.0 OK Assertion failed
v2.0.0-rc1 OK Assertion failed

3. 結果のまとめ

QEMUのバージョンは、古すぎても新しくてもだめでした。バージョン1.4.0から1.6.0が動くようです。でも、ハードディスクとCD-ROMが同時に動く組み合わせがとても少ない。GCC-4.5.4を使ったときだけとなってしまいました。

QEMUのバージョン1.6.0から1.7.0に変わってkernel panicが起こっています。CPUのエミュレートに何かバグが入ったようです。

4. MSYSの並列make

最新のMSYSをmingw-get-setup.exeから入れると、並列makeができなくなってしまいました。msys-1.0.dllのバージョン1.0.18の問題らしくて、msysCORE-1.0.17-1-msys-1.0.17-bin.tar.lzmaの中のバージョン1.0.17のmsys-1.0.dllに差し替えるとうまくいきます。

また、makeの時にversion.oができるまでは並列makeをしてしまうとハングしてしまい、make distcleanすることもできなくなります。最初はmakeのみで始めて、しばらくしてからCtrl-Cで止めてから、make -j8とかで並列makeするとうまくいきます。

5. 感想

なんだか動いたり動かなかったりで、ロシアンルーレットみたいでした。最初に動く組み合わせを見つけるのにとても苦労しました。何が問題だかわからなかった。

CPUに関するバグと、CD-ROMが動かないバグの2つがあるみたいです。CPUに関するものは、ログとにらめっこする必要がありそうです。CD-ROMは、coroutineというもののようですが、どうやったらバグをつぶせるのでしょう。

6. 補足(2014/6/10)

ハードディスクの問題はパッチが出てコミットもされたので、次のリリースは大丈夫だと思います。

CD-ROMの問題は、configure時に--disable-coroutine-poolをつけてコンパイルしてねということのようです。

ところが、g_pollに加えられた変更のため、ハードディスクからまったく起動しなくなっています。パッチは出ているのでそのうち直ると思います。

7.補足2(2014/07/07)

ハードディスクとCD-ROMのバグが両方とれました。
64bitと32bitのバイナリで、ハードディスクとCD-ROMイメージから起動することを確認しました。

マウスのポインタがうまく動いてないですけど、それはまた別の問題ですね。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください