ARM64(AArch64)徹底解説:ARMv8-Aの64ビットアーキテクチャと実装ガイド
ARM64とは — 概要
ARM64(一般には「ARM64」「arm64」「AArch64」などと表記される)は、ARMアーキテクチャの64ビット実装を指す用語です。正式にはARMv8-A以降で導入された64ビット状態を「AArch64」と呼び、32ビット状態は「AArch32」と呼びます。ここで扱う「ARM64」は主にAArch64(64ビット命令セットと実行環境)を指し、携帯機器からサーバ、デスクトップ(Apple Siliconなど)まで幅広く採用されています。
名称と歴史的背景
ARM Ltd. は従来からの32ビットARM(ARMv7以下、AArch32)に続き、64ビット拡張をARMv8-Aで導入しました。実装上の呼称は以下のようになります。
- AArch64:64ビット実行状態(命令セットは一般に「A64」と呼ばれる)
- AArch32:既存の32ビット実行状態(ARM/Thumb 命令セット)
- ARMv8-A:ARMのアーキテクチャ仕様で、AArch64を定義したバージョン
- arm64/ARM64:LinuxやWindowsなどで便宜的に用いられる文字列(実際の正式名称ではないが一般的)
モバイル分野(Android/iOS)での普及に加え、近年はサーバ市場(AWS Graviton、Ampere等)やPC市場(Apple M1/M2)での採用が拡大しました。
アーキテクチャの主要特徴
- 64ビット汎用レジスタ:AArch64は実行レジスタを64ビット幅で定義し、一般目的レジスタは X0–X30(計31本)+スタックポインタ(SP)+プログラムカウンタ(PC)などを持ちます。32ビットの操作を行うと上位32ビットがゼロクリアされる仕様です。
- 固定長命令:A64命令は32ビット固定長で、エンコーディングが分かりやすくデコード効率が高い設計です(AArch32のThumbのような可変長ではありません)。
- SIMD/浮動小数点:V0–V31 の128ビット SIMD/FP レジスタ(NEON相当、IEEE754浮動小数点サポート)が標準で搭載されています。
- 例外レベル(EL):EL0(ユーザ)→ EL1(OSカーネル)→ EL2(ハイパーバイザ / 仮想化)→ EL3(セキュアモニタ / TrustZone)という階層的な権限モデルを持ちます。
- メモリ空間:実装に依存しますが、典型的には48ビットの仮想アドレス空間(256TiB)が使われ、ハードウェアやアーキテクチャ拡張によりさらに大きなVAもサポートされます。
- エンディアン:ARMはリトルエンディアン/ビッグエンディアンの両方をサポートしますが、現実の実装ではリトルエンディアンが圧倒的に一般的です。
重要な命令・レジスタ・ABI(呼び出し規約)
主なレジスタ・規約(AArch64/AAPCS64):
- 汎用レジスタ:X0–X30(X30 はリンクレジスタ LR)/XZR(ゼロレジスタ)
- 引数・戻り値:整数引数は X0–X7、浮動小数点引数は V0–V7。戻り値は X0(整数)/ V0(浮動小数点)。
- スタック:16バイト境界でアラインするのが規約。多くのOSでは「レッドゾーン」は用いられません(OS依存)。
- データモデル:Unix系(Linux、macOS)は一般的に LP64(long と pointer が 64bit)を採用します。Windows on ARM は Windows の慣例に沿ったデータモデルを使用する点に注意が必要です。
メモリ管理・仮想化・例外処理
ARM64では仮想化支援、階層的な例外レベル、MMUによる多段変換(Stage 1/Stage 2)が提供され、ハードウェアレベルで効率的に仮想化を行えます。EL2はハイパーバイザ用に用意され、Stage 2 翻訳によりゲスト物理→ホスト物理の変換を制御します。メモリバリア命令(DMB/DSB/ISB)やキャッシュ管理命令群も重要で、マルチスレッドやデバイスドライバの実装で必須になります。
セキュリティ機能
ARMv8世代以降は複数のセキュリティ強化機能を備えています(実装はオプションの場合あり):
- TrustZone:セキュア/ノンセキュアの実行世界を分離し、機密処理を分離する機構。
- Pointer Authentication(PAC):ARMv8.3-Aで導入されたポインタ認証は、戻りアドレスや関数ポインタに署名を付けて改ざんを検出することでR/W攻撃を抑止します(実装依存)。
- Branch Target Identification(BTI)や Control-Flow Integrity 支援:攻撃面を狭める追加機能がアーキテクチャの新しい拡張で提供されています。
拡張命令群とベクトル機能
NEON(SIMD)はAArch64で標準サポートされ、浮動小数点演算・媒体処理の高速化に使われます。さらにSVE(Scalable Vector Extension)やSVE2などの拡張は高性能コンピューティング(HPC)やAIワークロードで採用され、ベクトル長が可変という特徴を持ちます。これらの拡張はアーキテクチャ仕様でオプション扱いになっており、搭載の有無はCPUコアの実装に依存します。
ソフトウェア・エコシステムとサポート
- 主要コンパイラ(GCC, Clang/LLVM)はAArch64をフルサポートしており、-march/-mcpu オプションでターゲットを指定します(例:-march=armv8-a)。
- 主要OSの対応:Linux(arm64)はメインラインでサポートされ、Android/iOSの64ビット版はAArch64を標準としています。Appleは自社のmacOSをM1/M2でネイティブ対応させ、Rosetta 2でx86_64翻訳を行っています。MicrosoftもWindows on ARM(ARM64)を提供しています。
- 仮想化・エミュレーション:QEMUによるエミュレーション、KVM等の仮想化支援で開発・テスト環境が整っています。x86バイナリの互換性は有限で、多くはエミュレーションかバイナリ変換が必要です。
採用事例と市場動向
- モバイル:Android端末、iPhone(厳密にはAppleがARM命令の独自実装を含む)といったスマートフォン/タブレットで圧倒的シェア。
- PC/ラップトップ:Apple Silicon(M1/M2シリーズ)によりデスクトップ市場でもARM64が注目を浴びました。
- サーバ/クラウド:AWS Graviton(Graviton2/Graviton3)、Ampere Altra、Marvell等がARM64サーバCPUを提供し、電力効率の良さからクラウド・スケール用途で採用が増えています。
- スーパーコンピューティング:富士通のA64FX(SVEを搭載)など、HPC用途にも採用例があります。
開発者・移植者が知っておくべき注意点
- ABIの違い:32ビットARMから移植する際はシステムコール番号、構造体アラインメント、long/ptrサイズの違いなどに注意してください。多くのUnix系ではLP64を採ります。
- コンパイラ最適化:ターゲットCPUに合わせて -mcpu/-mtune を設定すると性能が改善します。ベクトル命令やSVEなどアーキテクチャ拡張を使う場合は対応する命令を生成するオプションを選びます。
- エンドiannessとデバイス:組み込み機器や周辺I/Oではエンディアンの扱いに注意。一般用途ではリトルエンディアンが標準です。
- 互換性:一部のバイナリやライブラリは再コンパイルが必要になります。コンテナやマルチアーキテクチャイメージ(Dockerのmulti-arch)を活用すると移植が楽になります。
まとめ
ARM64(AArch64)は、低消費電力かつ高性能を両立する64ビットCPUアーキテクチャとして、モバイルからサーバ、デスクトップまで幅広く採用が進んでいます。設計上はレジスタ数の増加、固定長命令、強力なSIMD/FPサポート、階層的な例外レベル、仮想化・セキュリティ強化といった特徴を持ち、近年のクラウドやAI、HPC用途でも存在感を高めています。一方で移植時のABI差異や一部の拡張(SVE/PAC等)の実装依存など、開発者が留意すべきポイントもあります。実運用での導入を検討する際は、ターゲットCPUの実装詳細(どの拡張をサポートするか)と、利用するOS・ツールチェインの対応状況を確認することが重要です。
参考文献
- ARM Developer — ARMv8 Architecture
- AArch64 — Wikipedia
- Linux kernel — ARM64/Documentation
- Apple Newsroom — Apple unveils M1
- Amazon EC2 Graviton processors
- Fujitsu — A64FX and Fugaku (Fujitsu press release)
- Microsoft Docs — Windows on ARM
- GCC — GNU Compiler Collection
- LLVM / Clang


