ホーム > ARM >

ARMエミュレーション

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より多くするとブートしなくなってしまう。