ARMエミュレーション
- QEMUのインストール
- イメージファイルの作成とマウント方法
- Linuxカーネルのソースを入手
- vexpress-a9(ARM Versatile Express for Cortex-A9)用カーネルのコンパイル
- realview-pbx-a9(ARM RealView Platform Baseboard Explore for Cortex-A9)用カーネルのコンパイル
- QEMUの起動
QEMUのインストール
wget http://wiki.qemu.org/download/qemu-1.0.tar.gz
tar zxf qemu-1.0.tar.gz
mkdir build_qemu-1.0
cd build_qemu-1.0
../qemu-1.0/configure --prefix=/usr/local --target-list=arm-softmmu
make -j4
sudo make install
イメージファイルの作成とマウント方法
rawフォーマットを使用する場合
- rawフォーマットで空のイメージファイルを作成
qemu-img create -f raw qemu-arm.img 20G
- イメージファイル内にパーティションを作成
/sbin/fdisk qemu-arm.img
- イメージファイル内のパーティションの初期化とマウント方法
まず初めに、使用可能なループバックデバイスを確認する。
sudo /sbin/losetup -f
このコマンドで表示されたデバイスの名前が/dev/loop0だったとする。 次のコマンドを実行すると、/dev/mapper/loop0p1という名前のデバイスファイルが作成される。 これが、先程作成したイメージファイル内のパーティションに対応するデバイスとなっている。
sudo /sbin/losetup /dev/loop0 qemu-arm.img
sudo /sbin/kpartx -a /dev/loop0
パーティション内にファイルシステムを作成する。
sudo /sbin/mkfs.ext3 /dev/mapper/loop0p1
マウントポイント/mnt/qemu_imageに作成したパーティションをマウントする。
sudo mkdir /mnt/qemu_image
sudo mount /dev/mapper/loop0p1 /mnt/qemu_image
- イメージファイル内のパーティションのアンマウント方法
使用していたループバックデバイスが/dev/loop0で、マウントポイントが/mnt/qemu_imageの場合、以下のコマンドでアンマウントする。
sudo umount /mnt/qemu_image
sudo /sbin/kpartx -d /dev/loop0
sudo /sbin/losetup -d /dev/loop0
qcow2フォーマットを使用する場合
- qcow2フォーマットで空のイメージファイルを作成
qemu-img create -f qcow2 qemu-arm.qcow2 20G
- qemu-nbdコマンドでブロックデバイスファイルを作成
sudo qemu-nbd --connect=/dev/nbd0 `pwd`/qemu-arm.qcow2
- パーティションの作成
sudo /sbin/fdisk /dev/nbd0
- kpartxコマンドで作成したパーティションに対応するデバイスを作成
sudo /sbin/kpartx -a /dev/nbd0
- パーティション内にファイルシステムを作成
sudo /sbin/mkfs.ext3 /dev/mapper/nbd0p1
nbd(Network block device)を介しているためか、かなり時間がかかる模様。
- パーティションのマウント
sudo mkdir /mnt/qemu_image
sudo mount /dev/mapper/nbd0p1 /mnt/qemu_image
- パーティションのアンマウント
sudo umount /mnt/qemu_image
sudo /sbin/kpartx -d /dev/nbd0
sudo qemu-nbd --disconnect /dev/nbd0
Linuxカーネルのソースを入手
最新の安定版カーネルは以下のgitリポジトリから入手できる。
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git kernel
念のため、タグを元にブランチを作成しておく。
cd kernel
git checkout -b work_3.2.5 v3.2.5
vexpress-a9(ARM Versatile Express for Cortex-A9)用カーネルのコンパイル
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make -j4 zImage
realview-pbx-a9(ARM RealView Platform Baseboard Explore for Cortex-A9)用カーネルのコンパイル
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make realview-smp_defconfig
make menuconfig
make -j4 zImage
menuconfigでは、以下の項目の設定を行う。
System Type ---> RealView platform type ---> Support RealView(R) Emulation Baseboard のチェックを外す Support ARM11MPCore Tile のチェックを外す Support RealView(R) Platform Baseboard Explore をチェックする High physical base address for the RealView platform のチェックを外す Support ARM V6K processor のチェックを外す Support ARM V7 processor をチェックする File systems ---> Ext3 journaling file system support にチェックを入れる
QEMUの起動
起動スクリプトの例
#!/bin/bash
MACHINE=vexpress-a9
# MACHINE=realview-pbx-a9
CPU=cortex-a9
MEMORY=256M
DISK=qemu-arm.img
KERNEL=/path/to/kernel/arch/arm/boot/zImage
BOOTARG="mem=${MEMORY} console=tty0 console=ttyAMA0,115200n8 root=/dev/mmcblk0p1 rw init=/sbin/init"
qemu-system-arm \
-M ${MACHINE} \
-cpu ${CPU} \
-m ${MEMORY} \
-kernel ${KERNEL} \
-sd ${DISK} \
-serial stdio \
-append "${BOOTARG}"
ターゲットをrealview-pbx-a9にしてメモリ量を256Mより多くするとブートしなくなってしまう。