TOPPERS Confidential TOPPERSプロジェクト 設計メモ ARMのアーキテクチャに関するメモ 作成者: 高田広章(名古屋大学) 最終更新: 2015年8月18日 ○メモの位置づけ このメモは,ARMのアーキテクチャに関して,TOPPERSカーネルをポーティング するにあたって必要となる事項をまとめたものである. なお,このメモで対象とするARMアーキテクチャは以下のものである.ARM-Mアー キテクチャ(Cortex-Mシリーズ)およびARMv8アーキテクチャ(64ビットARM) は扱わない. ARMv4(ARM7TDMI,ARM9TDMI) ARMv5(ARM9E,ARM10E) ARMv6(ARM11) ARMv7-A(Cortex-A8,Cortex-A9,Cortex-A15など) ARMv7-R(Cortex-R4,Cortex-R5,Cortex-R7) ARMのMMU関連の事項については,「ARMのVMSAに関するメモ」を参照すること. ○目次 ・参考文献 ・実行モード - 特権レベル - プロセッサモード ・汎用レジスタ - アプリケーションレベルの汎用レジスタ - システムレベルの汎用レジスタ ・プログラムステータスレジスタ - アプリケーションレベルのステータスレジスタ - システムレベルのステータスレジスタ - 定数値の定義 ・複数のレジスタの操作 - アドレッシングモード - レジスタのロード/ストア順序 - Wビット("!"の付加) - Sビット("^"の付加) ・例外 - 例外の種類とモード/ベクタ - 例外受付時の処理 - 割込みの出入口 - ARMv6以降の例外処理命令 ・システム命令リファレンス - ldm - stm - mrs - msr - cps ・キャッシュと分岐予測 - キャッシュの識別 - キャッシュの振舞い - キャッシュのイネーブル/ディスエーブル - ARMv7におけるキャッシュと分岐予測のメンテナンス操作 ・TLBのメンテナンス操作 - VMSAにおけるTLBのメンテナンス操作 ・メモリタイプ・属性とメモリ順序モデル - メモリタイプ - メモリ属性 - DeviceとStrongly-orderedメモリ ・メモリアクセス順序 - リードとライト - メモリアクセスの順序要求 - メモリバリア - CPSRの変更とメモリ順序モデル - バリア命令の使用例 ・コプロセッサ - コプロセッササポート - コプロセッサ命令 ・CP15 - 仮想メモリシステムアーキテクチャ(VMSA)でのレジスタ - 物理メモリシステムアーキテクチャ(PMSA)でのレジスタ - パフォーマンスモニタレジスタ ○参考文献 [1] ARM Architecture Reference Manual, 2005 DDI 01001.pdf ※ ARMv6以前の定義 [2] ARM Architecture Reference Manual - ARMv7-A and ARv7-R edition, 2014 DDI0406C_C_arm_architecture_reference_manual.pdf ※ ARMv7の定義,ARMv6以前との差分についても記載あり ○用語集 RAZ Read-As-Zero RAZ/WI Read-As-Zero Write-Ignored RAZ/SBZP Read-As-Zero Should-Be-Zero-or-Preserved on writes ○実行モード ●特権レベル ARMは,以下の特権レベルを持つ. PL0 ユーザプログラムを実行するモード,非特権レベル PL1 OSを実行するレベル,スーパバイザレベル(いわゆる特権レベル) PL2 VMMを実行するレベル,ハイパバイザレベル〔仮想化拡張〕 セキュリティ拡張において,Secure状態は,PL2を持たない.言い換えると, PL2は,Non-secure状態に限られる(Secure状態でVMを用いることは想定してい ない). ●プロセッサモード([2] B.1.3節) ARMは,以下のプロセッサモードを持つ. User usr ユーザ FIQ fiq FIQ IRQ irq IRQ Supervisor svc スーパバイザ Abort abt アボート Undefined und 未定義 System sys システム ユーザモードは非特権レベル(PL0),その他は特権レベル(PL1)である.ユー ザモードとシステムモード以外を,例外モードと総称する. セキュリティ拡張では,Secure状態とNon-secure状態の切り換え用に,以下の モードを持つ(以下,このメモでは扱わない).このモードは,特権レベル (PL1)であり,Secure状態に限定される. Monitor mon モニタ また,仮想化拡張では,以下のモードを持つ(以下,このメモでは扱わない). このモードは,ハイパバイザレベル(PL2)であり,Non-secure状態に限定され る. Hyp hyp ハイパバイザ ○汎用レジスタ ●アプリケーションレベルの汎用レジスタ ARMの汎用レジスタは,r0〜r15の16本ある.ただし,以下のレジスタは特殊目 的に使われており,汎用レジスタとしては使用しない. r13 スタックポインタ sp r14 リンクレジスタ lr r15 プログラムカウンタ pc また,以下のレジスタも特殊目的に使われる場合があるが,通常は汎用レジス タとして使用する. r12 InterProcedure ip 特殊目的のレジスタ以外で,スクラッチレジスタは以下の通り. r0, r1, r2, r3, r12 この他のレジスタ(r4〜r11)は,callee saved registerである. ●システムレベルの汎用レジスタ 各例外モードは,専用のsp(r13)とlr(r14)を持つ.FIQモードは,それに加 えて,R8〜R12も専用に持つ.その他のレジスタ(pcも含む)は,ユーザモード と共用している. システムモードは,すべてのレジスタをユーザモードと共用している(つまり, システムモードとユーザモードの違いは,特権モードか否かの違いのみ). 特定のモードのspとlrを,sp_usr,lr_usr,sp_svc,lr_svcのように表記する. ○プログラムステータスレジスタ ●アプリケーションレベルのステータスレジスタ アプリケーションレベルのステータスレジスタとして,APSR(Application Program Status Register)がある.APSRの構成は以下の通り. ビット31(MSB) Nフラグ(Negative) 30 Zフラグ(Zero) 29 Cフラグ(Carry) 28 Vフラグ(Overflow) 27 Qフラグ(OverflowまたはSaturation,DSP命令用) 26〜24 常に0(RAZ/SBZP) 23〜20 予約 19〜16 GE[3:0] Greater or Equalフラグ(SIMD命令用) 15〜0 予約 ●システムレベルのステータスレジスタ システムレベルのステータスレジスタとして,CPSR(Current Program Status Register)がある.CPSRは,APSRの拡張である(言い換えると,APSRは,CPSR の一部が見えている).CPSRの構成は以下の通り. ビット31〜27 N,Z,C,V,Qフラグ … APSRと同じ 26〜25 IT[1:0] 下のITビットの下位2ビット 24 Jビット(Jazelleビット) 23〜20 予約 19〜16 GE[3:0] Greater or Equalフラグ(SIMD命令用)… APSRと同じ 15〜10 IT[7:2] If-Then実行状態ビット(Thumb IT命令用) 9 Eビット(エンディアン状態) 8 Aビット(非同期アボート禁止) 7 Iビット(IRQ禁止) 6 Fビット(FIQ禁止) 5 Tビット(Thumbビット,Jビットと合わせて命令セットを指定) 4〜0 M[4:0] プロセッサモード CPSRは,すべてのモードで共用している(つまり,CPSRは1つしかない). モード切換え前のCPSRを保存するためのレジスタとして,SPSR(Saved Program Status Register)がある.SPSRは,各例外モード毎に専用に持つ(ユー ザモードとシステムモードは,SPSRを持たない). ●ステータスレジスタに関する定数値の定義(arm.h) ステータスレジスタに設定する値を表すための定数値を用意しておく. /* * CPSRの割込み禁止ビット */ #define CPSR_INT_MASK UINT_C(0xc0) #define CPSR_IRQ_BIT UINT_C(0x80) #define CPSR_FIQ_BIT UINT_C(0x40) /* * CPSRのThumbビット */ #define CPSR_THUMB_BIT UINT_C(0x20) /* * CPSRのモードビット */ #define CPSR_MODE_MASK UINT_C(0x1f) #define CPSR_USR_MODE UINT_C(0x10) #define CPSR_FIQ_MODE UINT_C(0x11) #define CPSR_IRQ_MODE UINT_C(0x12) #define CPSR_SVC_MODE UINT_C(0x13) #define CPSR_ABT_MODE UINT_C(0x17) #define CPSR_UND_MODE UINT_C(0x1b) #define CPSR_SYS_MODE UINT_C(0x1f) ○複数のレジスタの操作 ●アドレッシングモード 複数のレジスタのロード/ストアには,4つのアドレッシングモードがある. IA(Increment After) 指定した番地から大きい方の番地に向かって使用 IB(Increment Before) 指定した番地+4から大きい方の番地に向かって使用 DA(Decrement After) 指定した番地から小さい方の番地に向かって使用 DB(Decrement Before) 指定した番地−4から小さい方の番地に向かって使用 スタック操作の場合には,わかりやすくするために,以下の4つのアドレッシン グモードを用いる. FD(Full Descending) ED(Empty Descending) FA(Full Ascending) EA(Enpty Ascending) Full … スタックポインタは使っている最後の番地を指す Empty … スタックポインタは次に使う(つまり,使っていない)番地を指す Descending … スタックは小さい番地に向かって伸びる Ascending … スタックは大きい番地に向かって伸びる スタック操作には,通常はFDを使う.ldm命令とstm命令において,以下のよう に対応する. スタック操作 スタック以外の操作 stmfd(Full Descending) stmdb(Decrement Before) … push ldmfd(Full Descending) ldmia(Increment After) … pop ●レジスタのロード/ストア順序 番号の小さいレジスタを,小さいアドレスからロード/にストアする. ●Wビット("!"の付加) Wビットが1の場合,ベースレジスタの値を(インクリメントまたはデクリメン トした値に)更新する. ●Sビット("^"の付加) Sビットは,状況により2つの機能を持つ. pc(r15)を含むldmの場合 cpsrが,spsrからロード(復帰)される. stmとpc(r15)を含まないldmの場合 特権モードで使用した場合,ユーザモードのレジスタが転送される. ○例外 ●例外の種類とモード/ベクタ 例外タイプ 例外モード ベクタアドレス ノーマル ハイベクタ ---------------------------------------------------------------------- Reset スーパバイザ 0x00000000 0xffff0000 Undefined instructions 未定義 0x00000004 0xffff0004 Supervisor Call スーパバイザ 0x00000008 0xffff0008 Prefetch Abort アボート 0x0000000c 0xffff000c Data Abort アボート 0x00000010 0xffff0010 IRQ (interrupt) IRQ 0x00000018 0xffff0018 FIQ (fast interrupt) FIQ 0x0000001c 0xffff001c ---------------------------------------------------------------------- ※Supervisor Callは,古いマニュアルではSoftware interrupt (SWI)と書かれている ※Prefetch Abort:命令フェッチでのメモリアボート ※Data Abort:データアクセスでのメモリアボート ベクタ割込みモード(CP15で制御される)の場合,IRQとFIQに対しては,上の ベクタアドレスは使われず,実装依存のアドレスが使われる. ●例外受付時の処理 ・例外発生時点のpcとcpsrが,該当する例外モードのlrとspsrに保存される. - lrに保存される値は,状況によって異なる(後述). ・〔セキュリティ拡張〕必要な場合には,Secureモードに切り換える. ・cpsrが以下のように変更される. - モードが受け付けた例外のモードに変更される. - 該当する割込みマスクがセットされる. + ResetかFIQなら,FIQを禁止する. + IRQを禁止する. +〔ARMv6以降〕UNDEFとSWI以外なら,非同期アボートを禁止する. - 命令セット(J,T)が例外エントリが要求される値にセットされる. + ARM状態にする. - エンディアン状態(E)が例外エントリが要求される値にセットされる. + CP15のreg1_EEビットで決まる. - IT[7:0]が0にクリアされる. ・ベクタアドレスに分岐する. ●lrに保存される値 例外タイプ 望ましい戻り番地 オフセット ---------------------------------------------------------------------- Undefined instructions 未定義命令の番地 +4/2(*) Supervisor Call SVCの次の命令の番地 +0 Prefetch Abort アボートされた命令の番地 +4 Data Abort アボートを生成した命令の番地+8 IRQ (interrupt) 次に実行すべき番地 +4 FIQ (fast interrupt) 次に実行すべき番地 +4 ---------------------------------------------------------------------- (*) ARMモードでは4,Thumbモードでは2 ※望ましい戻り番地は,あくまでも1つの想定と思われる.例えば,未定義命令  をエミュレーションした場合には,その次の番地へ戻る方が普通であろう. ●割込みの出入口 以下は,モードを変更しない場合の割込みの出入口の処理である. 割込みの入口では,lrから4を引いて戻り番地を求めた後,必要なレジスタと lr(戻り番地)をスタックに保存する. sub lr, lr, #4 stmfd sp!, {, lr} 割込みの出口では,必要なレジスタと戻り番地をスタックから(戻り番地はpc に),cpsrをspsrから復帰する.最後に"^"を付けることで,cpsrをspsrから復 帰することを示す. ldmfd sp!, {, pc}^ この命令は,システムモードでは使えない(spsrがないため). ●ARMv6以降の例外処理命令 ARMv6から,CPS命令,SRS命令,RFE命令が用意された.これらの命令がある場 合とない場合で,例外処理の出入口の最適なコードが異なる. srs(Store Return State)… 現在のモードのlrとspsrを,別のモードのspを 用いて保存するための命令.lrが小さい側の番地,spsrが大きい側の番地に保 存される.システムモードでは使えない(spsrがないため). 例)srsfd #CPSR_SVC_MODE! … lr(例外からの戻り先)とspsr(例外発生前 のcpsr)を,スーパバイザモードのスタックに 保存する. rfe(Return From Exception)… pcとcpsrを,復帰する命令.SRSで保存され た状態に戻るために用いる. 例)rfefd sp! … pcとcpsrを,現在のモードのスタックから復 帰する. cps(Change Processor State)… cpsrの割込みマスクとモードビットを変更 するための命令. ○システム命令リファレンス ●ldm (1) ldm<アドレッシングモード><条件> {!}, <レジスタリスト> Rnで示される連続した番地から,レジスタリストにリストアップされたレジス タに値をロードする.ユーザモードを含むすべてのモードで使用できる. (2) ldm<アドレッシングモード><条件> , ^ ※最後に"^"がある. Rnで示される連続した番地から,レジスタリストにリストアップされた「ユー ザモードのレジスタ」に値をロードする.システムモード以外の特権モードで 使用できる."!"は使えない. (3) ldm<アドレッシングモード><条件> {!}, ^ ※最後に"^"がある. Rnで示される連続した番地から,レジスタリストにリストアップされたレジス タに値をロードする.また,現在のモードのspsrを,cpsrにコピーする.シス テムモード以外の特権モードで使用できる. ●stm (1) stm<アドレッシングモード><条件> {!}, <レジスタリスト> Rnで示される連続した番地から,レジスタリストにリストアップされたレジス タに値をストアする.ユーザモードを含むすべてのモードで使用できる. (2) stm<アドレッシングモード><条件> , <レジスタリスト>^ ※最後に"^"がある. Rnで示される連続した番地から,レジスタリストにリストアップされた「ユー ザモードのレジスタ」に値をストアする.システムモード以外の特権モードで 使用できる."!"は使えない. ●mrs 特殊レジスタ(ステータスレジスタ)を,汎用レジスタにコピーする. ARMv7VE(仮想化拡張)では,他のモードのレジスタを汎用レジスタにコピーす る機能も持つ. (1) mrs<条件> , <特殊レジスタ記述> 特殊レジスタを,汎用レジスタRdにコピーする. <特殊レジスタ記述>には,以下のいずれかを指定する. - apsr - cpsr … ユーザモードで使った場合は,apsrを意味する. - spsr … ユーザモードでは使えない. ●msr 特殊レジスタ(ステータスレジスタ)に,即値または汎用レジスタの値をコピー する.ARMv7VE(仮想化拡張)では,他のモードのレジスタに汎用レジスタの値 をコピーする機能も持つ. この命令でEビット(エンディアン状態)を書き換えるべきではない.setend命 令を使うべき. (1) msr<条件> <特殊レジスタ記述>, #<定数> 特殊レジスタ(の一部)に,即値をコピーする. <特殊レジスタ記述>には,以下のいずれかを指定する. - apsr_nzcvq … cpsr_fと同じ - apsr_g … cpsr_sと同じ - apsr_nzcvqg … cpsr_fsと同じ - cpsr_<フィールド指定> - spsr_<フィールド指定> <フィールド指定>には,以下の文字の列を記述する. - c … PSRのビット7〜0(Iビット,Fビット,Tビット,M[4:0]) - x … PSRのビット15〜8(IT[7:2],Eビット,Aビット) - s … PSRのビット23〜16(GE[3:0]) - f … PSRのビット31〜24(N,Z,C,V,Qフラグ,IT[1:0],Jビット) (2) msr<条件> <特殊レジスタ記述>, 特殊レジスタ(の一部)に,汎用レジスタRnの値をコピーする.<特殊レジスタ 記述>は,上と同様. ●cps … ARMv6以降 プロセッサの状態(CPSRのAビット,Iビット,Fビット,プロセッサモード)を 変更する. (1) cpsie <割込みフラグ>{, #<モード>} 指定した割込みフラグを0にする(許可する).また,(指定した場合には)プ ロセッサモードを変更する. <割込みフラグ>には,以下の文字の列を記述する. - a … Aビット(非同期アボート禁止) - i … Iビット(IRQ禁止) - f … Fビット(FIQ禁止) <モード>には,0〜31の値(ステータスレジスタの下位5ビット)を記述する. 例)cpsie i … IRQを許可(cpsr中のIビットをクリア) (2) cpsid <割込みフラグ>{, #<モード>} 指定した割込みフラグを1にする(禁止する).また,(指定した場合には)プ ロセッサモードを変更する.<割込みフラグ>と<モード>は上と同様. 例)cpsid i … IRQを禁止(cpsr中のIビットをセット) 例)cpsid if … IRQとFIQを禁止 例)cpsid i,#CPSR_SVC_MODE … IRQを禁止して,スーパバイザモードに (3) cps #<モード> プロセッサモードを変更する.<モード>は上と同様. 例)cps #CPSR_USR_MODE … ユーザモードに ○キャッシュと分岐予測([2] B2.2節) ・以前のアーキテクチャ - ARMv6については,[2] D12.6.2節 - ARMv4, ARMv5については,[2] D15.6.1節 ●キャッシュの識別([2] B2.2.1節) ・キャッシュタイプレジスタ(CTR) - 最短ライン長など,どのようなキャッシュがついているかを読み出せる - 詳しくは,[2] B4.1.42節 - ARMv6以前はフォーマットが異なる ・キャッシュレベルIDレジスタ(CLIDR) - 各レベル(7レベルまで)のキャッシュのタイプを読み出せる - コヒーレンスに関する情報を読み出せる - ARMv6以前にはない ・キャッシュサイズ選択レジスタ(CSSELR) - 現在のキャッシュサイズIDレジスタ(CCSIDR)を選択する - キャッシュレベルとタイプ(命令 or データ/統合)を指定する - ARMv6以前にはない ・キャッシュサイズIDレジスタ(CCSIDR) - キャッシュレベル毎にある(CSSELRで選択する) - キャッシュに関する情報を読み出せる + write-through/write-back/read-allocation/write-allocatioができるか + セット数,連想度,ラインサイズ - ARMv6以前にはない ●キャッシュの振舞い([2] B2.2.2節) <省略> ●キャッシュのイネーブル/ディスエーブル([2] B2.2.3節) ・ARMv7のシステム制御レジスタ - CビットとIビットで,キャッシュのイネーブル/ディスエーブルを行う - Cビット:すべてのレベルの統合/データキャッシュを制御 - Iビット:すべてのレベルの命令キャッシュを制御 - より細かな制御は実装依存 ・ARMv6のシステム制御レジスタ - CビットとIビットは,レベル1キャッシュの制御を行う - Wビットでライトバッファの制御を行う ●ARMv7におけるキャッシュと分岐予測のメンテナンス操作([2] B2.2.6節) ・以前のアーキテクチャ - ARMv6については,[2] D12.7.10節 - ARMv4, ARMv5については,[2] D15.7.8節 ・用語の定義 - MVA(Modified Virtual Address) + メンテナンスする場所をメモリ中のアドレスで指定する + 高速コンテキストスイッチ拡張がない時は,VA(Virtual Address)に一致 *高速コンテキストスイッチ拡張は,ARMv6以降では推奨されない + MMUがない時はPA(Physical Address)に一致 - セット/ウェイ(set/way) + メンテナンスする場所をキャッシュ中のセットとウェイで指定する + レベル(Level)… キャッシュのレベル.小さい方がプロセッサに近い + セット(Set) + ウェイ(Way) - クリーン(clean) + 自分が行った更新が,他のオブザーバからも見えるように保証する - 無効化(invalidate) + 他のオブザーバが行った更新が,自分から見えるように保証する + 自分が行った更新が失われることになる場合がある - クリーンと無効化(clean and invalidate) + クリーンを行った後に無効化を行う - PoC(一貫性ポイント)… MVAの場合 + すべてのエージェントが参照する共通の場所 + 一般にはメインメモリ - PoU(統合ポイント)… MVAの場合 + プロセッサのPoUとは,そのプロセッサの命令/データアクセス, ページテーブルウォークが参照する共通の場所 + Inner Shareable共有ドメインのPoUとは,ドメイン内のすべての プロセッサの命令/データアクセス,ページテーブルウォークが 参照する共通の場所 - LoC(Level of Coherence) + PoCまでの一貫性を保つためにメンテナンスが必要な最終キャッシュ レベル - LoUU(Level of Unification, Uniprocessor) + プロセッサのPoUまでの一貫性を保つためにメンテナンスが必要な 最終キャッシュレベル - LoUIS(Level of unification, Inner Shareable) + Inner Shareable共有ドメインのPoUまでの一貫性を保つためにメン テナンスが必要な最終キャッシュレベル ・アドレス(VMA)ベースの操作におけるキャッシュ階層の抽象化 - PoCかPoU - キャッシュタイプレジスタ(CTR)にキャッシュのラインサイズを保持 + この単位でメンテナンスするのが最も効率的 ・セット/ウェイベースの操作におけるキャッシュ階層の抽象化 - クリーン操作は,指定されたレベルから,少なくとも次のレベルへクリーンする - 無効化操作は,指定されたレベルのみを無効化する ●VMSAにおけるキャッシュと分岐予測のメンテナンス操作([2] B4.2.1節) ・ARMv7-A(VMSA)におけるキャッシュ・分岐予測メンテナンス操作 - ICIALLIS, ICIALLU, ICIMVAU … 命令キャッシュと分岐予測の無効化 - BPIALLIS, CPIALL, CPIMVA … 分岐予測の無効化 - DCIMVAC, DCISW … データ/統合キャッシュの無効化 - DCCMVAC, DCCSW, DCCMVAU … データ/統合キャッシュのクリーン - DCCIMVAC, DCCISW … データ/統合キャッシュのクリーン&無効化 ---------------------------------------------------------------------- ICIALLUIS すべての命令キャッシュを無効化,Inner ShareableからPoU 分岐予測もフラッシュ ICIALLU PoUまでのすべての命令キャッシュを無効化,分岐予測も ICIMVAU PoUまでのMVAで指定した命令キャッシュラインを無効化 BPIALLIS すべての分岐予測エントリを無効化,Inner Sharable BPIALL すべての分岐予測エントリを無効化 BPIMVA 分岐予測からMVAを無効化 DCIMVAC PoCまでのMVAで指定したデータ/統合キャッシュを無効化 DCISW Set/wayで指定したデータ/統合キャッシュを無効化 DCCMVAC PoCまでのMVAで指定したデータ/統合キャッシュをクリーン DCCSW Set/wayで指定したデータ/統合キャッシュをクリーン DCCMVAU PoUまでのMVAで指定したデータ/統合キャッシュをクリーン DCCIMVAC PoCまでのMVAで指定したデータ/統合キャッシュをクリーン&無効化 DCCISW Set/wayで指定したデータ/統合キャッシュをクリーン&無効化 ---------------------------------------------------------------------- ・ARMv6での違い([2] D12.7.10節) ・ARMv4, ARMv5での違い([2] D15.7.8節) - レベル1キャッシュのみを操作する ※ ARMv7では複数のレベルのキャッシュを操作する - ARMv7に対応するものがある(以下で→の右は,ARMv7の同等の操作) + Invalidate instruction cache →ICIALLU + Invalidate instruction cache line by MVA →ICIMVAU + Invalidate all branch predictors →BPIALL + Invalidate branch predictor entry by MVA →BPIMVA + Invalidate data cache line by MVA →DCIMVAC + Invalidate data cache line by set/way →DCISW + Clean data cache line by MVA →DCCMVAC/DCCMVAU + Clean data cache line by set/way →DCCSW + Clean and Invalidate data cache line by MVA →DCCIMVAC + Clean and Invalidate data cache line by set/way →DCCISW - データキャッシュ全体に対する操作はARMv7にはない + Invalidate data cache + Clean data cache(ARMv6のみ) + Clean and Invalidate data cache(ARMv6のみ) - ARMv7では,統合キャッシュの操作は,データキャッシュの操作に統一さ れているが,ARMv6以前では別々にある + Invalidate unified cache, or instruction cache and data cache + Invalidate unified cache line by MVA + Invalidate unified cache line by set/way + Clean entire unified cache + Clean unified cache line by MVA + Clean unified cache line by set/way + Clean and invalidate entire unified cache 注意:この操作は[1]に掲載されているが,[2]には掲載されていない + Clean and Invalidate unified cache line by MVA + Clean and Invalidate unified cache line by set/way - Set/way指定による命令キャッシュの無効化はARMv7にはない + Invalidate instruction cache line by set/way - ARMv6以前のみにある操作(オプション) + Test and Clean data cache … 下に説明 + Test and Clean and Invalidate data cache … 下に説明 + Prefetch instruction cache line by MVA … TLBロックダウンで使う - ARMv6のみにある特殊な操作 + Cache Dirty Status Register … 全体をクリーンする時に使う ・ARMv6以前での,Test and Clean/Test and Clean and Invalidateの使い方 - クリーン/クリーン&無効化を効率的に行うために用意されている - 条件フラグをデスティネーションとするMRC命令を使う → グローバルキャッシュダーティ状態がZフラグに入る - データキャッシュ全体のクリーン tc_loop: MRC p15, 0, APSR_nzcv, c7, c10, 3 ; test and clean BNE tc_loop - データキャッシュ全体のクリーン&無効化 tci_loop: MRC p15, 0, APSR_nzcv, c7, c14, 3 ; test, clean and invalidate BNE tci_loop ○TLBのメンテナンス操作 ●VMSAにおけるTLBのメンテナンス操作([2] B4.2.2節) ※ Hypモードの時は別途規定 ・ARMv7-A(VMSA)におけるTLBメンテナンス操作 - ITLBIALL, ITLBIMVA, ITLBIASID … 命令TLB - DTLBIALL, DTLBIMVA, DTLBIASID … データTLB - TLBIALL, TLBIMVA, TLBIASID … 統合TLB ・マルチプロセッサ拡張で以下が追加(初期のARMv7にはない) - TLBIMVAA - TLBIALLIS, TLBIMVAIS, TLBIASIDIS, TLBIMVAAIS ・命令/データ/統合の使い分け - 命令TLBとデータTLBが別に実装されている場合,統合TLB操作は両者を操作する - 統合TLBが実装されている場合,命令/データTLB操作は統合TLBを操作する - 命令/データTLB操作を使うことは推奨しない ・操作の種類 ...IALL … すべてのTLBを無効化する ...IMVA … アドレス(MVA)指定でTLBを無効化する ...IASID … ASID指定でTLBを無効化する ...IMVAA … アドレスとASIDの両方を指定してTLBを無効化する ・以前のアーキテクチャ - ARMv6については,ARMv7-Aと同じ - ARMv4, ARMv5については,以下のみを持つ([2] D15.7.10節) + ITLBIALL, ITLBIMVA … 命令TLB + DTLBIALL, DTLBIMVA … データTLB + TLBIALL, TLBIMVA … 統合TLB ○メモリタイプ・属性とメモリ順序モデル([2] A3.5節) ●メモリタイプ([2] A3.5.1節) ・3つのメモリタイプ(ARMv6以降) Normal Device Strongly-ordered ・Strongly-ordered,Deviceメモリには,以下の制限がある. - アクセスの回数,順序,サイズが保存される(キャッシュされない). - リード・ライトとも,投機的に実行されない. + ただし,ページテーブルウォークは投機的に実行される. - リード・ライトアクセスが繰り返されない. ●メモリ属性([2] A3.5.2節) ・共有可能性(Shareability) - Normalと(LPAEを含まない実装では)Deviceに適用される. ※ LPAE:Large Physical Address Extension + LPAEを含む実装では,Deviceは常にOuter Shareable + DeviceをShareableとOuter Shareable以外にすることは推奨しない. - Outer Shareable - Inner Shareable - Non-shareable - Outer ShareableとInner Shareableの区別はARMv7から ・キャッシュ可能性(Cacheability) - Normalに適用される. + InnerとOuterキャッシュ領域に独立に設定できる. - Non-cacheable - Write-Through Cacheable - Write-Back Cacheable ●Atomicity,原子性([2] A3.5.3節) - Single-copy atomicity - Multi-copy atomicity ●Concurrent modification and execution of instructions([2] A3.5.4節) ●Normalメモリ([2] A3.5.5節) ●DeviceとStrongly-orderedメモリ([2] A3.5.6節) - ARMv7では,DeviceとStrongly-orderedの違いはshareabilityのみ + ARMv6では,CPSR変更時の振舞いにも違いがある. - DeviceとStrongly-orderedのアーキテクチャ要求の違いは, + Strongly-orderedメモリへのライトは,メモリ(ペリフェラル)に 到達した後でないと完了しない + Deviceメモリへのライトは,メモリ(ペリフェラル)に到達する前 でも完了できる ○メモリ順序モデル([1] B2.1節) ・ARMv5までは,メモリアクセス順序に関して整理されていなかった - 実装に基づいて以下のような概念があった + Write-Through Cacheable, Write-Back Cacheable + Non-Cacheable Bufferable, Non-Cacheable, Non-Bufferable - VMSA/PMSAのB(bufferable)ビットとC(cacheable)ビットで制御 - 互換性がないなどの課題を生じていた ・メモリ属性 Shareable(または Shared)… 複数の観測者から一貫して見えるか ・他の関係記述 VMSA on MMU,PMSA on MPU,キャッシュと分岐予測 VMSA:Virtual Memory System Architecture PMSA:Protected Memory System Architecture ○メモリアクセス順序([2] A3.8節) ●リードとライト ・明示的でないメモリアクセス(メモリアクセス順序の議論は当てはまらない) - 命令フェッチ - キャッシュのロードとライトバック - 変換テーブルのウォーク ・リード … 明示的なメモリアクセス - LDR, LDRB, LDRH, LDRSB, LDRSH - LDRT, LDRBT, LDRHT, LDRSBT, LDRSHT - LDREX, LDREXB, LDREXD, LDREXH … 同期プリミティブ - LDM, LDRD, POP, RFE - LDC, LDC2, VLDM, VLDR, VLD1, VLD2, VLD3, VLD4, VPOP - STREX, STREXB, STREXD, STREXH によるステータス値の返却 - SWP, SWPB(ARM命令セット)… 同期プリミティブ,ARMv6以降では非推奨 - TBB, TBH(Thumb命令セット) *他にJazelle関係 ・ライト … 明示的なメモリアクセス - STR, STRB, STRH - STRT, STRBT, STRHT - STREX, STREXB, STREXD, STREXH … 同期プリミティブ - STM, STRD, PUSH, SRS - STC, STC2, VPUSH, VSTM, VSTR, VST1, VST2, VST3, VST4 - SWP, SWPB(ARM命令セット)… 同期プリミティブ,ARMv6以降では非推奨 *他にJazelle関係 ・観測者 - 観測者(observer)とは,システム中でメモリにアクセスできるもの - プロセッサの以下の機構は独立した観測者と扱う + メモリのリードとライトを行う機構 + 命令フェッチ(命令キャッシュのフィル,直接フェッチ)の機構 + 変換テーブルウォークを行う機構 ・観測できる/グローバルに観測できるとは? *メモリへのアクセス順序は,すべてのオブザーバで一貫していることを想定 - あるメモリ位置へのライトが,ある観測者から観測できると言うのは… + 同じ観測者がそのメモリ位置をそれ以降にリードした場合に,以下のい ずれかになる * 書き込んだ値が参照できる, * 任意の観測者によって,それより後に書き込まれた値が参照できる + かつ,同じ観測者がそのメモリ位置にそれ以降に書き込んだ場合に, 後者のライトの方が後に実行されたものと順序付けられる時 - あるShareableなメモリ位置へのライトが,グローバルに観測できると言 うのは… + 任意の観測者がそのメモリ位置をそれ以降にリードした場合に,以下の いずれかになる * 書き込んだ値が参照できる, * 任意の観測者によって,それより後に書き込まれた値が参照できる + かつ,任意の観測者がそのメモリ位置にそれ以降に書き込んだ場合に, 後者のライトの方が後に実行されたものと順序付けられる時 - あるメモリ位置へのリードが,ある観測者から観測できると言うのは… + 同じ観測者がそのメモリ位置にそれ以降に書き込んだ場合でも, リードによって返る値が影響されない時 - あるShareableなメモリ位置へのリードが,グローバルに観測できると 言うのは… + 任意の観測者がそのメモリ位置にそれ以降に書き込んだ場合でも, リードによって返る値が影響されない時 Strongly-orderedメモリの場合には,さらに, - 副作用のあるペリフェラルがメモリマップされたメモリ位置のリードま たはライトが観測できるとは,リード・ライトが以下の条件を満た す時 + リストアップされている一般的な条件を満たす + ペリフェラルの状態に影響を開始する + 他のペリフェラル,プロセッサ,メモリに影響する場合には,関連す る副作用をトリガする *言い換えると,メモリアクセスがペリフェラルに到達すること ・リード・ライトの完了とは… <省略> ・Strongly-orderやDeviceメモリアクセスの完了は,すべての副作用がすべて  の観測者に見えるようになったことを意味しない ●メモリアクセスの順序要求([2] A3.8.2) ・用語の定義 アドレス依存性:リードアクセスによって返された値が,後続の読み出 しやライトアクセスの仮想アドレスの計算に使われる(必ずしも,仮想 アドレスを変えるとは限らない)時,アドレス依存性があると言う. 制御依存性:リードアクセスによって返された値が,条件フラグを決定 し,条件フラグの値が,後続のリードアクセスのアドレス決定に使われ る(条件付き実行や条件分岐)時,制御依存性があると言う. ・下の表は,明示的なアクセスA1とA2がこのプログラム順序で実行された時の  メモリアクセス順序を示す."<"は,メモリマップされたペリフェラルまたは  メモリブロックに,プログラム順序でアクセスが届くことを示す. A2 A1 Normal Device Strongly-ordered Normal - - - Device - < < Strongly-ordered - < <  *メモリマップされたペリフェラルとメモリブロックのサイズは,実装定義 (ただし,1KB以上)である.逆に言うと,1KBを超えるサイズのメモリブ ロックには,メモリアクセス順序の保証が実装依存になる. ・明示的でないメモリアクセスには,アクセス順序要求がない. ・その他に,以下の制約がある. - 単一の観測者からのアクセスは,ユニプロセッサのセマンティックス(命 令間の依存関係,コヒーレンシ)が維持される. - アドレス依存性があれば,どのオブザーバからもプログラム順序に見える. - 制御依存性だけでは,上の制約は保証されない. - リードアクセスが返した値が,後続のライトアクセスによって使われ る場合, <未完成> ・命令実行のプログラム順序 - 命令実行のプログラム順序は,プログラムの単純なシーケンシャル実行 における命令の順序である. - 実行における明示的なメモリアクセスは,以下のいずれかである Strictly Ordered < 厳密に順序通り起こる Ordered <= 順序通り起こるか,同時に起こる <未完成> ●メモリバリア([2] A3.8.3) ・ARMv6とARMv7は,3つの明示的なメモリバリア機能を持つ. - ARMv7では,メモリバリアは命令で実現される. - ARMv6では,メモリバリアはCP15レジスタへのライトで実現される. - データメモリバリア(DMB) - データ同期バリア(DSB) - 命令同期バリア(ISB) - DMBとDSBは,ロード/ストア命令によるメモリアクセスや,プロセッサ によるデータまたは統合キャッシュの保守操作に影響する.命令フェッ チやハードウェア変換テーブルアクセスによるメモリアクセスは,明示 的なアクセスではない(それらには影響しない). ・データメモリバリア(DMB)  【ARMv6での説明([1] B.2.6.1)】 - DMBより前のプログラム順序の命令によるすべての明示的なメモリアクセ スは,DMBより後のプログラム順序の命令によるすべての明示的なメモリ アクセスが観測される前に,グローバルに観測できる. - DMBは,そのプロセッサで実行される他の命令の実行順序には影響しない. →DMBは,前後の命令の明示的なメモリ操作の順序を保証する.それらの完 了は保証しない(この文は意味不明).  【ARMv7での違い】 - 共有可能ドメインとアクセスタイプを引数に取る. + デフォルトは,システム全体で,リード・ライトの両方. - アクセスの種類をグループAとグループBに分け,さらに詳細に定義. ・データ同期バリア(DSB)  【ARMv6での説明([1] B.2.6.2)】 - DSBが完了するのは,DSMの前の明示的なメモリアクセスがすべて完了し, かつ,この命令に先行するキャッシュ,分岐予測,TLB保守操作がすべて 完了した後である. - DSBの後続の命令は,DSBがするまで実行されない.  【ARMv7での違い】 - 共有可能ドメインとアクセスタイプを引数に取る. + デフォルトは,システム全体で,リード・ライトの両方. - 先行するキャッシュ,分岐予測,TLB保守操作の完了を待つのは,アクセ スタイプがリード・ライトの両方の場合に限る. - ARMv6以前は,DWB(DrainWriteBufferまたはDataWriteBarrier)とも呼 ばれていた. ・命令同期バリア(ISB) - ISBの後続の命令が,ISBが完了した後にキャッシュまたはメモリから フェッチされるように,プロセッサのパイプラインをフラッシュする. - ARMv6では,PrefetchFlushと呼ばれている. - ISBの前に実行されたコンテキスト変更操作が,ISBの後にフェッチされ る命令から見えることを保証する.コンテキスト変更操作の例は, + ASIDの変更 … [2]に書かれている + 完了した(←意味不明)キャッシュ・TLB・分岐予測保守操作 + システム制御レジスタ(CP15レジスタ)の変更など - ISBの後の分岐命令が,ISBの後に見えるコンテキストの分岐予測ロジッ クに書き込まれることを保証する.これは,命令列が正しく実行される ことを保証するために必要. - 命令を動的に書き換えた場合には,ISBとDMB/DSBの両方を使う必要があ る. ●CPSRの変更とメモリ順序モデル([1] B2.7.7) ・CPS,SETEND,MSR命令によるCPSRの変更(例外の発生/リターンを伴わない  CPSRに対する操作)は, - 手前の命令に影響しないことが保証される. - 以下を除いて,後続の命令から見えることが保証される. + 命令パーミッションのチェックに対する効果 ・CPSRの変更により,特権(またはセキュリティ)状態が変更される場合には,  命令パーミッションの効果が見えるためには,ISB,例外の発生,例外からの  リターンのいずれかを経なければならない. ・ARMv6では,CPSRの割込みマスクを変更する命令は,手前のStrongly-ordered  アクセスが完了するのを待つが,この仕様はARMv7には適用されない.同期が  必要な場合には,Strongly-orderedアクセスをする命令の直後に,DSBを使う  必要がある.([2] D12.3.4) - MSR命令と,PCを書き換える命令でSPSRをCPSRにコピーするものが該当. - ARMv6でも,この振舞いに依存することは推奨しない. - Deviceアクセスには適用されない.… どこに書いてあったか不明 ●バリア命令の使用例([2] D7) ・SEM(Sequential Execution Model)とは,ある命令を実行開始する前に,手  前の命令の実行が完了しているような実行モデル.最近のプロセッサでは,  内部的にはSEMになっておらず,バリア命令が必要になる. ・ここでは,ARMv6以降のDMBとDSBの使用例を説明 ・weakly consistent ordering の単純な例 初期化 [r1]=0, [r2]=0, r5=0x55, r6=0x66 P1: str r5, [r1] ldr r6, [r2] P2: str r6, [r2] ldr r5, [r1] ⇒ P1でr6=0,P2でr5=0になることがある strによるライトが,ldrによるリードより後回しにされた場合 ・Weely ordered におけるメッセージ渡し 初期化 r0=1, r5=0x55 P1: str r5, [r1] str r0, [r2] P2: wait until [r2]==1 ldr r5, [r1] ⇒ P2でr5=0になることがある P1の2つのstrによるライトの順序が入れ替わった場合 *P2と同じ処理を行うプロセッサが複数あると,プロセッサによって,r5に ロードしてくる値が異なる場合がある  バリアによる解決 P1: str r5, [r1] dmb [ST] … システム全体,ライトのみ str r0, [r2] P2: wait until [r2]==1 dmb ldr r5, [r1]  アドレス依存性による解決 P1: str r5, [r1] dmb [ST] … システム全体,ライトのみ str r0, [r2] P2: wait until [r2]==1 … この中でr12を使っていると想定 and r12, r12, #0 ldr r5, [r1,r12] ⇒ 最後のldrのアドレス計算にr12が必要。よって,r12へのリードは,この ldr命令に必ず先行する(さもないと,アドレスが計算できない) ・アドレス依存性と制御依存性 (a) アドレス依存性 ldr r1, [r0] ldr r2, [r1] ⇒ アドレス依存性があるため,逆順にならない (b) アドレス依存性 ldr r1, [r0] and r1, r1, #0 ldr r2, [r3,r1] ⇒ [r0]からロードしたr1の値は,実際には[r3,r1]に影響しないが, 形式的にはアドレス依存性があるため,逆順にならない (c) 制御依存性 ldr r1, [r0] cmp r1, #55 ldrne r2, [r3] ⇒ r1の値でldrneを実行するかどうかが変わるが,アドレス依存性は ない(制御依存性はある)ため,ldrneが先に(投機的に)実行 されてもよい(ロードするアドレスは変わらない) (d) 制御依存性(☆微妙☆) ldr r1, [r0] cmp r1, #55 movne r4, #22 ldr r2, [r3,r4] ⇒ r1の値でmovneを実行するかどうかが変わり,最後のldrでロードす るアドレスも変わるが,フラグ経由での結合はアドレス依存性と は扱われず,ldrが先に(投機的に)実行されてもよい(ロードす るアドレスは変わる) ☆いくつか省略 - 複数のオブザーバがいるメッセージ渡し(上に記載) - オブジェクトの構成時のアドレス依存性 リード側はアドレス依存性が使えることが多い - 複数のオブザーバがいる場合の因果関係 因果関係が崩れたように振る舞うことがある - 複数のオブザーバがいる複数アドレスへの書き込み <未完成> ●バリア命令の必要な状況(考察) ・DMBは,マルチプロセッサ(厳密には,マルチマスタ)向けの機能 - シングルプロセッサでは使う状況はないと思われる. ・DSBは,メモリアクセスが副作用を持つ時に,その副作用が起こるのを待つた  めに使う機能 - 割込みコントローラの割込み優先度マスクレジスタ(GICでは, GICC_PMR)に書き込むことで割込みを禁止した後は,DSBが必要である. これは,割込み優先度マスクレジスタへの書き込みがストアバッファに 蓄積された状態で,次の命令を実行し,その後に割込みが入ってしまう 可能性があるためである. - 優先度マスクレジスタに書き込むことで割込みを許可した後に,必ず割 込みが入るタイミングを作りたい場合は,DSBが必要である.割込みが入 るタイミングを作る必要がなく,割込が許可されるタイミングが遅くなっ ても問題なければ,DSBは必須ではない. ・ISBは,プログラムが書き換えられた(または,システム状態の変化により実  行すべきプログラムが変わった)時に,新しいプログラムを読み込むことを  保証するための命令 - カーネルでは,プログラムを書き換えることは想定していない. - システム制御レジスタの変更など,必要な場面は限られると思われる. ☆CPSRを書き換える前に,メモリバリアが必要? … どこに書いてあったか不明([2] D12.3.4のことか??) - CPSRのどのフラグを書き換えるかによっても話しが違う ○コプロセッサ ●コプロセッササポート([2] A2.9) ・16個までのコプロセッサをサポート ・以下のコプロセッサはARMが予約 ・コプロセッサ15(CP15) - システム制御 - 仮想メモリシステムアーキテクチャ(VMSA)でのレジスタ - 物理メモリシステムアーキテクチャ(PMSA)でのレジスタ - パフォーマンスモニタレジスタ ・コプロセッサ14(CP14) - デバッグ支援 ・コプロセッサ10と11(CP10とCP11) - 2つあわせて,浮動小数点とAdvanced SIMD ・コプロセッサ8,9,12,13 - 将来の拡張のためにARMが予約 ●コプロセッサ命令 ・コプロセッサのデータ処理の開始 - CDP, CDP2 CDP , , , , , ・ARMコアレジスタとコプロセッサレジスタの間データの転送 - MCR, MCR2 … ARMコアレジスタ→コプロセッサ '2'は,条件が付けられない.CP14,15には使えない MCR , , , , {, } - MCRR, MCRR2 … 2つのARMコアレジスタ→コプロセッサ MCRR , , , , - MRC, MRC2 … コプロセッサ → ARMコアレジスタ MRC , , , , {, } - MRRC, MRRC2 … コプロセッサ → 2つのARMコアレジスタ MRRC , , , , ・コプロセッサレジスタのロード/ストア - LDC, LDC2 (immediate) … メモリ→コプロセッサ LDC{L} , , [, #+/-]{!} LDC{L} , , [], #+/- LDC{L} , , [],