ARMエミュレーション

ARM用の組み込みシステム開発を行うにあたり、毎回ターゲットシステムを用意して、実機で動作確認するのは大変です。そこで、QEMUを使用したARMシステムのエミュレーション環境の構築方法を紹介します。

QEMUを使用することで、x86システム上でARMやPowerPC、SHといった他のプロセッサ用のバイナリを動作させることができます。QEMUが何者なのかは、以下のサイトを参照してください。
  • http://www.nongnu.org/qemu/about.html
  • http://calamari.reverse-dns.net:980/cgi-bin/moin.cgi/QuickStartGuide
  • http://www.nongnu.org/qemu/qemu-doc.html#SEC1

QEMUでのエミュレーションには、以下の二つのモードがあります。
  • フルシステムエミュレーション: このモードでは、QEMUはプロセッサと周辺システムを含めたシステム全体をエミュレートします。このモードでは、ホストシステム上で別のOS(ゲストOS)を動作させることができます。ゲストOSは、ホストシステムと同じアーキテクチャのものでも、異なるアーキテクチャのものでも動作させることができます。
  • ユーザモードエミュレーション: このモードでは、QEMUは異なるプロセッサ用にコンパイルされたバイナリをホストシステムのプロセスとして動作させることができます。

環境

ホストPCの環境として、以下を使用しています。

- PC: Dell Inspiron Mini 12
- ディストリビューション: Ubuntu 9.04 (Jaunty) i386
- カーネル: Linux version 2.6.28-11-generic (buildd@palmer) (gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4) ) #42-Ubuntu SMP Fri Apr 17 01:57:59 UTC 2009

QEMUのインストール

以下のようにaptでインストールできます。

$ sudo apt-get install qemu

ユーザーモードエミュレーション

QEMUのユーザモードエミュレーション機能を使って、ARM用のバイナリをx86マシン上で動作させてみます。

サンプルプログラムとして、以下のものを使用します。

sample.c

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  printf("Hello World!\n");

  return EXIT_SUCCESS;
}



arm用のgccでプログラムをコンパイルし、arm用のバイナリを生成します。
$ arm-linux-gnu-gcc -Wall sample.c -o sample

qemu-armコマンドでエミュレーションします。実行にはroot権限が必要なので、sudoを介して実行します。また、オプション -L にはターゲット用のライブラリパスを指定します。
$ sudo qemu-arm -L /usr/arm-linux-gnu/ sample
Hello World!

EABIの場合は、使用するコンパイラとライブラリパスが以下のようになります。
$ arm-linux-gnueabi-gcc -Wall sample.c -o sample
$ sudo qemu-arm -L /usr/arm-linux-gnueabi/ sample
Hello World!

フルシステムエミュレーション

QEMUのフルシステムエミュレーション機能を使って、ゲストOSとしてARM用のLinux KernelとユーザランドとしてDebianをx86ホスト上で動作させてみます。

以下のサイトにQEMUで使用できるarm(OABI)用とarmel(EABI用)のDebianイメージがあります。arm用はetchとlennyが、armel用はlennyのイメージあります。

http://people.debian.org/~aurel32/qemu/

イメージの実行には、QEMU 0.9.1以上が必要となります。

上記サイトにあるイメージでは、versatileというシステムをエミュレーションします。versatileシステムの概要は以下のとおりです。(参照: QEMU Emulator User Documentation 4.5 ARM System emulator)

  • ARM926E-JS CPU
  • PL190 Vectored Interrupt Controller
  • Four PL011 UARTs
  • SMC 91c111 Ethernet adapter
  • PL110 LCD controller
  • PL050 KMI with PS/2 keyboard and mouse.
  • PCI host bridge. Note the emulated PCI bridge only provides access to PCI memory space. It does not provide access to PCI IO space. This means some devices (eg. ne2k_pci NIC) are not usable, and others (eg. rtl8139 NIC) are only usable when the guest drivers use the memory mapped control registers.
  • PCI OHCI USB controller.
  • LSI53C895A PCI SCSI Host Bus Adapter with hard disk and CD-ROM devices.
  • PL181 MultiMedia Card Interface with SD card.

また、上記イメージではDebianが以下の設定でインストールされています。
  • Keyboard:       British English
  • Language:       English
  • Mirror:         ftp.uk.debian.org
  • Hostname:       debian-armel
  • Root password:  root
  • User account:   user
  • User password:  user


イメージの取得と実行は以下の手順は以下のようになります。
$ wget http://people.debian.org/~aurel32/qemu/armel/debian_lenny_armel_small.qcow.gz
$ wget http://people.debian.org/~aurel32/qemu/armel/initrd.img-2.6.26-1-versatile
$ wget http://people.debian.org/~aurel32/qemu/armel/vmlinuz-2.6.26-1-versatile
$ gunzip debian_lenny_armel_small.qcow.gz
$ qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.26-1-versatile -initrd initrd.img-2.6.26-1-versatile -hda debian_lenny_armel_small.qcow -append "root=/dev/sda1"

ログイン

特権ユーザ(root)のパスワードはrootです。また、userというユーザ名の一般ユーザがデフォルトで用意されています。userのパスワードは、userです。

ホストとのファイル共有

ゲストOSのIPアドレスは10.0.2.10になっており、ホストOS側は10.0.2.2として見えます。このアドレスを使って、ssh、NFS、FTP、samba等でファイル共有することができます。

例として、sshを使う場合は以下のようにします。

sshによるファイル共有

(ホストOS側: 一般ユーザでログインして)
$ sudo apt-get install ssh

(ゲストOS側: rootでログインして)
# apt-get install ssh

(ゲストからホストにssh接続)
# ssh <ホストのユーザ名>@10.0.2.2

(ホストにあるファイルhoge.txtをゲストにscpでコピー)
# scp <ホストのユーザ名>@10.0.2.2:~/hoge.txt .


関連ページ


Comments