記事ディレクトリ
1. 建築とは
「アーキテクチャ」は機能仕様を指し、ARM アーキテクチャは ARM プロセッサの機能仕様であり、次の主な内容が含まれます。
- 命令セット: 各命令の機能、メモリ内の命令の表現方法 (エンコード)。
- レジスタセット: レジスタの数、サイズ、機能、および初期状態。
- 例外モデル: 異なる特権レベル、例外の種類、および例外を採用するときと例外から戻るときの処理アクション。
- メモリ モデル: メモリがアクセスされる順序、ソフトウェアが正確なメンテナンスを実行する必要がある場合のキャッシュの動作。
- デバッグ、トレース、および統計: ブレークポイントを設定してトリガーする方法、トレース ツールで情報をキャプチャできる対象と方法。
「アーキテクチャ」は、プロセッサを構築して動作する方法を直接説明するものではなく、ソフトウェアとハードウェア間の動作仕様を提供するだけです。特定のプロセッサの構造と設計は「マイクロアーキテクチャ」マイクロアーキテクチャと呼ばれ、マイクロアーキテクチャには以下が含まれます。
- パイプラインの長さとレイアウト
- キャッシュの数とサイズ
- 1 命令のサイクル数 (1 命令サイクルは数クロック サイクルに相当)
- その他のオプション機能
二、ARMアーキテクチャ分類
ARM は、次の 3 つのアーキテクチャ プロファイルを提供します。
- A-Profile (アプリケーション): サーバー、携帯電話、車載ホストなどの複雑なコンピューティング アプリケーションで使用されます。
- R-Profile (リアルタイム): 安全性が重要なアプリケーションや、医療機器、車両のステアリング、ブレーキ、信号などの決定論的な応答を必要とするアプリケーションなど、リアルタイムの応答が必要な場合に使用されます。
- M-Profile (マイクロコントローラ): 深く埋め込まれたチップ、小型センサー、通信モジュール、スマート ホーム製品など、エネルギー効率、消費電力、およびサイズに対する要件が厳しい場所で使用されます。
プロセッサの構造と設計は「マイクロアーキテクチャ」と呼ばれます。マイクロアーキテクチャは、パイプラインの長さとレイアウト、キャッシュの数とサイズ、1 つの命令のサイクル数など、プロセッサの動作方法を定義します。オプション機能。
Arm-A アーキテクチャ
Armv7-A
(1) 命令セット
ARMv7-A アーキテクチャは 32 ビット プロセッサ アーキテクチャであり、ロード/ストア アーキテクチャでもあります。つまり、データ処理命令の操作は汎用レジスタで完了し、ロード/ストア命令のみがメモリにアクセスできます。さらに、ARM 命令セットにはもう 1 つの大きな特徴があります。つまり、ARM 命令セットのほぼすべての命令で条件コードを追加できます。
ARM 命令セットは、次の 4 つのカテゴリに分類できます。
- データ処理操作 (ADD などの ALU 操作);
- メモリ操作 (ロード/ストア);
- 制御フロー (ループ、ジャンプ、条件コードなど);
- システム (コプロセッサー、デバッグ、モード切り替えなど)。
Armv7-A は、Arm (A32) および Thumb (T32) データセットをサポートします。
ARM コアは、メモリに対して直接ではなく、レジスタに対してのみデータ処理を実行できます。
データ操作命令は通常、ターゲット レジスタと 2 つのソース オペランドで構成されます. すべての ARM データ操作命令は、サフィックス (Suffix) を付けてステータス フラグ (CPSR) に影響を与えることができます。その基本的な形式は次のとおりです:
Operation{cond}{S}Rd,Rn,Operand2 - 操作 : 命令ニーモニック;
- cond: 実行条件;
- S: サフィックス、CPSR レジスタのステータス ビットに影響するかどうか。
- Rd: ターゲット レジスタ。
- Rn: 第 1 オペランドレジスタ。
- Operand2: 2 番目のオペランド。
- {}: オプション。
(2) プロセッサモード
ARMv7 アーキテクチャは、セキュリティ拡張機能をサポートしています. セキュリティ拡張機能が有効になっている場合、ARMv7-A アーキテクチャは、セキュア モード (セキュア状態) と非セキュア モード (非セキュア状態) の 2 つの世界に分割されます。
非セキュアモードでは、PL0、PL1、PL2 の 3 つの操作権限 (権限レベル) があります。
特権レベル | 説明 |
---|---|
PL0 | PL0 は、アプリケーションを実行するためのユーザー モード (ユーザー) で実行されます。このモードは、システム リソースへの制限付きアクセスをプログラムします。Linuxユーザーモードに対応。 |
PL1 | PL1 は、非ユーザー モードと Hyp モードを除くすべてのモードを実行します。Linux カーネルは PL1 で実行されます。ARMv6 アーキテクチャのシステム、SVC、FIQ、IRQ、UNDEF、および中止モードが含まれています。さらに、セーフ モードの Montior は PL1 レベルでも実行され、セーフ モードと非セーフ モードの切り替えを管理します。 |
PL2 | PL2 は仮想化用です。仮想化ハイパーバイザー (Hypervisor) は PL2 上で実行されます。 |
プロセッサ モード:
- ユーザー: ユーザーモード、PL0 の特権レベルで実行、つまり、特権レベルはありません.OS 上でアプリケーションを実行するときのレベルです.システムリソース (MMU など) にアクセスできません.このモードでは、モードをアクティブに切り替えることはできません。ただし、割り込みまたは例外が発生した場合 (SWI がシステム コールをトリガーするなど) が発生した場合を除きます。
- FIQ: 高速割り込みモード、FIQ 高速割り込み発生時のプロセッサ モード。
- IRQ: 割り込みモード、IRQ 高速割り込みが発生したときのプロセッサ モード。
- スーパーバイザー: リセット後のデフォルト モードである管理者モードは、PL1 特権レベルで実行され、SWI (SVC) システムを介して呼び出して、スーパーバイザー コール例外を生成し、オペレーティング システムで一般的に使用されるモードであるスーパーバイザー モードに入ることができます。
- 監視: セキュリティ拡張のための監視モード。詳細は説明されていません。
- アボート: 停止モード。データ アボート例外またはプリフェッチ アボート例外が発生すると、このモードに入ります。
- Hyp: 仮想化拡張機能がサポートされている場合、モードについては詳しく説明しません。
- Undefined: 実行と命令に関するモードで、UNDEFINED 命令を実行しようとするとこのモードに入ります。
- システム: システム モードも PL1 特権レベルです. スーパーバイザーとの違いは、システム モードには現在ほとんどのシステムで使用されていないユーザー モードと同じレジスタがあることです。
(3) 汎用レジスタ
ARMv7-A プロセッサには、R0 ~ R15 の 16 個の汎用レジスタがあります。
- R13: 通常はスタックポインタ SP として使用されます。
- R14: 通常、リンクレジスタ LR として使用されます。
- R15: 通常、プログラム カウンタ PC として使用されます。
システム リソースにアクセスする権限は特権レベルごとに異なり、プロセッサにはいくつかのモードがあります。各モードに対応する特権レベルは異なります。また、各プロセッサ モードに対応するレジスタも異なります。
- R0~R7、PC はすべてのモードで共有されます。
- FIQ モードでは、R8 ~ R12、SP、LR のすべてに特殊なレジスタがあり、一部のマテリアルでは「シャドー レジスタ」と呼ばれています。このモードでは、専用の R8~R12、SP、LR があります。
- 同様に、Supervisor、Abort、Undefined、IRQ などはすべて、独自のモードで独自の特別な SP と LR を持っています。つまり、他のモードから入ってくる場合、これらのシーンを復元する必要はありません。 2 つのレジスタ;
- FIQ が FIQ と呼ばれる理由は、ソフトウェアからも IRQ よりも多くの専用レジスタを持っていることがわかります。
(4) 特殊レジスター
プログラム ステータス レジスタ CPSR (現在のプログラム ステータス レジスタ) 例外に入る前に、現在の CPSR は SPSR (保存されたプログラム ステータス レジスタ) に保存されます; CPRS はユーザー層で APSR と呼ばれます。ユーザー層ではすべての CPSR ビットにアクセスできるわけではないため、 APSR は
単に CPSR レジスタの一部が切り捨てられています。
分野 | 効果 |
---|---|
N | ALU は、演算結果が負数かどうかを返します |
Z | ALU は、演算結果が 0 かどうかを返します |
ハ | ALU演算でキャリーが発生するかどうか |
Ⅴ | ALU 演算がオーバーフローするかどうか |
Q | 累積飽和 |
J | ARM は Jazelle 状態ですか |
え | ロード/ストアのバイト オーダーを制御します。E=1 はビッグ エンディアン モード、E=0 はリトル エンディアン モードを意味します。 |
あ | 非同期アボートを無効にします。ユーザーモードは操作できません |
私 | IRQ の有効化/無効化、ユーザーモードは動作不可、I=1 は IRQ を無効にする、I=0 は IRQ を有効にする |
ふ | FIQ の有効化/無効化、ユーザーモードは操作不可、F=1 は FIQ を無効にすることを意味し、I=0 は FIQ を有効にすることを意味します |
T | ARM および Thumb ステータス フラグ |
GE | 一部の SIMD (Single Instruction, Multiple Data) 命令の場合 |
M[4:0] | プロセッサー・モード: FIQ、IRQ、ABT、SVC、UND、MON、HYP。ユーザーモード操作不可 |
IT[7:0] | IT7:2: IT1:0 と共に IT[7:0] を形成し、IF-THEN 命令の実行ステータスを示します。 |
[28-31]: コンディションコード
M[4:0]: プロセッサモードのエンコード
Armv8-A
Armv8-A アーキテクチャは、アプリケーション フレームワーク向けの最新世代の Arm アーキテクチャです。ARMv8 アーキテクチャは、ARMv7 および以前のプロセッサ テクノロジの基礎を継承します. 既存の 16/32 ビット Thumb2 命令をサポートするだけでなく、既存の A32 (ARM 32 ビット) 命令セットとの前方互換性もあります. 64 ビット AArch64 アーキテクチャに加えて、新しい A64 (ARM 64bit) 命令セットに加えて、既存の A32 (ARM 32bit) および T32 (Thumb2 32bit) 命令セットも拡張され、CRYPTO (暗号化) モジュールのサポートも新たに追加されました。
登録
Armv7 との前方互換性を保つために、Armv8-A は AArch32 と AArch64 という 2 つの実行状態をサポートしています。2 つの実行状態の違いは次のとおりです。
Arch32 | AArch64 |
---|---|
13個の32bit汎用レジスタR0~R12、32bit PCポインタ(R15)、スタックポインタSP(R13)、リンクレジスタLR(R14)を提供 | 31 個の 64 ビット汎用レジスタ X0 ~ X30 (W0 ~ W30) を提供し、そのうち X30 はプログラム リンク レジスタ LR です。 |
Hyp モードでの異常復帰用に 32 ビットの異常リンク レジスタ ELR を提供します。 | 64ビットPCポインタ、スタックポインタSPx、例外リンクレジスタELRxを提供 |
32 個の 64 ビット SIMD ベクトルおよびスカラー浮動小数点のサポートを提供 | 32 個の 128 ビット SIMD ベクトルおよびスカラー浮動小数点のサポートを提供 |
2 つの命令セット A32(32bit)、T32(16/32bit) を提供 | ARMv8 例外レベル ELx (x<4) を定義し、x が大きいほどレベルが高く、権限が大きくなります |
ARMv7 と互換性のある例外モデル | PE (Processing Element) の状態を保存するための PSTATE のセットを定義します。 |
コプロセッサは CP10\CP11\CP14\CP15 のみをサポートします | コプロセッサの概念なし |
汎用レジスタ
ARM64 アーキテクチャでは、CPU は 33 個のレジスタを提供します。そのうち最初の 31 個 (0 ~ 30) は汎用整数レジスタです。
登録 | 例証する |
---|---|
X0 レジスタ | 戻り値を保存する (またはパラメーターを渡す) ために使用されます |
X1 ~ X7 レジスタ | 関数のパラメータを保存するために使用されます |
X8 レジスタ | 戻り値の保存にも使用できます |
X9 ~ X28 レジスタ | 汎用レジスター、特別な目的なし |
X29(FP)レジスタ | スタックのボトムアドレスを保存するために使用されます |
X30 (LR) レジスタ | 戻りアドレスを保持するために使用されるリンク レジスタ |
各 AArch64 64 ビット汎用レジスタ X0-X30 には、対応する 32 ビット レジスタがあります. Wn レジスタは、Xn レジスタの下位 32 ビットです. Wn レジスタを読み取るとき、Xn レジスタの上位 32 ビットは変更されません。 . W レジスタが書き込まれると、X レジスタの上位 32 ビットが 0 に設定されます。
特殊寄存器
除了31个通用寄存器,还有几个特殊的寄存器:
1、zero register:写操作被忽略,读操作都返回0;
2、SP/WSP:当前栈指针;
3、PC program counter:ARMv7指令集使用通用寄存器R15作为PC,直接操作PC可以做一些机智的编程操作,但是ARMv8不能直接进入PC,这使返回更好预测,并且使ABI规范更加简单;
4、ELR / SPSR:当armV8执行在AArch64,每个ELn异常返回状态取决于ELR和SPSR
ELR: exception link register 保存exception返回地址
SPSR: saved processor state register 执行exception前保存当前的processor state, 执行exception完返回时restore
在ARMv8中,如果异常发生在EL1,就使用SPSR_EL1,如果发生在EL2, 使用SPSR_EL2,如果发生在EL3, SPSR_EL3使用
ELR 和SPSR时成对的,其和对应的ELn相关
5、SP 每个 exception level 都有对应的 SP:
Armv8有32个 128bit的浮点寄存器 V0-V31. 这32个寄存器用来处理标量浮点预算和NEON指令。
指令集
A64指令的编码是固定的32bits;A32指令的编码也是固定的32bits;T32指令编码是可变长的16bits、32bits。
ARM指令使用的是 三地址码 , 它的格式如下:
{} {S} , , <shifter_operand>
opcode:操作码,也就是助记符,操作码,也就是助记符,说明指令需要执行的操作类型
cond:指令执行条件码,在编码中占4bit,0b0000 -0b1110
S:条件码设置项,决定本次指令执行是否影响PSTATE寄存器响应状态位值
Rd:目标寄存器,A64指令可以选择X0-X30 or W0-W30
Rn:第一个操作数的寄存器,和Rd一样,不同指令有不同要求
shifter_operand:第二个操作数,可以是立即数,寄存器Rm和寄存器移位方式(Rm,#shit)
指令分类
- 跳转指令:条件跳转、无条件跳转(#imm、register)指令;
- 异常产生指令:系统调用类指令(SVC、HVC、SMC);
- 系统寄存器指令:读写系统寄存器,如 :MRS、MSR指令 可操作PSTATE的位段寄存器;
- 数据处理指令:包括各种算数运算、逻辑运算、位操作、移位(shift)指令;
- load/store内存访问指令:load/store {批量寄存器、单个寄存器、一对寄存器、非-暂存、非特权、独占}以及load-Acquire、store-Release指令 (A64没有LDM/STM指令);
- 协处理器指令:A64没有协处理器指令。
常见指令
add:将某一寄存器的值和另一寄存器的值 相加 并将结果保存在另一寄存器中
add x0, x0, #1 ; 将寄存器 x0 的值和常量 1 相加后保存在寄存器 x0 中
add x0, x1, x2 ; 将寄存器 x1 和 x2 的值相加后保存到寄存器 x0 中
add x0, x1, [x2] ; 将寄存器 x1 的值加上寄存器 x2 的值作为地址,再取该内存地址的内容放入寄存器 x0 中
mov:把一个寄存器的值(要能用立即数表示)赋给另一个寄存器,或者将一个常量赋给寄存器,将后边的量赋给前边的量
mov R1, R0 ; 将寄存器R0的值传送到寄存器R1
mov PC, R14 ; 将寄存器R14的值传送到PC,常用于子程序返回
mov R1, R0, LSL#3 ; 将寄存器R0的值左移3位后传送到R1(即乘8)
movs PC, R14 ; 将寄存器R14的值传送到PC中,返回到调用代码并恢复标志位
sub : オペランド 2 からオペランド 1 を減算し、結果をデスティネーション レジスタに格納するために使用されます。オペランド 1 はレジスタでなければならず、オペランド 2 はレジスタ、シフトされたレジスタ、または即値である可能性があります。この命令は、符号付きまたは符号なしの数値の減算に使用できます
sub R0, R1, R2 ;R0 = R1 - R2
sub R0, R1, #256 ;R0 = R1 - 256
sub R0, R2, R3, LSL#1 ;R0 = R2 - (R3 << 1)
例外モデルとハンドラ モード
例外モデル
Armv8 には、EL0、EL1、EL2、EL3 という 4 つの例外レベルがあります。
例外 | レベル |
---|---|
EL0 | 応用 |
EL1 | Linux カーネル - OS |
EL2 | ハイパーバイザー |
EL3 | 安全なモニター |
安全 | |
非セキュア | 非セキュア EL0/EL1/EL2、非セキュア メモリのみにアクセス可能 |
安全 | セキュア EL0/EL1/EL3、非セキュア メモリとセキュア メモリにアクセス可能 |
ハンドラー例外クラスには次の規則があることに注意してください。
- ELx(x<4)、xが大きいほどレベルが高く、実行権限が高い
- EL0 での実行は非特権実行と呼ばれます
- EL2 にはセキュアな状態がなく、非セキュアな状態しかありません
- EL3 にはセキュア状態のみがあり、EL0/EL1 のセキュアと非セキュアの切り替えを実現します。
- EL0 と EL1 を実装する必要があります。EL2/EL3 はオプションです。