ARMアーキテクチャ入門

最終更新: 2025-06-07 09:28:40 +0800 +0800
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

Armは、単一のプロセッサ実装ではなく、命令セットアーキテクチャ(ISA)のファミリを定義します。アーキテクチャは、プログラマから見える状態、命令の意味論、例外、特権、およびメモリ順序を規定します。コアのパイプライン、キャッシュ階層、分岐予測器は、マイクロアーキテクチャ上の選択です。

アーキテクチャプロファイルは、配置要件を分離します。A-profileは仮想メモリを備えたアプリケーションプロセッサを対象とし、R-profileはリアルタイムシステムを対象とし、M-profileはマイクロコントローラを対象とします。以下の実行状態と特権モデルは、特に記載がない限りA-profileシステムについて説明します。

実行状態と命令セット #

AArch32は32ビットの汎用レジスタを提供し、A32命令セット、または歴史的にThumbと呼ばれていた可変長のT32命令セットを実行できます。Armv8-Aで導入されたAArch64は、31本の64ビット汎用レジスタと、固定長のA64命令セットを提供します。X0からX30は64ビットレジスタを表し、W0からW30はそれぞれの下位32ビットを表します。Wレジスタへの書き込みは、対応するXレジスタの上位半分をクリアします。

プロセッサは複数の実行状態を実装できますが、製品が64ビットに対応していることからサポート状態を推測することはできません。Armv8-Aでは、AArch64オペレーティングシステムがAArch32アプリケーションをサポートすることが認められていましたが、後のアーキテクチャバージョンでは、選択した例外レベルでAArch32を実装しないことが認められています。したがってソフトウェアは、利用可能な状態を判断するために、プラットフォームのドキュメントとオペレーティングシステムのインターフェースを使用する必要があります。

実行状態はレジスタ幅だけで構成されるものではありません。AArch32とAArch64では、命令エンコーディング、例外モデル、システムレジスタ、ABIが異なります。通常の分岐で状態を切り替えることはできません。例外からの復帰、またはアーキテクチャで定義された別の遷移によって、遷移先の状態を確立する必要があります。

レジスタとプロシージャ呼び出し #

A64はロード・ストアISAです。算術演算はレジスタ上で実行され、明示的なロード命令とストア命令がメモリにアクセスします。

asm
ldr w0, [x1]        // 32ビット値をロード
add w0, w0, #1
str w0, [x1]

複数のレジスタ名には、アーキテクチャ上または慣例上の役割があります。

レジスタAAPCS64での役割
X0-X7整数の引数と戻り値
X8間接結果格納先レジスタ
X9-X15呼び出し側保存の一時レジスタ
X16-X17プロシージャ内呼び出し用の一時レジスタ
X18プラットフォームレジスタまたは一時レジスタ(プラットフォームABIに依存)
X19-X28呼び出し先保存レジスタ
X29慣例上のフレームポインタ
X30リンクレジスタ
SPスタックポインタ

BLは戻りアドレスをX30に書き込み、RETは通常X30を介して分岐します。Arm 64ビットアーキテクチャのプロシージャ呼び出し標準(AAPCS64)は、浮動小数点/ベクトル引数レジスタ、集約型の受け渡し、呼び出し先保存状態、16バイトのスタックアラインメントも定義します。これらの規則はABIの契約であり、A64命令構文の性質ではありません。コンパイル済みコードと相互運用する手書きアセンブリは、プラットフォームの完全なABIに従う必要があります。

例外レベルと遷移 #

A-profileシステムは例外レベルを使用します。数値が大きいほど特権が高くなります。

  • EL0は非特権アプリケーションを実行します。
  • EL1は通常、オペレーティングシステムカーネルを実行します。
  • EL2はハイパーバイザ向けの仮想化制御を提供します。
  • EL3は、実装されているシステムでセキュアモニタ機能を提供します。

実装がすべてのレベルを提供する必要はありません。セキュリティ状態と仮想化も、ELがアクセスできるリソースに影響します。そのため、EL番号だけでは完全な保護ドメインを表せません。

例外には、同期例外、IRQ、FIQ、システムエラーが含まれます。例外を取得すると、復帰アドレスと保存されたプロセッサ状態がELR_ELxとSPSR_ELxに記録され、対象ELのベクタテーブルからエントリが選択され、選択された状態がマスクまたは変更されます。ハンドラがその状態を検証した後、ERETは保存された状態を復元します。システムコールでは通常、SVCを使用してEL1に入ります。ハイパーバイザ呼び出しとセキュアモニタ呼び出しでは、有効になっている場合にHVCとSMCを使用します。

変換テーブルとアクセス制御レジスタがメモリ隔離を強制します。EL2は、EL1ゲストの第1段階マッピングに第2段階変換を追加できます。一方、TrustZoneのセキュリティ状態は、別のアクセス境界を設定できます。利用可能性とレジスタの正確な動作は、実装されているアーキテクチャバージョンに依存します。

メモリ順序、バリア、アトミック操作 #

Armは弱順序のメモリモデルを使用します。アーキテクチャ上の同期による制約がない場合、あるコアは、独立したロードとストアをプログラム順序とは異なる順序で観測できます。キャッシュコヒーレンシは、参加するオブザーバが1つの場所への書き込み順序について合意することを保証しますが、コヒーレンシだけでは異なる場所へのアクセス順序は定まりません。

並行コードでは、プロトコルに必要な最小限の順序を表現する必要があります。

  • Acquireロードは、後続のアクセスがAcquireより前に移動することを防ぎます。
  • Releaseストアは、先行するアクセスがReleaseの後に移動することを防ぎます。
  • リード・モディファイ・ライト型アトミック操作は、指定された順序付けを伴う不可分な更新を提供します。
  • DMBは、選択した共有可能性とアクセスドメイン内で、関連するメモリ観測の順序を付けます。
  • DSBは、指定されたメモリ効果が完了するまで待機します。
  • ISBは命令パイプラインをフラッシュし、先行するコンテキスト変更操作によって確立されたコンテキストで後続の命令を実行します。

AArch64は、LDXR/STXRなどの排他的ロード/排他的ストアループをサポートします。Large System Extensionsを備えたシステムでは、単一命令のアトミックなリード・モディファイ・ライト操作も提供できます。どちらの形式にも再試行または競合処理が必要であり、言語レベルのデータ競合を修復するものではありません。CおよびC++のプログラムでは、コンパイラがそれらの意味論を適切な命令とバリアにマッピングするため、言語のアトミック操作を使用する必要があります。

主な参考資料 #

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)