目次


Linux に GNU ARM ツールチェーンをインストールする

よく使われるプロセッサーのための組み込みシステム開発ツール

Comments

幅広く使用されているマイクロプロセッサー上で組み込みシステムを開発することに関心がある人には、ARM (Advanced RISC Machines) コアが最適です。この記事では、組み込みシステムの開発におけるソフトウェアの側面を理解するための出発点として、よく使われるツール・セットの 1 つである、GNU ARM ツールチェーンについて説明します。

ARM ファミリー

組み込みシステムの開発者にとって最大の関心事は、どうすれば最小の消費電力で最大の処理能力を引き出せるか、という点です。ARM プロセッサー・ファミリーは他のプロセッサーに比べ、プロセッサーの処理能力とバッテリー消費電力のバランスを取るための適切な設計がなされています。

ARM コアは、この 20 年間、いくつかのバージョンを経ながら技術進歩を遂げてきました。T-Mobile G1 Android などの携帯電話に搭載されている最近の SoC (System on a Chip) プロセッサーは、デュアルコア (ARM9 と ARM11) プロセッサーを組み合わせることで、低消費電力プラットフォームで実行されるマルチメディア・アプリケーションのパフォーマンスを高めています。

最近の ARM コアは、2 つの動作状態 (32 ビットのワード命令をコアが実行する ARM ステートと、16 ビットのハーフワード命令を実行する THUMB ステート) をサポートしています。ARM モードでは、プロセッサーの持つ処理能力とアドレッシング機能を最大限に発揮することができます。一方 THUMB モードでは、極めて厳重にメモリーを節約する方法でプログラムの各部分を作成できるため、メモリーのコストを低く押さえることができます。この 2 つのモードの間の切り換えは簡単であり、さまざまなアルゴリズムにおいて、必要なコードのサイズを大幅に削減することができます。

ARM プロセッサーは、ハーバード・アーキテクチャーを変形したアーキテクチャーを利用することでパフォーマンスを改善しています。このアーキテクチャーでは、プロセッサーはデータ・キャッシュと命令キャッシュとを別々に使用しますが、両方のキャッシュが同じバスを利用して外部メモリーにアクセスします。また、命令は 5 段階の「パイプライン」に入れられ、パイプラインにロードされた最新の 5 つの命令に対して並列に処理が行われます。つまり、命令に関係する 5 つの別々なアクション (フェッチ、デコード、ALU、メモリー、書き込み) が、それぞれ並列に実行されます。パイプラインがスムーズに流れている限り、並列処理のおかげでコードは高速に処理されますが、一旦パイプラインにないコードへの分岐が発生すると、パイプライン全体をリセットする必要があり、その結果パフォーマンスが低下します。このことから、分岐が発生する機会が最小になるように、コードを注意深く設計する必要があります。

この ARM アーキテクチャーが提供する独特の機能では、システム・フラグの現在の状態に基づいてすべての命令を自由に選択して実行することができ、プログラマーはこの新しい独特の方法で考えることになります。この機能を活用すると、一部のアルゴリズムでは分岐の必要がなくなるため、命令キャッシュやデータ・キャッシュを利用するためのパイプライン・ベースのメカニズムを最高のパフォーマンスで持続的に実行させることができます (分岐が発生すると、キャッシュの強制クリアーが余計に発生する可能性があります)。

GNU ARM ツールチェーン

ARM システムのプログラミングは多くの場合、ARM を搭載していないワークステーション上で、ARM プラットフォームをターゲットとしてクロス・コンパイルするツールを使って行われます。GNU ARM ツールチェーンは、そうしたプログラミング環境の 1 つです。GNU ARM ツールチェーンを利用すると、皆さんの好みのワークステーション環境とツールを使用した ARM シミュレーターで、設計、開発、さらにはテストまで行うことができます。

この記事で説明する GNU ツールチェーン (Sourcery G++ Lite とも呼ばれます) は CodeSourcery (リンクは「参考文献」を参照) にホストされており、無料でダウンロードして使用することができます。GNU C ライブラリー以外のすべてのツールは標準的な GPL3 (GNU Public License バージョン 3) でライセンスされており、また GNU C ライブラリーは GPL バージョン 2.1 でライセンスされています。GNU ツールチェーンに含まれるものとしては、binutils (バイナリー・ユーティリティー)、GCC (GNU Compiler Collection)、GDB (GNU Compiler Collection)、GNU make、そして GNU コア・ユーティリティーなどがあります。

また、Sourcery G++ Lite パッケージには、GNU Coding Standards (GNU コーディング規約) 文書など、GNU ツールチェーンに関する充実したドキュメントも含まれています (つまり、ありとあらゆる優れたドキュメントがあります)。GNU アセンブラー (as) に関するドキュメントを見ると、ARM 特有の情報 (オペコード、構文、ディレクティブ、など) がたくさんあることがわかります。

GNU ツールチェーンのダウンロードとインストール

GNU ツールチェーンをダウンロードするためには、CodeSourcery のダウンロード・サイト (「参考文献」を参照) を訪れ、下記のように IA32 GNU/Linux TAR ファイルを選択します。

arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

GNU ツールチェーンには、すべての主要クライアント・オペレーティング・システム用にさまざまなバージョンがありますが、この記事では Linux® 用の Lite バージョンのツールチェーンのインストール方法と使用方法に焦点を絞って説明します。

ARM の設計は歴史的に、さまざまなバージョンを経て進歩してきています。そのため Lite パッケージの中には、プロセッサーの設計として最も一般的な 3 つのバージョン (ARM v4T、ARM v5T、ARM 7) 用に別々の C ライブラリーが含まれています。

次に、bunzip2 コマンドを使って、この TAR ファイルをホーム・ディレクトリーの中に解凍します。

リスト 1. ダウンロードされた GNU ツールチェーンを解凍する
$ bunzip2 arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ tar -xvf arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar
  .
  .
  .
  (Files listed while being extracted from the archive.)
  .
  .
  .
$

そして PATH 環境変数を変更してツールチェーンの bin ディレクトリーにアクセスできるようにすると、このツールチェーンを利用する準備は完了です。

GNU ツールチェーンを使用できるように Linux を構成する

ツールチェーンのダウンロードのページには、いくつかの有用な PDF ファイル、そして詳細な Getting Started (入門) ガイドもあり、このツールチェーンに含まれているツールが解説されています。この記事で説明する内容は、ツールチェーンをすぐに使えるようになるための凝縮版です。

Intel® プロセッサーのプログラミングよりも ARM のプログラミングを行うことが多い人の場合には、別の方法として、ツールチェーンの bin ディレクトリーのツールを参照するシンボリック・リンクを /usr/local/bin ディレクトリーに追加する方法もあります。そうすれば、as のようなショートカットを使って対話型で arm-none-linux-gnueabi-as コマンドを実行することができます。リスト 2 は、こうしたシンボリック・リンクの設定方法を示しています。

リスト 2. ARM ツールにシンボリック・リンクを設定する
# cd /usr/local/bin
# which arm-none-linux-gnueabi-as
/home/bzimmerly/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-as
# ln -s /home/bzimmerly/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-as as
# ls -l as
lrwxrwxrwx 1 bzimmerly bzimmerly 76 2009-03-13 02:48 as -> /home/bzimmerly
/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-as
# ./as --version
GNU assembler (Sourcery G++ Lite 2008q1-126) 2.18.50.20080215
Copyright 2007 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `arm-none-linux-gnueabi'.
#

which コマンドを使ってコマンドのフル・パス名を見つけると、そのコマンドを ln コマンドの中に容易にコピー・アンド・ペーストすることができます。次に、ln -s コマンドを使ってシンボリック・リンクを作成します。その後、そのリンクが適切に作成できたかどうかを確認するために、そのリンクを表示し、そしてそのリンクを実行しています。GNU ツールチェーンの bin ディレクトリーの中にあるすべてのツールに対して単純なシンボリック・リンクを作成すると、長い名前を入力する必要がなくなります。実際、アセンブラーを実行するたびに arm-none-linux-gnueabi-as と入力するよりも as と入力した方が簡単です。

ARM アーキテクチャー用にプログラムを作成する

おなじみの C プログラミング言語で ARM プログラムを作成するためのガイドはたくさんありますが、純粋にアセンブラー用に書かれたガイドは、ほとんどありません。この記事では伝統を破り、純粋にアセンブラーでサンプル・プログラムを作成します。純粋なアセンブラーでのプログラミングは通常、プログラミングの世界では「魔術」と考えられています。このサンプル・プログラムは、ARM Linux というユニークなバージョンをターゲットにした単純な「Hello World」タイプのプログラムです。

この記事で説明するサンプル・プログラムは Android Linux を実行する T-Mobile G1 携帯電話上で実行するように設計されています。またこのサンプル・プログラムは汎用的に作成されているため、ARM ベースの他の Linux プラットフォームでも実行できるはずです (標準的なシステム・コールしか行っていません)。ただし Linux カーネルには、最低限バージョン 2.6.16 を使用する必要があります。このバージョンを使用すると、新しい EABI (Embedded Application Binary Interface) カーネル・システム・コールを利用することができます。

注意: Linux を使わずにベアメタルの ARM プログラミングを行うための適切な参考記事として、「参考文献」に挙げた Embedded.com の記事へのリンクを参照してください。

皆さんの好みのエディターとリスト 3 のコードを使用して、build というスクリプトを作成します。このスクリプトによって GNU ARM アセンブラーを実行し、次にリンカーを実行します。このプログラムを作成する上での目標は、非常に小さな実行可能プログラムとして作成することです。そのため、ここではデバッグ情報をすべて、リンカーのスイッチ --strip-all を使って削除しました。このスクリプトを作成できたら、chmod +x build コマンドを発行して実行可能プログラムにします。

リスト 3. ARM Linux 用の Hello World アプリケーションをビルドする
#!/bin/bash
echo Building the ARM Linux Hello World...
arm-none-linux-gnueabi-as -alh -o hw.o hw.S > hw.lst
arm-none-linux-gnueabi-ld --strip-all -o hw hw.o

これが終わったら、hw.S というソース・モジュールを作成し、その中にリスト 4 のコードを入れます。

リスト 4. ARM Linux 用の Hello World
@filename: hw.S

.text
.align 2
.global _start

@ ssize_t sys_write(unsigned int fd, const char * buf, size_t count)
@         r7                 r0      r1                r2

_start:
    adr     r1, msg         @ Address
    mov     r0, #1          @ STDOUT
    mov     r2, #16         @ Length
    mov     r7, #4          @ sys_write
    svc     0x00000000

@ int sys_exit(int status)
@     r7       r0

    mov     r0, #0          @ Return code
    mov     r7, #1          @ sys_exit
    svc     0x00000000

.align 2

msg:
    .asciz "Hello Android!\n\n"

GNU アセンブラーでは @ 記号を使って行コメントを指定します。アセンブラーは @ 記号の後から行の終わりまでのすべてを無視します。

このプログラムは Linux の標準的なシステム・コールを 2 つ使っています (sys_writesys_exit)。この 2 つのシステム・コールそれぞれのアセンブラー・コードの上の行に、対応する C 言語のコードがコメントの形で書かれています。これを見ると、システム・コールで使用される呼び出しパラメーターに ARM レジスターが適切にマッピングされている様子がわかると思います。システム・コールで使用されるパラメーターは左から右に、r0 から r6 の順に進む、という規則を覚えておく必要があります。レジスター r7 には、使用されているシステム・コールの番号が格納されます。この点で、r7 は特別です。

svc 0x00000000 という命令は ARM プロセッサーに対して、「スーパーバイザー」(この場合は Linux カーネル) を呼び出すように指示しています。

ARM プログラムのテスト

このツールチェーンには、下位レベルのプログラムのデバッグ用に、おなじみの GDB が用意されています。このプログラムのターゲットが、JTAG ユニットまたは ICE ユニットが接続されたシングル・ボード・コンピューターの場合には、Sourcery G++ Lite のデバッガー (gdb) を使って ARM コードをリモートでデバッグすることができます。

私が行った方法と同じ方法でコードをテストしたい場合には (つまり携帯電話上の Android Linux システム上でテストしたい場合には)、その携帯電話を携帯電話に付属の USB ケーブルを使ってワークステーションに接続し、Android SDK (Software Development Kit) の adb push コマンドを使ってプログラムを携帯電話に転送する必要があります。プログラムが携帯電話の中に転送されたら、実行可能プログラムのコードを含むディレクトリー (/data/local/bin) の中で chmod 555 hw コマンドを発行し、プログラムを実行可能にします (Android の chmod コマンドは +x を使用しないため、代わりに 555 が必要になります)。

最後に、adb shell コマンドを使って携帯電話に接続し、cd コマンドで適切なディレクトリーに移動したところで、./hw と入力してプログラムを実行します。すべてが想定どおりに動作すれば、プログラムは私の携帯電話で実行した場合と同じように応答し、「Hello Android!」というメッセージが表示されるはずです。

まとめ

この短い記事を読んで ARM でのアセンブラー・プログラミングに興味が湧いたら、「参考文献」に挙げたリンクを参考に、このプロセッサーによる設計をさらに詳しく学んでみてください。ARM コアに関して詳細に学ぶために最適なリソースは、ARM 開発のバイブルでもある、ARM ARM (ARM Architecture Reference Manual) です。

キャリア志向の人は、次のことを考えてみてください。現在、世界には十億台を超える携帯電話があり、さらに毎年新しい携帯電話が製造されています。最先端の技術によって、完全なネットワーク機能によりインターネットに接続して瞬時に情報を取得したり、インターネットで楽しんだりすることができる、何ギガバイトものストレージを搭載したデュアルコア・プロセッサー・マシンを、実際にポケットに入れて持ち運べるようになっています。携帯電話メーカーは有能なプログラマーを強く求めています。このように ARM が一般的に使われる中で、なすべきことはたくさんあり、それらは仕事としても楽しいものです。いつものことですが、さまざまツールを試し、楽しんでみてください。プログラミングは、芸術でもあり、科学でもあり、そして技術を売りにした職業のなかで最も楽しい職業の 1 つでもあります。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=424275
ArticleTitle=Linux に GNU ARM ツールチェーンをインストールする
publish-date=05202009