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

QEMU/KVMでUEFIファームウェアを使う

QEMU/KVMでUEFIファームウェアを使う方法が紹介されています。

第441回 QEMU/KVMでUEFIファームウェアを使う

OVMFというオープンソースのファームウェアを使っています。

UEFIを使うメリットとしては、2TB以上のハードディスクを使う場合ぐらいしか現状ではないかもしれませんが。

でも、UEFIを開発するにはデバッグもできていいのでしょうね。

QEMUのWindows上での作り方

はじめに

久しぶりにWindows上でQEMUを作ろうとしたら、ソースコードの修正が入っていて作り方が変わっていました。いろいろ試行錯誤して作り方を見つけたので紹介します。

QEMUのソースコードの現状

今年(2016年)の3月までは、GCC 4.5とGTK+ 3.6.4という組み合わせでコンパイルできていました。でも、MinGW-w64のgcc 4.8になるとwinsock関係のインクルードファイルに変更があって、それに対応するためにQEMUにも変更が入りました。

この変更で、GTK+ 3.6.4のライブラリ内でワーニングが出てしまい、QEMUをコンパイルできなくなりました。GCC 5.4に変えても無理で、GTK+のライブラリのバージョンを上げることが必要になりました。

作成環境の現状

QEMUは、GTK+に含まれるGlibというライブラリを使っています。Windows上でコンパイルしようとするときは、今まではGTK+のホームページからx86_64版をダウンロードして使ってきました。しかし、メンテナンスする人がいないようで、配布されなくなりました。GTK+のホームページでは、MSYS2という開発環境を使うよう案内があります。今後は、MSYS2を使った環境でしかQEMUを作れないことになりそうです。

Linux上のクロス開発環境では今までどおり作れると思います。

MSYS2のインストール

MSYS2はインストーラーが準備されていますので、MSYS2インストーラーのホームページからmsys2-x86_64-20160205.exeというインストーラーをダウンロードしてインストールするだけです。

SourceForgeにあるMSYS2の新しいインストーラーはなぜか起動しなかったです。

インストール後にMSYS2インストーラーのホームページに従ってアップデートするのですが、

pacman -Sy pacman

は大丈夫でした。しかし、次の

pacman -Syu

をすると、エラーで止まってしまいました。新しいプロセスをフォークできませんと言っています。調べてみると、エラーのあったパッケージは手動でインストールしなおさないといけないそうです。filesystemというパッケージがエラーになっているのをメモリました。仕方がないのでCrtl-Cでプロンプトに戻り、いったんターミナルを終了しました。ターミナルを、もう一度スタートメニューから起動しようとしましたが起動せず、コマンドプロンプトが出てしまいます。

原因は、MSYS2の起動方法が変わり、batファイルで起動していたのをcmdファイルに変更したためです。

C:\msys64\msys2_shell.cmdをダブルクリックすることでターミナルは起動しました。そこで、

pacman -S filesystem

で、filesystemをインストールしなおします。メッセージに起動方法が変わったことが出ていました。

あとは、スタートニューのMSYS2 Shellの項目のプロパティを開き、

C:\Windows\System32\cmd.exe /A /Q /C C:\msys64\msys2_shell.cmd -msys

と書き換えることで起動できるようになります。ポイントは、msys2_shell.cmdを指すように変更することです。コマンドプロンプトのウィンドウも閉じるように/Kオプションを/Cオプションに変更しました。なお、Windows 10では、右クリックでプロパティを表示させることができませんでした。いったん「ファイルの場所を開く」で、エクスプローラーを表示させて、アイコンを右クリックでプロパティを変更することができます。

スタートメニューの問題は、インストーラーがアップデートされれば、いずれなくなると思います。

QEMUに必要なツールのインストール

MSYS2のアップデートが終わったら、QEMUに必要なツールをインストールします。

MSYS2は、パッケージマネージャで管理されているので、次のようにしました。まずは、gccなどのツールをインストールします。

pacman -S mingw-w64-x86_64-toolchain

次に、GTK3をインストールします。

pacman -S mingw-w64-x86_64-gtk3

SDLライブラリも必要なので入れます。

pacman -S mingw-w64-x86_64-SDL2

あとは、makeとcmpとbisonが無いといわれますのでインストールします。

pacman -S msys/make

pacman -S diffutils

pacman -S bison

これで、必要なツールは、インストールできました。あとは、QEMUのソースコードを持ってきて作るだけです。

QEMUを作るときは、MinGW-w64 Win64 Shellを起動して作ります。このときの起動パラメーターは、-mingw64をつけます。スタートメニューのMinGW-w64 Win64 Shellのプロパティを変更する必要がありました。

C:\Windows\System32\cmd.exe /A /Q /C C:\msys64\msys2_shell.cmd -mingw64

まとめ

QEMUをWindowsで作るにはMSYS2の開発環境が必要になりました。

MSYS2のインストールで、エラーが出るため手動で書き換える必要がありました。

感想

MSYS2のMinGW-w64のGCCのバージョンは、6.1.0です。ちょっと見ないうちにすごく上がってしまいました。

GTK+のWindows版をメンテナンスする人がいないということは、使う人もいないのでしょうね。開発の主力がインターネットのほうに移っているのでしょう。時代の流れを感じます。

MSYS2という環境は、パッケージマネージャがあるので、環境整備はやりやすくなったと思います。

QEMUとFPGA

インテルがアルテラを買収するそうですね。XeonにFPGAを組み込む計画があるそうです。

インテル、プログラマブルなLSI「FPGA」大手のアルテラ買収を発表。XeonにFPGAを組み込む計画も表明

そこで思ったのですが、QEMUのダイナミックトランスレートの部分をFPGAに書き込んで実行させたら少しは早くなりそう。

2倍くらいにはなりそうな気がします。

プログラムの実行時に書き込みができるようにするんですかね。それとも、OSが立ち上がる前に書き込んでおかないと使えないのかな。

VT-xには足元にも及びませんが、FPGAの使いかたの1つにはなりますかね。

x86_64ゲストがカーネルパニックで起動しない

x86_64ゲストがカーネルパニックで起動しないバグを見つけてしまいました。

QEMUの2.3.0を作ろうとしています。何の気なしにx86_64のゲストを起動したところ、カーネルパニックが発生。最初MinGWの問題かと思いました。VMware Player上のUbuntu 14.04ホストでも発生することがわかりました。

起動するゲストOSと起動しないものがあります。32bitのゲストOSは起動します。64bitのゲストOSは、起動するものは、Fedora 10です。Fedora Core 4は起動しません。Ubuntu 12.04は、-m 2048オプションをつけると起動しますが、つけないと起動しません。

さて、どうしたものでしょう。

QEMU 2.2以上のコンパイルにはGTK+ 3が必要

先日、QEMUをWindows上で作ってみたのですが、コンパイルできませんでした。

原因は、pixmanの0.21.8以上が必要との事でした。

今まで、GTK+ for Windows のGTK+ 2を使っていました。

gtk+-bundle_2.16.6-20100208_win64.zip

これのpixmanは0.20.0でした。

GTK+ 3は、pixmanが0.26.0になっています。

gtk+-bundle_3.6.4-20131201_win64.zip

今後は、これを使っていこうと思います。

熱血! アセンブラ入門

熱血! アセンブラ入門という本が発売されるそうです。

目次だけから見ると、MIPS、PowerPC、ARM、SH、H8といったメジャーなものからマイナーなものまで幅広く解説されています。
よくここまで調べたなって思います。

gdbの機能を使って、シミュレーターを動かしたりすることも解説されているようです。

これを見ていて、QEMUで動かしたら面白いかもねって思いました。それぞれのゲストOSを用意するのが大変そうでけどね。

作者さんのブログはこちら。

本のサポートページはこちらです。

QEMUのWin64対応状況の変化

この前、Win64対応状況をいろいろ調べましたが、ハードディスクに関する問題を修正するパッチが出てきました。

[Qemu-devel] [PATCH 1/3] tcg-i386: Fix win64 qemu store

コミットもされたようなので、次にリリースは大丈夫だと思います。

また、CD-ROMに関するものはconfigure時に--disable-corouinte-poolをつけてコンパイルしてねということのようです。

Re: [Qemu-devel] [PULL 7/7] tcg-i386: Use new return-argument ld/st help

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

[Qemu-devel] [PATCH v2] w32: Fix regression caused by new g_poll impleme

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

久しぶりに、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イメージから起動することを確認しました。

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

Windows用のバイナリ

QEMUのWindows用のバイナリは、武田俊也さんが作ってくださることになりました。
http://www1.interq.or.jp/t-takeda/top.html
http://www1.interq.or.jp/~t-takeda/qemu/
古いコンピュータのエミュレータについて、手広く手がけられています。今回、バイナリを作って頂くことにあたり、非常にお世話になりました。ありがとうございました。
QEMUのリリース版の他、CVSからも2,3週間ごとに作ってくださるそうです。皆さんのご協力をお願いします。