はじめに
パソコンやスマートフォンについて調べていると、次のような言葉を見かける。
- ARM
- ARM64
- AArch64
- x86
- x86-64
- AMD64
- RISC
- CISC
- Apple Silicon
- Snapdragon
これらはすべて同じ種類の名前ではない。
CPU製品の名前、CPUを設計する会社の名前、CPUが理解する命令体系の名前などが混在しているため、初めて見ると分かりにくい。
結論から言えば、ARMとは主にCPUの命令セットアーキテクチャの一種である。
また、その技術を開発し、企業へライセンス提供している会社もArmという名前である。
この記事では、ARMが何を意味するのかを、x86との違い、RISCとCISC、Linuxやソフトウェアとの関係も含めて整理する。
CPUとは何か
CPUは、コンピュータの中でプログラムの命令を実行する部品である。
正式名称は次のとおり。
Central Processing Unit
中央処理装置
CPUは、非常に単純化すると次の処理を繰り返している。
- メモリから命令を読み込む
- 命令の意味を解釈する
- 計算やデータ移動を実行する
- 次の命令を読み込む
CPUが実行する処理には、次のようなものがある。
- 数値を足す
- 数値を引く
- 数値を比較する
- メモリからデータを読み込む
- メモリへデータを書き込む
- 条件によって処理を分岐する
- 関数を呼び出す
- OSへ処理を依頼する
ブラウザ、ゲーム、Linux、Windowsなども、最終的にはCPUが理解できる命令として実行されている。
ARMとは何か
ARMは、CPUがどのような命令を理解し、どのように動作するかを定めた体系である。
より正確には、命令セットアーキテクチャと呼ばれる。
英語では次のように書く。
Instruction Set Architecture
略称はISAである。
ISAでは、例えば次のような事項が定められる。
- CPUが利用できる命令
- レジスタの種類と数
- 数値の表現方法
- メモリの指定方法
- 関数呼び出しの基本方式
- 例外や割り込みの処理方法
- 32ビットと64ビットの動作
- CPUからソフトウェアに見える基本仕様
つまりISAは、CPUとソフトウェアの間にある約束事である。
ARMとx86では、この約束事が異なる。そのため、ARM向けに作られた機械語と、x86向けに作られた機械語は同じではない。
ARMという名前は会社も指す
ARMという名前は、命令セットだけでなく、それを開発するArm社も指す。
IntelやAMDは、自社でCPUを設計し、Intel CoreやAMD Ryzenなどの製品として販売している。
一方、Arm社は主に次のものを他社へ提供する。
- ARM命令セットを利用する権利
- CPUコアの設計
- GPUの設計
- 周辺回路の設計
- 開発用ソフトウェア
- セキュリティ関連技術
Arm社の技術を利用して、複数の企業が独自のCPUやSoCを作っている。
代表例は次のとおり。
- AppleのAシリーズ
- AppleのMシリーズ
- QualcommのSnapdragon
- MediaTekのDimensity
- SamsungのExynos
- AWSのGraviton
- Raspberry Piに搭載されるBroadcom製SoC
したがって、ARM系CPUは一つの会社が作る一種類のCPUではない。
命令セットとは何か
人間が書いたC言語、Rust、Goなどのソースコードを、CPUはそのまま理解できない。
例えばC言語で次のコードを書く。
int answer = 40 + 2;
このコードは、コンパイラによって対象CPUが理解できる機械語へ変換される。
同じソースコードでも、対象となるCPUによって生成される機械語が変わる。
同じソースコード
├─ x86-64向けにコンパイル → x86-64用の機械語
└─ ARM64向けにコンパイル → ARM64用の機械語
このため、x86-64向けの実行ファイルは、ARM64 CPUでは原則として直接実行できない。
逆に、ARM64向けの実行ファイルも、x86-64 CPUでは直接実行できない。
ARMとx86の違い
現在のパソコンやスマートフォンでは、主に次のCPUアーキテクチャが使われている。
- x86-64
- ARM64
- RISC-V
一般的なIntel・AMD搭載PCでは、x86-64が使われる。
スマートフォンやタブレットでは、ARM64が広く使われている。
x86
x86は、Intelが開発したCPUを起源とする命令セットアーキテクチャである。
名前は、初期のCPU製品である8086、80186、80286、80386、80486などの末尾に「86」が付いていたことに由来する。
x86-64
x86-64は、従来のx86を64ビットへ拡張したものだ。
次の名称は、基本的に同じ系統を指す。
- x86-64
- x86_64
- AMD64
- amd64
- Intel 64
x86の64ビット拡張を実用化したのはAMDである。そのため、LinuxやDockerではIntel製CPUを使っていても、アーキテクチャ名としてamd64と表示されることがある。
ARM64
ARMにも32ビット版と64ビット版がある。
64ビットARMは、主に次の名前で呼ばれる。
- ARM64
- AArch64
- arm64
- aarch64
Linuxでuname -mを実行してaarch64と表示された場合、その環境は64ビットARMである。
Ryzen 7 5700XはARMではない
AMD Ryzen 7 5700Xは、x86-64アーキテクチャのCPUである。ARMではない。
Linuxでは、次のコマンドで確認できる。
uname -m
Ryzen 7 5700Xを搭載した環境では、通常は次のように表示される。
x86_64
より詳しい情報は、次のコマンドで確認できる。
lscpu
重要な部分だけ確認するなら、次のコマンドを使える。
lscpu | grep -E 'Architecture|Vendor ID|Model name'
32ビットと64ビット
ARMとx86には、32ビット版と64ビット版が存在する。
ビット数は、CPUが扱うデータの幅や、利用できるアドレス空間などに関係する。
| 表記 | 意味 |
|---|---|
i386 | 32ビットx86系 |
i686 | 32ビットx86系 |
x86_64 | 64ビットx86 |
amd64 | 64ビットx86 |
armv7l | 主に32ビットARM |
arm64 | 64ビットARM |
aarch64 | 64ビットARM |
ARMはなぜスマートフォンで使われるのか
ARM系CPUは、長い間スマートフォンや組み込み機器で広く使われてきた。
スマートフォンでは、次の条件が重要になる。
- バッテリーを長持ちさせる
- 発熱を抑える
- 小さな筐体に収める
- 待機中の電力消費を抑える
- CPU以外の機能も一つのチップへまとめる
デスクトップPCなら大型のヒートシンクや冷却ファンを搭載できるが、スマートフォンでは冷却能力もバッテリー容量も限られている。
そのため、電力効率を重視して発展してきたARM系CPUが広く採用された。
ただし、ARMだから必ず省電力になるわけではない。実際の消費電力は、CPU内部の設計、製造技術、クロック周波数、コア数、冷却などにも左右される。
ARMはRISC系アーキテクチャ
ARMは一般に、RISC系の命令セットアーキテクチャと説明される。
RISCは次の略称である。
Reduced Instruction Set Computer
RISCでは、比較的単純で規則的な命令を組み合わせて処理するという考え方が重視される。
典型的な特徴として、次のものがある。
- 命令形式が比較的規則的
- 命令の長さが一定であることが多い
- レジスタを積極的に利用する
- 計算とメモリアクセスを分ける
- パイプライン処理を行いやすい
- CPU内部の設計を整理しやすい
ただし、RISCを単純に「命令数が少ないCPU」と理解するのは正確ではない。現在のARMには多数の命令や拡張機能がある。
x86はCISC系アーキテクチャ
x86は一般に、CISC系の命令セットアーキテクチャと説明される。
CISCは次の略称である。
Complex Instruction Set Computer
CISCでは、一つの命令で比較的複雑な処理を実行できるようにする考え方がある。
x86には長い歴史の中で新しい機能が追加され続けてきた。その結果、現在のx86-64は非常に大きく複雑な命令セットになっている。
現代ではRISCとCISCの境界は単純ではない
ARMはRISC、x86はCISCと分類されるが、現代の高性能CPUをこの違いだけで説明することはできない。
現代のx86 CPUは、複雑なx86命令をCPU内部でより単純な処理へ分解して実行する。
x86命令
↓
命令を解析
↓
内部の単純な命令へ分解
↓
複数の実行ユニットで処理
一方、現代のARM CPUも内部構造は非常に複雑であり、次のような機能を持つ。
- 分岐予測
- 投機実行
- アウト・オブ・オーダー実行
- 複数命令の同時実行
- 大容量キャッシュ
- ベクトル演算
- 高度な電力管理
そのため、RISCだから単純で遅い、CISCだから複雑で速い、という理解は正しくない。
レジスタとは何か
レジスタは、CPU内部にある高速な一時記憶領域である。
CPUは、計算対象のデータをレジスタへ読み込み、レジスタ上で計算する。
メモリから数値Aをレジスタへ読み込む
メモリから数値Bをレジスタへ読み込む
レジスタ上で数値Aと数値Bを足す
結果をメモリへ書き戻す
レジスタはメインメモリより高速だが、容量は小さく、個数も限られている。
ARMのLoad/Store方式
ARMはLoad/Store型のアーキテクチャである。
これは、メモリへアクセスする命令と、計算を行う命令を分ける方式だ。
LOAD レジスタ1, メモリ上の数値A
LOAD レジスタ2, メモリ上の数値B
ADD レジスタ3, レジスタ1, レジスタ2
STORE メモリ上の保存先, レジスタ3
まずメモリからレジスタへ読み込み、レジスタ上で計算し、最後に結果をメモリへ戻す。
SoCとは何か
ARMの話では、SoCという言葉もよく使われる。
SoCは次の略称である。
System on a Chip
SoCとは、コンピュータに必要な複数の機能を一つのチップへ統合したものだ。
スマートフォン向けSoCには、例えば次の機能が含まれる。
- CPU
- GPU
- メモリコントローラー
- AI処理装置
- 動画処理回路
- カメラ用画像処理回路
- 通信機能
- セキュリティ機能
- ストレージ制御機能
Apple MシリーズやQualcomm Snapdragonは、CPUだけではなくSoCである。
Apple SiliconとARM
Apple Siliconは、Appleが設計するSoCの総称である。
Macに搭載されるMシリーズは、ARM64系の命令セットを採用している。
ただし、AppleはArm社の完成済みCPUコアをそのまま使っているわけではない。ARM命令セットと互換性を持つCPUコアを独自に設計している。
Apple Siliconの電力効率が高い理由は、ARM命令セットだけではない。
- Apple独自のCPU設計
- 高性能コアと高効率コア
- macOSとの最適化
- 統合メモリアーキテクチャ
- 専用処理回路
- 電力管理
- 製造プロセス
これらが組み合わさっている。
ARM版Windows
WindowsにはARM64版が存在する。
ARM版Windowsでは、主に次の種類のアプリを利用する。
- ARM64向けに作られたアプリ
- 変換またはエミュレーションで動作するx86アプリ
- 変換またはエミュレーションで動作するx86-64アプリ
x86向けの既存ソフトを動かせる場合もあるが、完全な互換性が保証されるわけではない。
特に次の種類のソフトウェアでは問題が起こる可能性がある。
- 古いデバイスドライバ
- 特殊な周辺機器用ソフト
- カーネルへ深く関わるソフト
- アンチチートを使うゲーム
- 一部の仮想化ソフト
- 特定のx86命令へ依存するソフト
LinuxとARM
Linuxカーネルは、ARMを含む複数のCPUアーキテクチャに対応している。
ARM版Linuxは、次のような機器で使われている。
- Raspberry Pi
- Android端末
- Chromebook
- ARMサーバー
- ルーター
- NAS
- IoT機器
- 組み込み機器
- Apple Silicon搭載Mac
ただし、LinuxがARMに対応していても、x86-64向けの実行ファイルがそのまま動くわけではない。
Arch LinuxとARM
通常のArch Linuxは、主にx86-64向けに提供されている。
ARM機器向けには、Arch Linux ARMという別プロジェクトが存在する。
名前は似ているが、通常のArch Linux本体とは提供体制が異なる。
x86-64用のArch LinuxパッケージをARM64環境へコピーしても、原則として実行できない。
GentooとARM
Gentooは複数のCPUアーキテクチャに対応している。
x86-64だけでなくARM64向け環境も構築できる。
Gentooでは多くのソフトウェアをソースコードからビルドするため、対象CPUに合わせてコンパイルできる。
ただし、ソースコードや依存ライブラリがARMへ対応していない場合は、ビルドできないこともある。
ARMでx86向けソフトを動かす方法
ARMとx86では機械語が異なるため、x86向け実行ファイルはARMでは原則として直接実行できない。
主な方法は次のとおり。
ARM版を利用する
ソフトウェアのARM64版が提供されている場合は、それを利用する。
ARM向けに再コンパイルする
ソースコードが公開されている場合、ARM64向けにビルドできることがある。
エミュレーターを利用する
QEMUなどを使い、別のCPUアーキテクチャを再現する。ただし、処理速度が低下する場合がある。
バイナリ変換を利用する
別のCPU向け命令を、実行可能な命令へ変換する。
AppleのRosetta 2は代表例である。
DockerとARM
DockerでもCPUアーキテクチャの違いは重要である。
Dockerコンテナはホストのカーネルを共有するため、コンテナ内の実行ファイルは基本的にホストCPUへ対応している必要がある。
ARM64マシンでは、ARM64向けDockerイメージを使うのが基本となる。
現在のDocker環境のアーキテクチャは、次のコマンドで確認できる。
docker info --format '{{.Architecture}}'
コンテナ内で確認するなら、次のように実行できる。
docker run --rm alpine uname -m
AndroidとARM
Android端末の多くはARM系SoCを搭載している。
Androidアプリの中には、CやC++で作られたネイティブコードを含むものがある。ネイティブコードはCPUアーキテクチャごとに用意する必要がある。
Androidでは、次のようなABI名が使われる。
armeabi-v7aarm64-v8ax86x86_64
近年のAndroid端末では、arm64-v8aが中心である。
Raspberry PiとARM
Raspberry Piは、小型のシングルボードコンピュータである。
多くのRaspberry PiにはARM系SoCが搭載されている。そのため、一般的なx86-64版Linuxをそのまま使うことはできない。
主な用途には次のものがある。
- Linuxの学習
- プログラミング
- 小型サーバー
- 電子工作
- 自宅用NAS
- DNSサーバー
- 監視カメラ
- ホームオートメーション
ARMサーバー
ARMはスマートフォン専用のアーキテクチャではない。
現在ではサーバーにも利用されている。
ARMサーバーに期待される利点には、次のものがある。
- 電力効率
- 多コア化
- 発熱の抑制
- サーバーの高密度化
- 特定用途への最適化
- クラウド事業者による独自設計
一方で、x86-64向けにしか提供されていないソフトウェアでは、移行が難しい場合もある。
big.LITTLEとは何か
ARM系SoCでは、性能の異なるCPUコアを組み合わせる設計が広く使われている。
- 高性能なコア
- 電力効率を重視したコア
重い処理では高性能コアを使い、軽い処理や待機時には高効率コアを使う。
これにより、性能と消費電力の両立を目指す。
同様の考え方はApple Siliconや近年のIntel製CPUでも採用されている。
ARMの長所
ARM系CPUの一般的な長所として、次の点が挙げられる。
- 電力効率を重視した製品が多い
- SoCへ統合しやすい
- 多数の企業が製品を設計できる
- 小型機器からサーバーまで用途が広い
- 自社製品に合わせた独自最適化が可能
ARMの短所
ARMにも弱点がある。
- x86向けソフトとの互換性
- ARM版ドライバがない周辺機器
- ゲームやアンチチートとの互換性
- 製品ごとの性能差が大きい
- 組み込み機器では機種ごとに起動方法が異なる場合がある
ARMは性能を表す製品名ではない。低性能なARM製品も、高性能なARM製品も存在する。
x86-64の長所
x86-64には、長年のパソコン市場で蓄積された強みがある。
- Windows向けソフトが豊富
- PCゲームとの互換性が高い
- 周辺機器のドライバが多い
- Linux対応が成熟している
- 自作PC向け製品が豊富
- 仮想化環境が充実している
- 過去のソフトウェアとの互換性が高い
ARMとRISC-Vの違い
RISC-VもRISC系の命令セットアーキテクチャである。
ARMとの大きな違いの一つは、命令セットのライセンス方式だ。
ARMを利用する企業は、通常Arm社からライセンスを受ける。
RISC-Vの基本命令セットは、比較的自由に利用できるオープンな仕様として提供されている。
ただし、ARMとRISC-Vは別の命令セットであり、ARM向けの実行ファイルがRISC-Vでそのまま動くわけではない。
ARMだから速いとは限らない
ARMという名前だけでは、CPUの性能は判断できない。
性能は次の要素に左右される。
- CPUコアの内部設計
- クロック周波数
- コア数
- キャッシュ容量
- メモリ性能
- 製造プロセス
- 消費電力の上限
- 冷却性能
- OSの最適化
- コンパイラの最適化
- 実行するソフトウェア
したがって、ARMはx86より速い、あるいはx86はARMより速い、と一律には言えない。
LinuxでCPUアーキテクチャを確認する
unameコマンド
uname -m
x86-64の場合。
x86_64
ARM64の場合。
aarch64
lscpuコマンド
lscpu
必要な項目だけ表示する。
lscpu | grep -E 'Architecture|Vendor ID|Model name|CPU\(s\)'
GCCの対象アーキテクチャ
gcc -dumpmachine
x86-64の例。
x86_64-pc-linux-gnu
ARM64の例。
aarch64-linux-gnu
実行ファイルのアーキテクチャ
file /usr/bin/bash
x86-64環境の例。
ELF 64-bit LSB pie executable, x86-64
ARM64環境の例。
ELF 64-bit LSB pie executable, ARM aarch64
ARMを理解するための要点
- ARMはCPUの命令セットアーキテクチャの一つ
- ARMは一個のCPU製品名ではない
- Arm社はCPU設計技術を企業へライセンス提供している
- AppleやQualcommなどがARM系CPUやSoCを設計している
- ARM64はAArch64とも呼ばれる
- スマートフォンではARM系SoCが主流
- 一般的なIntel・AMD搭載PCはx86-64が主流
- ARMとx86では理解する機械語が異なる
- x86向け実行ファイルはARMでは原則として直接動かない
- ARMだから必ず速い、省電力、安価というわけではない
まとめ
ARMは、CPUが理解する命令や、ソフトウェアから見えるCPUの基本動作を定めた命令セットアーキテクチャである。
スマートフォンや組み込み機器で広く普及し、現在ではパソコンやサーバーにも利用範囲を広げている。
一方、一般的なIntel・AMD搭載PCでは、x86-64が主流である。
ARMとx86の違いは、単なるCPUメーカーの違いではない。CPUが理解する機械語そのものが異なる。
AMD Ryzen 7 5700XはARMではなく、x86-64アーキテクチャのCPUである。
Linuxでは次のコマンドで確認できる。
uname -m
表示結果がx86_64ならx86-64、aarch64ならARM64である。
ARMはスマートフォン専用の低性能CPUではない。小型の制御装置からスマートフォン、パソコン、サーバーまで使われる、現代の主要なCPUアーキテクチャの一つである。