QEMUを使ってみる
組込みボードが無くとも組込みで遊べる方法は無いものかと考えていたが、
QEMUというものがあることを思い出す。
組込み向けCPUアーキテクチャARMのエミュレータの機能も持っており、AndroidのSDKにも使われている。
Linux、Windowsなどで動作する。
オフィシャルサイト
オフィシャルサイトは↓
http://fabrice.bellard.free.fr/qemu/
日本語の情報源は↓に一杯落ちている。
http://www.h7.dion.ne.jp/~qemu-win/index-ja.html
ここには、Windows用のARMのQEMUバイナリも落ちている。
Linuxの場合、Fedoraならば
yum install qemu
で入る。
ext2のルートファイルシステム作成
ルートファイルシステムのダウンロード
arm用の最小限のルートファイルシステムは、↓に落ちている。
http://fabrice.bellard.free.fr/qemu/arm-test-0.2.tar.gz
しかし、これはinitrdから起動されることが前提でcramfsなので、
遊びにくい。
もっと遊びやすいようにext2のイメージを作ってみる
カーネルイメージのダウンロード
新しめのが、Fedora ARMに落ちていたので
これを使おう。ちょっとでかいけど。
zImageという名前で保存。
http://fedoraproject.org/wiki/Architectures/ARM/HowToQemu
http://ftp.linux.org.uk/pub/linux/arm/fedora/qemu/zImage-versatile-2.6.22
QEMUのext2イメージを作る
# qemu-img create -f raw rootfs.img 32M
# losetup /dev/loop0 rootfs.img
# cfdisk /dev/loop0 -> パーティションを作る
# losetup -o 32256 /dev/loop1 rootfs.img
# mkfs.ext2 /dev/loop1
これで、空のイメージが rootfs.imgにできた。
最小限のルートファイルシステムをコピー
先ほどのarm-testをマウント
# mount -t cramfs -o loop arm_root.img rootfs
イメージを/mntにマウント
# mount -t ext2 /dev/loop1 /mnt
コピー
# cp rootfs/* /mnt/ -r
起動テスト
Linuxの場合
qemu-system-arm -M versatilepb -kernel zImage -append root=/dev/sda1 rootfs.img
こりゃいいや。
その他
QEMUはネットワーク機能も持っているらしい。設定方法がよくわからないが、
なんだか凄そう。
クロスコンパイル環境
http://www.codesourcery.com/gnu_toolchains/arm/download.html
にバイナリがある模様。
GNU/Linux用のを落とさないといけない。
Target Platformは「ARM GNU/Linux」
Host Platformは「IA32 GNU/Linux」。
ただこれでコンパイルしたプログラムは↑のルートファイルシステムで実行できない。glibcのバージョンが違う模様。
↑のルートファイルシステムはほとんどbusyboxで作られているようで、単純だ。
なので、いっそルートファイルシステムを自分で作り直したほうが早い。
ルートファイルシステムの/libに、arm-none-linux-gnueabi/libc/lib
の内容をコピー、BusyBoxをクロスコンパイルして入れるだけ。
とりあえず動いた。BusyBoxまんせー!