Posted at

QEMU でARM エミュレータ環境を作成する

More than 3 years have passed since last update.


ARM エミュレータ環境はなぜ必要なのか

RaspberryPI を始めとするBareMetal やスマートフォン等に広く搭載されているプロセッサです。Core i7 などのIntel 製プロセッサとは命令セットが異なるため、ARM プロセッサ用バイナリをPCで実行することはできません。

ちょっとしたプログラムを作成し、ARM 環境での動作確認をしたい場合でも、ターゲットとなるボードがなければ実行できないのは大変不便です。

そこでQEMU という有名なエミュレータソフトウェアを用いてお手軽にARMエミュレータ 環境を作成し、簡単なプログラムを動かす方法を解説します。環境はUbuntu を想定しています。またプログラム例はC言語となります。


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

今回の方法ではユーザーモードエミュレーションというQEMU の機能を利用します。これはARM 環境を完全にエミュレートするのではなく、PC上でARMバイナリをユーザーモードで動作させ、プロセスとして起動する、というものです。QEMU というと、仮想環境のイメージ等を用意しなkればいけないイメージですが、ユーザーモードエミュレーションは以下に示すように大変簡単に実行できます。


環境のセットアップ

ユーザーモードエミュレーションのQEMU をインストールします。

$ sudo apt-get install qemu-user-static 

次にARM 用のgcc をインストールします。

$ sudo apt-get install gcc-arm-linux-gnueabi

これで環境が整いました。


プログラムの作成とコンパイル

なんでもいいのですが、以下のような簡単なプログラムを作成します。

#include <stdio.h>

int
main(int argc, char *argv[])
{
int a = 100;

printf("Hello,World\n");
printf("a:%d, &a:%p\n",a,&a);

return 0;
}

コンパイルします。

$ arm-linux-gnueabi-gcc sample.c

readelf で出来上がったa.out がARM 向けバイナリであることを見てみます。

$ arm-linux-gnueabi-readelf -h a.out

ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x833c
Start of program headers: 52 (bytes into file)
Start of section headers: 4536 (bytes into file)
Flags: 0x5000202, has entry point, Version5 EABI, soft-float ABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 9
Size of section headers: 40 (bytes)
Number of section headers: 30
Section header string table index: 27

Machine がARM になっています。


作成したバイナリをQEMU で実行する

実行します。qemu-arm-static コマンドを使いユーザーモードエミュレーションで起動します。-L で指定しているのはARM 向けライブラリです。これは前半で説明したインストール時に同時に導入されているはずです。

$ qemu-arm-static  -L /usr/arm-linux-gnueabi a.out    

Hello,World
a:100, &a:0xf6fff44c


おわりに

QEMU ユーザーモードエミュレーションによるARM エミュレータ環境を解説しました。Ubuntu であればapt-get のみで環境が整ってしまうお手軽さが魅力です。