QEMUを使ってみる

組込みボードが無くとも組込みで遊べる方法は無いものかと考えていたが、
QEMUというものがあることを思い出す。
組込み向けCPUアーキテクチャARMのエミュレータの機能も持っており、AndroidSDKにも使われている。
LinuxWindowsなどで動作する。

オフィシャルサイト

オフィシャルサイトは↓
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

QEMUext2イメージを作る

# 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

にて起動!
WindowsQEMUでもOK!

こりゃいいや。

その他

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まんせー!

カーネルコンパイル

自力でカーネルコンパイルを試みた。
最新の2.6.25をコンパイルしてみた。
arch/arm/configs/versatile_defconfig
を使う。
Enable ARM EABI Support ( Kernel Featuresのところ)
を有効にする以外にハマリが。

CONFIG_PCIを有効にし、
SCSI LOW level driversの
CONFIG_SCSI_SYM53C8XX_2
を有効にしないと、イメージを認識しない。
これを有効にしたらOK。