ARMアーキテクチャ
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ARMアーキテクチャ (Acorn RISC Machine) とは、en:ARM Ltdにより開発されている、組み込み機器や低電力アプリケーション向けに広く使われている32ビットRISC CPUのアーキテクチャのことである。
目次 |
[編集] 歴史
ARMの設計は、1983年にAcorn Computers Ltdによって開始された。その開発はモステクノロジー 6502の延長とも言えるものであり、当時6502に基づいた一連のコンピューターを製造していたAcornにとっては、同じ要領でプログラムできるチップは大きな強みになるはずであった。
開発チームは1985年までにARM1と呼ばれる開発サンプルを完成させ、最初の製品となるARM2は次の年に完成した。ARM2は32ビットのデータバス、26ビットのアドレス空間と16個の32ビットレジスタを備えていた。レジスタの1つは、上位6ビットが状態フラグを保持するプログラムカウンタである。ARM2のトランジスタ数は30000個しかなく、おそらく世界で最もシンプルな実用32ビットマイクロプロセッサであった。これは、マイクロコードを持たないこと(モトローラ 68000の場合は1/4から1/3がマイクロコードであった)と、現在のほとんどのCPUと違ってキャッシュを含まないことによるものである。このシンプルさ故に消費電力は極めて低いが、それにもかかわらず80286よりも性能は高かった。後継となるARM3は、4KBのキャッシュを含みさらに性能を高めた。
1980年代後半、アップルコンピュータはAcornと共同で新しいARMコアの開発に取り組んだ。この作業は非常に重要であったので、Acornは1990年に開発チームをスピンオフしてAdvanced RISC Machinesという新会社を設立した。このため、ARMは本来のAcorn RISC MachineではなくAdvanced RISC Machineの略であるという説明をよく見かけることになる。Advanced RISC Machinesは、1998年にロンドン証券取引所とNASDAQに上場した際、ARM Limitedとなった。
この作業の結果、ARM6が開発された。1991年に最初のモデルがリリースされ、アップルはARM6ベースのARM610をアップル・ニュートンに使用した。
これらの変化を経てもコアは大体同じサイズに収まっている。ARM2は30000個のトランジスタを使用していたが、ARM6は35000個にしか増えていない。そこにあるアイデアは、エンドユーザーがARMコアと多くのオプションのパーツを組み合わせて完全なCPUとし、それによって古い設備でも製造でき、かつ安価に高性能を得られる、というものである。
最も成功した実装は、何億台もの携帯電話やゲームボーイアドバンスに搭載されたARM7TDMIであろう。ARMのビジネスは通常IP(知的財産)コアの売上によるものであり、そのライセンスを得てこのコアに基づいたマイクロコントローラが製造されている。
DECは設計のライセンスを得てStrongARMを製造した。233MHzでStrongARMはほんの1Wの電力しか消費しない(最近のバージョンはさらに少ない)。この業績は後に訴訟の解決の一環としてインテルに移管され、インテルはこの機会を利用して古くなりつつあったi960をStrongARMで補強することにし、それ以降XScaleという名で知られる高性能の実装を開発した。
モトローラ、IBM、テキサス・インスツルメンツ、任天堂、フィリップス、Atmel、シャープ、サムスン電子、STマイクロエレクトロニクス、アナログ・デバイセズ、松下電器産業などの会社もARMデザインのライセンス供与を受けている。ARMチップは世界で最もよく使われているCPUデザインの一つとなっており、ハードディスク、携帯電話、ルータ、電卓から玩具に至るまであらゆる製品の中に見ることができる。現在では32ビット組み込みCPUの75%以上を占めている。
[編集] ARMアーキテクチャのCPUを採用した主な製品
[編集] ARM7
- eMate 300
- 一般的なGSM携帯電話
- ゲームボーイアドバンス
- ニンテンドーDS Lite(サブCPU、GBAソフトの動作にも使われる)
- iPodシリーズ(デュアルコア実装)
[編集] ARM9
- ニンテンドーDS Lite(メインCPU、ARM7とのダブル実装)
- Handheld Engine (SONY CLIEに搭載)
- Nokia N-Gage
[編集] コアの性能と採用実績
ファミリー | アーキテクチャ | コア | 特徴 | キャッシュ (I/D)/MMU | 性能 MIPS @ MHz | 採用製品 |
---|---|---|---|---|---|---|
ARM7TDMI | v4T | ARM7TDMI(-S) | 3ステージ パイプライン | 無し | 15 MIPS @ 16.8 MHz | ゲームボーイアドバンス, ニンテンドーDS, iPod |
ARM710T | MMU | 36 MIPS @ 40 MHz | Psion 5 series, アップル・ニュートン | |||
ARM720T | 8KB 統合キャッシュ, MMU | 60 MIPS @ 59.8 MHz | ||||
ARM740T | MPU | |||||
v5TEJ | ARM7EJ-S | Jazelle DBX | none | |||
ARM9TDMI | v4T | ARM9TDMI | 5ステージ パイプライン | none | ||
ARM920T | 16KB/16KB, MMU | 200 MIPS @ 180 MHz | Armadillo, en:GP32,en:GP2X (マスタ), en:Tapwave Zodiac (Motorola i. MX1) | |||
ARM922T | 8KB/8KB, MMU | |||||
ARM940T | 4KB/4KB, MPU | en:GP2X (スレーブ) | ||||
ARM9E | v5TE | ARM946E-S | variable, tightly coupled memories(TCM), MPU | ニンテンドーDS, ノキア N-Gage, Conexant 802.11 chips | ||
ARM966E-S | キャッシュレス, TCMs |
ST Micro STR91xF, Ethernet内蔵 [1] |
||||
ARM968E-S | キャッシュレス, TCMs | |||||
v5TEJ | ARM926EJ-S | Jazelle DBX | variable, TCMs, MMU | 220 MIPS @ 200 MHz | Mobile phones: ソニー・エリクソン・モバイルコミュニケーションズ (K, W シリーズ),シーメンス and Benq (x65 シリーズ以降) | |
v5TE | ARM996HS | Clockless processor | キャッシュレス, TCMs, MPU | |||
ARM10E | v5TE | ARM1020E | (VFP) | 32KB/32KB, MMU | ||
ARM1022E | (VFP) | 16KB/16KB, MMU | ||||
v5TEJ | ARM1026EJ-S | Jazelle DBX | variable, MMU or MPU | |||
ARM11 | v6 | ARM1136J(F)-S | SIMD, Jazelle DBX, (VFP) | variable, MMU | ?? @ 532-665MHz (i.MX31 SoC) | Omap2 ノキア N93(?) |
v6T2 | ARM1156T2(F)-S | SIMD, Thumb-2, (VFP) | variable, MPU | |||
v6KZ | ARM1176JZ(F)-S | SIMD, Jazelle DBX, (VFP) | variable, MMU+TrustZone | |||
v6K | ARM11 MPCore | 1-4 core SMP, SIMD, Jazelle DBX, (VFP) | variable, MMU | |||
Cortex | v7-A | Cortex-A8 | Application profile, NEON, Jazelle RCT, Thumb-2 | variable (L1+L2), MMU+TrustZone | up to 2000 (2.0 DMIPS/MHz in speed from 600 MHz to greater than 1 GHz) | テキサス・インスツルメンツ OMAP3 |
v7-R | Cortex-R4(F) | Embedded profile | variable cache, MMU optional | 600 DMIPS | Broadcomが採用 | |
v7-M | Cortex-M3 | Microcontroller profile | no cache, (MPU) | 120 DMIPS @ 100MHz | en:Luminary Micro[2] microcontroller family | |
XScale | v5TE | 80200/IOP310/IOP315 | I/O Processor | |||
80219 | ||||||
IOP321 | en:Iyonix | |||||
IOP33x | ||||||
PXA210/PXA250 | Applications processor | ザウルス SL-5600 | ||||
PXA255 | 32KB/32KB, MMU | 400 BogoMips @400 MHz | en:Gumstix | |||
PXA26x | ||||||
PXA27x | 800 MIPS @ 624 MHz | HTC Universal, ザウルス SL-C1000,3000,3100,3200 | ||||
PXA800(E)F | ||||||
Monahans | 1000 MIPS @ 1.25 GHz | |||||
PXA900 | Blackberry 8700, Blackberry Pearl (8100) | |||||
IXC1100 | Control Plane Processor | |||||
IXP2400/IXP2800 | ||||||
IXP2850 | ||||||
IXP2325/IXP2350 | ||||||
IXP42x | en:NSLU2 | |||||
IXP460/IXP465 |
- en:ARM architecture 2006-10-21 20:34 UTCより翻訳。
[編集] 設計について
ARMのインストラクション・セットは6502のコンセプトに沿っているが、パイプライン処理をより効率的に行うための機能が多く含まれている。その一つとして、伝統的なRISCのコンセプトに則り、明確な周期内に、概して1サイクルで実行できるようコマンドを調整している。ARMデザインの興味深い追加機能の一つが、全てのコマンドの先頭にある4ビットの条件コードの使用であり、全てのインストラクションを条件付きにすることができる。
これにより、例えばメモリアクセス用インストラクションの変位量などのスペースが大幅に削られてしまうが、一方では小さなif文に対応するコードの生成時に分岐命令を避けることが可能になる。この標準的な例として、ユークリッドの互除法を挙げる。
(この例はC言語による)
int gcd(int i, int j) { while (i != j) { if (i > j) i -= j; else j -= i; } return i; }
ARMのアセンブリ言語では、whileループの部分は以下のようになる。
b test /* testへジャンプ */ loop subgt Ri,Ri,Rj /* > の場合 Ri = Ri - Rj */ suble Rj,Rj,Ri /* <= の場合 Rj = Rj - Ri */ test cmp Ri,Rj /* RiとRjを比較*/ bne loop /* != の場合 loopへジャンプ */
通常分岐を使用しなければならないthenやelse節のところで分岐が省かれていることが分かる。
インストラクション・セットのもう一つのユニークな機能が、シフト演算を「データ処理」(算術演算、論理演算、レジスタ間の代入)インストラクションの中に織り込むことができることである。例えば、C言語の"a += (j << 2);"のような文を1つのARMインストラクションとして表すことができる。
これにより、多くのARMプログラムは通常RISCプロセッサに期待されるようなプログラムよりも密度の高いものになる。このことは、ロード・ストア命令の必要性が低くなり、パイプライン処理をより効率的に使うことができるということを意味する。ARMは多くの場合低いスピードと考えられるような速度で動作するが、にもかかわらずずっと複雑なCPUデザインと十分に競合する。
ARMプロセッサは、PC相対アドレッシングやプレ-/ポスト-インクリメント・アドレッシングモードなど、RISCとみなされる他のアーキテクチャにはほとんど見られない機能も持っている。
もう一つ留意すべきことは、ARMのインストラクション・セットが時間とともに増加しているということである。例えば、初期のARMプロセッサ(ARM7TDMIより以前のもの)は2バイトの値をロードするインストラクションがなく、厳密にはC言語の"volatile short"に期待されるような動作を行うコードを生成するのは不可能であった。
[編集] ARMの拡張機能
[編集] Thumb
全てのインストラクションの4ビットを条件実行が占めていることもあってか、最近のARMプロセッサはThumbと呼ばれる16ビットのインストラクション・モードも持っている。これは小さなコードを可能にすることを意図したものである。これによってコードの密度が上がるだけでなく、メモリポートやバスが32ビットよりも狭い状況において、32ビットコードよりも実際に性能が高くなる。多くの場合、組み込みアプリケーションでは32ビットのデータパスを持っているのは一部のアドレス範囲のみであり(例: ゲームボーイアドバンス)、残りは16ビットかそれよりも狭くなっている。このような状況では、Thumbコードをコンパイルし、CPUに最も負荷のかかる部分だけを32ビットのインストラクション・セットを使用して手作業で最適化するのが、通常は理にかなっている。
Thumbテクノロジを搭載した最初のプロセッサはARM7TDMIである。ARM9とそれ以降のファミリは、XScaleも含めて全てThumbテクノロジを搭載している。
[編集] Jazelle
ARMは、Javaバイトコードをハードウェアでネイティブに実行できる技術を実装した。これはARMやThumbモードと並ぶもう一つの実行モードであり、ARM/Thumbの切り替えと同様にしてアクセスすることができる。
Jazelleテクノロジを搭載した最初のプロセッサはARM926EJ-Sである。CPU名の'J'がJazelleを表している。
[編集] Thumb-2
Thumb-2テクノロジは2003年に発表されたARM1156コアで登場した。Thumb-2はThumbの制限された16ビットのインストラクション・セットを追加の32ビットのインストラクションで拡張し、インストラクション・セットの幅を広げるものである。公称されているThumb-2の目的は、Thumbと同様のコード密度と32ビットメモリ上でのARMインストラクション・セットと同様の性能を得ることであり、Thumb-2はビットフィールド操作、テーブル分岐や条件付き実行などを含んでいる。