source: asp3_wo_tecs/trunk/arch/arm_gcc/doc/arm_memo.txt@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 51.3 KB
Line 
1 TOPPERS Confidential
2 TOPPERSプロジェクト 設計メモ
3 ARMのアーキテクチャに関するメモ
4
5 作成者
6: 高田広章(名古屋大学)
7 最終更新: 2015年8月18日
8
9○メモの位置づけ
10
11このメモは,ARMのアーキテクチャに関して,TOPPERSカーネルをポーティング
12するにあたって必
13要となる事項
14をまとめたものである.
15
16なお,このメモで対象とするARMアーキテクチャは以下のものである.ARM-Mアー
17キテクチャ(Cortex-Mシリーズ)およびARMv8アーキテクチャ(64ビットARM)
18は扱わない.
19
20ARMv4(ARM7TDMI,ARM9TDMI)
21ARMv5(ARM9E,ARM10E)
22ARMv6(ARM11)
23ARMv7-A(Cortex-A8,Cortex-A9,Cortex-A15など)
24ARMv7-R(Cortex-R4,Cortex-R5,Cortex-R7)
25
26ARMのMMU関連の事項
27については,「ARMのVMSAに関するメモ」を参ç…
28§ã™ã‚‹ã“と.
29
30○目次
31
32・参考文献
33・実行モード
34 - 特権レベル
35 - プロセッサモード
36・汎用レジスタ
37 - アプリケーションレベルの汎用レジスタ
38 - システムレベルの汎用レジスタ
39・プログラムステータスレジスタ
40 - アプリケーションレベルのステータスレジスタ
41 - システムレベルのステータスレジスタ
42 - 定数値の定義
43・複数のレジスタの操作
44 - アドレッシングモード
45 - レジスタのロード/ストア順序
46 - Wビット("!"の付加)
47 - Sビット("^"の付加)
48・例外
49 - 例外の種類とモード/ベクタ
50 - 例外受付時の処理
51 - 割込みの出å…
52¥å£
53 - ARMv6以降の例外処理命令
54・システム命令リファレンス
55 - ldm
56 - stm
57 - mrs
58 - msr
59 - cps
60・キャッシュと分岐予測
61 - キャッシュの識別
62 - キャッシュの振舞い
63 - キャッシュのイネーブル/ディスエーブル
64 - ARMv7におけるキャッシュと分岐予測のメンテナンス操作
65・TLBのメンテナンス操作
66 - VMSAにおけるTLBのメンテナンス操作
67・メモリタイプ・属性とメモリ順序モデル
68 - メモリタイプ
69 - メモリ属性
70 - DeviceとStrongly-orderedメモリ
71・メモリアクセス順序
72 - リードとライト
73 - メモリアクセスの順序要求
74 - メモリバリア
75 - CPSRの変更とメモリ順序モデル
76 - バリア命令の使用例
77・コプロセッサ
78 - コプロセッササポート
79 - コプロセッサ命令
80・CP15
81 - 仮想メモリシステムアーキテクチャ(VMSA)でのレジスタ
82 - 物理メモリシステムアーキテクチャ(PMSA)でのレジスタ
83 - パフォーマンスモニタレジスタ
84
85○参考文献
86
87[1] ARM Architecture Reference Manual, 2005
88DDI 01001.pdf
89※ ARMv6以前の定義
90
91[2] ARM Architecture Reference Manual - ARMv7-A and ARv7-R edition, 2014
92DDI0406C_C_arm_architecture_reference_manual.pdf
93※ ARMv7の定義,ARMv6以前との差分についても記載あり
94
95○用語集
96
97RAZ Read-As-Zero
98RAZ/WI Read-As-Zero Write-Ignored
99RAZ/SBZP Read-As-Zero Should-Be-Zero-or-Preserved on writes
100
101○実行モード
102
103●特権レベル
104
105ARMは,以下の特権レベルを持つ.
106
107 PL0 ユーザプログラムを実行するモード,非特権レベル
108 PL1 OSを実行するレベル,スーパバイザレベル(いわゆる特権レベル)
109 PL2 VMMを実行するレベル,ハイパバイザレベル〔仮想化拡張〕
110
111セキュリティ拡張において,Secure状æ…
112‹ã¯ï¼ŒPL2を持たない.言い換えると,
113PL2は,Non-secure状æ…
114‹ã«é™ã‚‰ã‚Œã‚‹ï¼ˆSecure状æ…
115‹ã§VMを用いることは想定してい
116ない).
117
118●プロセッサモード([2] B.1.3節)
119
120ARMは,以下のプロセッサモードを持つ.
121
122 User usr ユーザ
123 FIQ fiq FIQ
124 IRQ irq IRQ
125 Supervisor svc スーパバイザ
126 Abort abt アボート
127 Undefined und 未定義
128 System sys システム
129
130ユーザモードは非特権レベル(PL0),その他は特権レベル(PL1)である.ユー
131ザモードとシステムモード以外を,例外モードと総称する.
132
133セキュリティ拡張では,Secure状æ…
134‹ã¨Non-secure状æ…
135‹ã®åˆ‡ã‚Šæ›ãˆç”¨ã«ï¼Œä»¥ä¸‹ã®
136モードを持つ(以下,このメモでは扱わない).このモードは,特権レベル
137(PL1)であり,Secure状æ…
138‹ã«é™å®šã•ã‚Œã‚‹ï¼Ž
139
140 Monitor mon モニタ
141
142また,仮想化拡張では,以下のモードを持つ(以下,このメモでは扱わない).
143このモードは,ハイパバイザレベル(PL2)であり,Non-secure状æ…
144‹ã«é™å®šã•ã‚Œ
145る.
146
147 Hyp hyp ハイパバイザ
148
149○汎用レジスタ
150
151●アプリケーションレベルの汎用レジスタ
152
153ARMの汎用レジスタは,r0〜r15の16本ある.ただし,以下のレジスタは特殊目
154的に使われており,汎用レジスタとしては使用しない.
155
156 r13 スタックポインタ sp
157 r14 リンクレジスタ lr
158 r15 プログラムカウンタ pc
159
160また,以下のレジスタも特殊目的に使われる場合があるが,通常は汎用レジス
161タとして使用する.
162
163 r12 InterProcedure ip
164
165特殊目的のレジスタ以外で,スクラッチレジスタは以下の通り.
166
167 r0, r1, r2, r3, r12
168
169この他のレジスタ(r4〜r11)は,callee saved registerである.
170
171●システムレベルの汎用レジスタ
172
173各例外モードは,専用のsp(r13)とlr(r14)を持つ.FIQモードは,それに加
174えて,R8〜R12も専用に持つ.その他のレジスタ(pcも含む)は,ユーザモード
175とå…
176±ç”¨ã—ている.
177
178システムモードは,すべてのレジスタをユーザモードとå…
179±ç”¨ã—ている(つまり,
180システムモードとユーザモードの違いは,特権モードか否かの違いのみ).
181
182特定のモードのspとlrを,sp_usr,lr_usr,sp_svc,lr_svcのように表記する.
183
184○プログラムステータスレジスタ
185
186●アプリケーションレベルのステータスレジスタ
187
188アプリケーションレベルのステータスレジスタとして,APSR(Application
189Program Status Register)がある.APSRの構成は以下の通り.
190
191 ビット31(MSB) Nフラグ(Negative)
192 30 Zフラグ(Zero)
193 29 Cフラグ(Carry)
194 28 Vフラグ(Overflow)
195 27 Qフラグ(OverflowまたはSaturation,DSP命令用)
196 26〜24 常に0(RAZ/SBZP)
197 23〜20 予約
198 19〜16 GE[3:0] Greater or Equalフラグ(SIMD命令用)
199 15〜0 予約
200
201●システムレベルのステータスレジスタ
202
203システムレベルのステータスレジスタとして,CPSR(Current Program Status
204Register)がある.CPSRは,APSRの拡張である(言い換えると,APSRは,CPSR
205の一部が見えている).CPSRの構成は以下の通り.
206
207 ビット31〜27 N,Z,C,V,Qフラグ … APSRと同じ
208 26〜25 IT[1:0] 下のITビットの下位2ビット
209 24 Jビット(Jazelleビット)
210 23〜20 予約
211 19〜16 GE[3:0] Greater or Equalフラグ(SIMD命令用)… APSRと同じ
212 15〜10 IT[7:2] If-Then実行状æ…
213‹ãƒ“ット(Thumb IT命令用)
214 9 Eビット(エンディアン状æ…
215‹ï¼‰
216 8 Aビット(非同期アボート禁止)
217 7 Iビット(IRQ禁止)
218 6 Fビット(FIQ禁止)
219 5 Tビット(Thumbビット,Jビットと合わせて命令セットを指定)
220 4〜0 M[4:0] プロセッサモード
221
222CPSRは,すべてのモードでå…
223±ç”¨ã—ている(つまり,CPSRは1つしかない).
224
225モード切換え前のCPSRを保存するためのレジスタとして,SPSR(Saved
226Program Status Register)がある.SPSRは,各例外モード毎に専用に持つ(ユー
227ザモードとシステムモードは,SPSRを持たない).
228
229●ステータスレジスタに関する定数値の定義(arm.h)
230
231ステータスレジスタに設定する値を表すための定数値を用意しておく.
232
233/*
234 * CPSRの割込み禁止ビット
235 */
236#define CPSR_INT_MASK UINT_C(0xc0)
237#define CPSR_IRQ_BIT UINT_C(0x80)
238#define CPSR_FIQ_BIT UINT_C(0x40)
239
240/*
241 * CPSRのThumbビット
242 */
243#define CPSR_THUMB_BIT UINT_C(0x20)
244
245/*
246 * CPSRのモードビット
247 */
248#define CPSR_MODE_MASK UINT_C(0x1f)
249#define CPSR_USR_MODE UINT_C(0x10)
250#define CPSR_FIQ_MODE UINT_C(0x11)
251#define CPSR_IRQ_MODE UINT_C(0x12)
252#define CPSR_SVC_MODE UINT_C(0x13)
253#define CPSR_ABT_MODE UINT_C(0x17)
254#define CPSR_UND_MODE UINT_C(0x1b)
255#define CPSR_SYS_MODE UINT_C(0x1f)
256
257○複数のレジスタの操作
258
259●アドレッシングモード
260
261複数のレジスタのロード/ストアには,4つのアドレッシングモードがある.
262
263 IA(Increment After) 指定した番地から大きい方の番地に向かって使用
264 IB(Increment Before) 指定した番地+4から大きい方の番地に向かって使用
265 DA(Decrement After) 指定した番地から小さい方の番地に向かって使用
266 DB(Decrement Before) 指定した番地−4から小さい方の番地に向かって使用
267
268スタック操作の場合には,わかりやすくするために,以下の4つのアドレッシン
269グモードを用いる.
270
271 FD(Full Descending)
272 ED(Empty Descending)
273 FA(Full Ascending)
274 EA(Enpty Ascending)
275
276 Full … スタックポインタは使っている最後の番地を指す
277 Empty … スタックポインタは次に使う(つまり,使っていない)番地を指す
278 Descending … スタックは小さい番地に向かって伸びる
279 Ascending … スタックは大きい番地に向かって伸びる
280
281スタック操作には,通常はFDを使う.ldm命令とstm命令において,以下のよう
282に対応する.
283
284 スタック操作 スタック以外の操作
285 stmfd(Full Descending) stmdb(Decrement Before) … push
286 ldmfd(Full Descending) ldmia(Increment After) … pop
287
288●レジスタのロード/ストア順序
289
290番号の小さいレジスタを,小さいアドレスからロード/にストアする.
291
292●Wビット("!"の付加)
293
294Wビットが1の場合,ベースレジスタの値を(インクリメントまたはデクリメン
295トした値に)更新する.
296
297●Sビット("^"の付加)
298
299Sビットは,状況により2つの機能を持つ.
300
301pc(r15)を含むldmの場合
302 cpsrが,spsrからロード(復帰)される.
303
304stmとpc(r15)を含まないldmの場合
305 特権モードで使用した場合,ユーザモードのレジスタが転送される.
306
307○例外
308
309●例外の種類とモード/ベクタ
310
311例外タイプ 例外モード ベクタアドレス
312 ノーマル ハイベクタ
313----------------------------------------------------------------------
314Reset スーパバイザ 0x00000000 0xffff0000
315Undefined instructions 未定義 0x00000004 0xffff0004
316Supervisor Call スーパバイザ 0x00000008 0xffff0008
317Prefetch Abort アボート 0x0000000c 0xffff000c
318Data Abort アボート 0x00000010 0xffff0010
319IRQ (interrupt) IRQ 0x00000018 0xffff0018
320FIQ (fast interrupt) FIQ 0x0000001c 0xffff001c
321----------------------------------------------------------------------
322※Supervisor Callは,古いマニュアルではSoftware interrupt (SWI)と書かれている
323※Prefetch Abort:命令フェッチでのメモリアボート
324※Data Abort:データアクセスでのメモリアボート
325
326ベクタ割込みモード(CP15で制御される)の場合,IRQとFIQに対しては,上の
327ベクタアドレスは使われず,実装
328依存のアドレスが使われる.
329
330●例外受付時の処理
331
332・例外発生時点のpcとcpsrが,該当する例外モードのlrとspsrに保存される.
333 - lrに保存される値は,状況によって異なる(後述).
334
335・〔セキュリティ拡張〕必
336要な場合には,Secureモードに切り換える.
337
338・cpsrが以下のように変更される.
339 - モードが受け付けた例外のモードに変更される.
340 - 該当する割込みマスクがセットされる.
341 + ResetかFIQなら,FIQを禁止する.
342 + IRQを禁止する.
343 +〔ARMv6以降〕UNDEFとSWI以外なら,非同期アボートを禁止する.
344 - 命令セット(J,T)が例外エントリが要求される値にセットされる.
345 + ARM状æ…
346‹ã«ã™ã‚‹ï¼Ž
347 - エンディアン状æ…
348‹ï¼ˆE)が例外エントリが要求される値にセットされる.
349 + CP15のreg1_EEビットで決まる.
350 - IT[7:0]が0にクリアされる.
351
352・ベクタアドレスに分岐する.
353
354●lrに保存される値
355
356例外タイプ 望ましい戻り番地 オフセット
357----------------------------------------------------------------------
358Undefined instructions 未定義命令の番地 +4/2(*)
359Supervisor Call SVCの次の命令の番地 +0
360Prefetch Abort アボートされた命令の番地 +4
361Data Abort アボートを生成した命令の番地+8
362IRQ (interrupt) 次に実行すべき番地 +4
363FIQ (fast interrupt) 次に実行すべき番地 +4
364----------------------------------------------------------------------
365(*) ARMモードでは4,Thumbモードでは2
366※望ましい戻り番地は,あくまでも1つの想定と思われる.例えば,未定義命令
367 をエミュレーションした場合には,その次の番地へ戻る方が普通であろう.
368
369●割込みの出å…
370¥å£
371
372以下は,モードを変更しない場合の割込みの出å…
373¥å£ã®å‡¦ç†ã§ã‚る.
374
375割込みのå…
376¥å£ã§ã¯ï¼Œlrから4を引いて戻り番地を求めた後,必
377要なレジスタと
378lr(戻り番地)をスタックに保存する.
379
380 sub lr, lr, #4
381 stmfd sp!, {<other_registers>, lr}
382
383割込みの出口では,必
384要なレジスタと戻り番地をスタックから(戻り番地はpc
385に),cpsrをspsrから復帰する.最後に"^"を付けることで,cpsrをspsrから復
386帰することを示す.
387
388 ldmfd sp!, {<other_registers>, pc}^
389
390この命令は,システムモードでは使えない(spsrがないため).
391
392●ARMv6以降の例外処理命令
393
394ARMv6から,CPS命令,SRS命令,RFE命令が用意された.これらの命令がある場
395合とない場合で,例外処理の出å…
396¥å£ã®æœ€é©ãªã‚³ãƒ¼ãƒ‰ãŒç•°ãªã‚‹ï¼Ž
397
398srs(Store Return State)… 現在のモードのlrとspsrを,別のモードのspを
399用いて保存するための命令.lrが小さい側の番地,spsrが大きい側の番地に保
400存される.システムモードでは使えない(spsrがないため).
401
402例)srsfd #CPSR_SVC_MODE! … lr(例外からの戻りå…
403ˆï¼‰ã¨spsr(例外発生前
404 のcpsr)を,スーパバイザモードのスタックに
405 保存する.
406
407rfe(Return From Exception)… pcとcpsrを,復帰する命令.SRSで保存され
408た状æ…
409‹ã«æˆ»ã‚‹ãŸã‚ã«ç”¨ã„る.
410
411例)rfefd sp! … pcとcpsrを,現在のモードのスタックから復
412 帰する.
413
414cps(Change Processor State)… cpsrの割込みマスクとモードビットを変更
415するための命令.
416
417○システム命令リファレンス
418
419●ldm
420
421(1) ldm<アドレッシングモード><条件> <Rn>{!}, <レジスタリスト>
422
423Rnで示される連続した番地から,レジスタリストにリストアップされたレジス
424タに値をロードする.ユーザモードを含むすべてのモードで使用できる.
425
426(2) ldm<アドレッシングモード><条件> <Rn>, <PC以外のレジスタリスト>^
427 ※最後に"^"がある.
428
429Rnで示される連続した番地から,レジスタリストにリストアップされた「ユー
430ザモードのレジスタ」に値をロードする.システムモード以外の特権モードで
431使用できる."!"は使えない.
432
433(3) ldm<アドレッシングモード><条件> <Rn>{!}, <PCを含むレジスタリスト>^
434 ※最後に"^"がある.
435
436Rnで示される連続した番地から,レジスタリストにリストアップされたレジス
437タに値をロードする.また,現在のモードのspsrを,cpsrにコピーする.シス
438テムモード以外の特権モードで使用できる.
439
440●stm
441
442(1) stm<アドレッシングモード><条件> <Rn>{!}, <レジスタリスト>
443
444Rnで示される連続した番地から,レジスタリストにリストアップされたレジス
445タに値をストアする.ユーザモードを含むすべてのモードで使用できる.
446
447(2) stm<アドレッシングモード><条件> <Rn>, <レジスタリスト>^
448 ※最後に"^"がある.
449
450Rnで示される連続した番地から,レジスタリストにリストアップされた「ユー
451ザモードのレジスタ」に値をストアする.システムモード以外の特権モードで
452使用できる."!"は使えない.
453
454●mrs
455
456特殊レジスタ(ステータスレジスタ)を,汎用レジスタにコピーする.
457ARMv7VE(仮想化拡張)では,他のモードのレジスタを汎用レジスタにコピーす
458る機能も持つ.
459
460(1) mrs<条件> <Rd>, <特殊レジスタ記述>
461
462特殊レジスタを,汎用レジスタRdにコピーする.
463
464<特殊レジスタ記述>には,以下のいずれかを指定する.
465 - apsr
466 - cpsr … ユーザモードで使った場合は,apsrを意味する.
467 - spsr … ユーザモードでは使えない.
468
469●msr
470
471特殊レジスタ(ステータスレジスタ)に,即値または汎用レジスタの値をコピー
472する.ARMv7VE(仮想化拡張)では,他のモードのレジスタに汎用レジスタの値
473をコピーする機能も持つ.
474
475この命令でEビット(エンディアン状æ…
476‹ï¼‰ã‚’書き換えるべきではない.setend命
477令を使うべき.
478
479(1) msr<条件> <特殊レジスタ記述>, #<定数>
480
481特殊レジスタ(の一部)に,即値をコピーする.
482
483<特殊レジスタ記述>には,以下のいずれかを指定する.
484 - apsr_nzcvq … cpsr_fと同じ
485 - apsr_g … cpsr_sと同じ
486 - apsr_nzcvqg … cpsr_fsと同じ
487 - cpsr_<フィールド指定>
488 - spsr_<フィールド指定>
489
490<フィールド指定>には,以下の文字の列を記述する.
491 - c … PSRのビット7〜0(Iビット,Fビット,Tビット,M[4:0])
492 - x … PSRのビット15〜8(IT[7:2],Eビット,Aビット)
493 - s … PSRのビット23〜16(GE[3:0])
494 - f … PSRのビット31〜24(N,Z,C,V,Qフラグ,IT[1:0],Jビット)
495
496(2) msr<条件> <特殊レジスタ記述>, <Rn>
497
498特殊レジスタ(の一部)に,汎用レジスタRnの値をコピーする.<特殊レジスタ
499記述>は,上と同様.
500
501●cps … ARMv6以降
502
503プロセッサの状æ…
504‹ï¼ˆCPSRのAビット,Iビット,Fビット,プロセッサモード)を
505変更する.
506
507(1) cpsie <割込みフラグ>{, #<モード>}
508
509指定した割込みフラグを0にする(許可する).また,(指定した場合には)プ
510ロセッサモードを変更する.
511
512<割込みフラグ>には,以下の文字の列を記述する.
513 - a … Aビット(非同期アボート禁止)
514 - i … Iビット(IRQ禁止)
515 - f … Fビット(FIQ禁止)
516
517<モード>には,0〜31の値(ステータスレジスタの下位5ビット)を記述する.
518
519例)cpsie i … IRQを許可(cpsr中のIビットをクリア)
520
521(2) cpsid <割込みフラグ>{, #<モード>}
522
523指定した割込みフラグを1にする(禁止する).また,(指定した場合には)プ
524ロセッサモードを変更する.<割込みフラグ>と<モード>は上と同様.
525
526例)cpsid i … IRQを禁止(cpsr中のIビットをセット)
527例)cpsid if … IRQとFIQを禁止
528例)cpsid i,#CPSR_SVC_MODE … IRQを禁止して,スーパバイザモードに
529
530(3) cps #<モード>
531
532プロセッサモードを変更する.<モード>は上と同様.
533
534例)cps #CPSR_USR_MODE … ユーザモードに
535
536○キャッシュと分岐予測([2] B2.2節)
537
538・以前のアーキテクチャ
539 - ARMv6については,[2] D12.6.2節
540 - ARMv4, ARMv5については,[2] D15.6.1節
541
542●キャッシュの識別([2] B2.2.1節)
543
544・キャッシュタイプレジスタ(CTR)
545 - 最短ライン長など,どのようなキャッシュがついているかを読み出せる
546 - 詳しくは,[2] B4.1.42節
547 - ARMv6以前はフォーマットが異なる
548
549・キャッシュレベルIDレジスタ(CLIDR)
550 - 各レベル(7レベルまで)のキャッシュのタイプを読み出せる
551 - コヒーレンスに関する情
552報を読み出せる
553 - ARMv6以前にはない
554
555・キャッシュサイズ選択レジスタ(CSSELR)
556 - 現在のキャッシュサイズIDレジスタ(CCSIDR)を選択する
557 - キャッシュレベルとタイプ(命令 or データ/統合)を指定する
558 - ARMv6以前にはない
559
560・キャッシュサイズIDレジスタ(CCSIDR)
561 - キャッシュレベル毎にある(CSSELRで選択する)
562 - キャッシュに関する情
563報を読み出せる
564 + write-through/write-back/read-allocation/write-allocatioができるか
565 + セット数,連想度,ラインサイズ
566 - ARMv6以前にはない
567
568●キャッシュの振舞い([2] B2.2.2節)
569
570<省略>
571
572●キャッシュのイネーブル/ディスエーブル([2] B2.2.3節)
573
574・ARMv7のシステム制御レジスタ
575 - CビットとIビットで,キャッシュのイネーブル/ディスエーブルを行う
576 - Cビット:すべてのレベルの統合/データキャッシュを制御
577 - Iビット:すべてのレベルの命令キャッシュを制御
578 - より細かな制御は実装
579依存
580
581・ARMv6のシステム制御レジスタ
582 - CビットとIビットは,レベル1キャッシュの制御を行う
583 - Wビットでライトバッファの制御を行う
584
585●ARMv7におけるキャッシュと分岐予測のメンテナンス操作([2] B2.2.6節)
586
587・以前のアーキテクチャ
588 - ARMv6については,[2] D12.7.10節
589 - ARMv4, ARMv5については,[2] D15.7.8節
590
591・用語の定義
592 - MVA(Modified Virtual Address)
593 + メンテナンスする場所をメモリ中のアドレスで指定する
594 + 高速コンテキストスイッチ拡張がない時は,VA(Virtual Address)に一致
595 *高速コンテキストスイッチ拡張は,ARMv6以降では推奨されない
596 + MMUがない時はPA(Physical Address)に一致
597 - セット/ウェイ(set/way)
598 + メンテナンスする場所をキャッシュ中のセットとウェイで指定する
599 + レベル(Level)… キャッシュのレベル.小さい方がプロセッサに近い
600 + セット(Set)
601 + ウェイ(Way)
602 - クリーン(clean)
603 + 自分が行った更新が,他のオブザーバからも見えるように保証する
604 - 無効化(invalidate)
605 + 他のオブザーバが行った更新が,自分から見えるように保証する
606 + 自分が行った更新が失われることになる場合がある
607 - クリーンと無効化(clean and invalidate)
608 + クリーンを行った後に無効化を行う
609 - PoC(一貫性ポイント)… MVAの場合
610 + すべてのエージェントが参ç…
611§ã™ã‚‹å…
612±é€šã®å ´æ‰€
613 + 一般にはメインメモリ
614 - PoU(統合ポイント)… MVAの場合
615 + プロセッサのPoUとは,そのプロセッサの命令/データアクセス,
616 ページテーブルウォークが参ç…
617§ã™ã‚‹å…
618±é€šã®å ´æ‰€
619 + Inner Shareableå…
620±æœ‰ãƒ‰ãƒ¡ã‚¤ãƒ³ã®PoUとは,ドメイン内
621のすべての
622 プロセッサの命令/データアクセス,ページテーブルウォークが
623 参ç…
624§ã™ã‚‹å…
625±é€šã®å ´æ‰€
626 - LoC(Level of Coherence)
627 + PoCまでの一貫性を保つためにメンテナンスが必
628要な最終キャッシュ
629 レベル
630 - LoUU(Level of Unification, Uniprocessor)
631 + プロセッサのPoUまでの一貫性を保つためにメンテナンスが必
632要な
633 最終キャッシュレベル
634 - LoUIS(Level of unification, Inner Shareable)
635 + Inner Shareableå…
636±æœ‰ãƒ‰ãƒ¡ã‚¤ãƒ³ã®PoUまでの一貫性を保つためにメン
637 テナンスが必
638要な最終キャッシュレベル
639
640・アドレス(VMA)ベースの操作におけるキャッシュ階層の抽象化
641 - PoCかPoU
642 - キャッシュタイプレジスタ(CTR)にキャッシュのラインサイズを保持
643 + この単位でメンテナンスするのが最も効率的
644
645・セット/ウェイベースの操作におけるキャッシュ階層の抽象化
646 - クリーン操作は,指定されたレベルから,少なくとも次のレベルへクリーンする
647 - 無効化操作は,指定されたレベルのみを無効化する
648
649●VMSAにおけるキャッシュと分岐予測のメンテナンス操作([2] B4.2.1節)
650
651・ARMv7-A(VMSA)におけるキャッシュ・分岐予測メンテナンス操作
652 - ICIALLIS, ICIALLU, ICIMVAU … 命令キャッシュと分岐予測の無効化
653 - BPIALLIS, CPIALL, CPIMVA … 分岐予測の無効化
654 - DCIMVAC, DCISW … データ/統合キャッシュの無効化
655 - DCCMVAC, DCCSW, DCCMVAU … データ/統合キャッシュのクリーン
656 - DCCIMVAC, DCCISW … データ/統合キャッシュのクリーン&無効化
657
658 ----------------------------------------------------------------------
659 ICIALLUIS すべての命令キャッシュを無効化,Inner ShareableからPoU
660 分岐予測もフラッシュ
661 ICIALLU PoUまでのすべての命令キャッシュを無効化,分岐予測も
662 ICIMVAU PoUまでのMVAで指定した命令キャッシュラインを無効化
663
664 BPIALLIS すべての分岐予測エントリを無効化,Inner Sharable
665 BPIALL すべての分岐予測エントリを無効化
666 BPIMVA 分岐予測からMVAを無効化
667
668 DCIMVAC PoCまでのMVAで指定したデータ/統合キャッシュを無効化
669 DCISW Set/wayで指定したデータ/統合キャッシュを無効化
670 DCCMVAC PoCまでのMVAで指定したデータ/統合キャッシュをクリーン
671 DCCSW Set/wayで指定したデータ/統合キャッシュをクリーン
672 DCCMVAU PoUまでのMVAで指定したデータ/統合キャッシュをクリーン
673 DCCIMVAC PoCまでのMVAで指定したデータ/統合キャッシュをクリーン&無効化
674 DCCISW Set/wayで指定したデータ/統合キャッシュをクリーン&無効化
675 ----------------------------------------------------------------------
676
677・ARMv6での違い([2] D12.7.10節)
678・ARMv4, ARMv5での違い([2] D15.7.8節)
679 - レベル1キャッシュのみを操作する
680 ※ ARMv7では複数のレベルのキャッシュを操作する
681 - ARMv7に対応するものがある(以下で→の右は,ARMv7の同等の操作)
682 + Invalidate instruction cache →ICIALLU
683 + Invalidate instruction cache line by MVA →ICIMVAU
684 + Invalidate all branch predictors →BPIALL
685 + Invalidate branch predictor entry by MVA →BPIMVA
686 + Invalidate data cache line by MVA →DCIMVAC
687 + Invalidate data cache line by set/way →DCISW
688 + Clean data cache line by MVA →DCCMVAC/DCCMVAU
689 + Clean data cache line by set/way →DCCSW
690 + Clean and Invalidate data cache line by MVA →DCCIMVAC
691 + Clean and Invalidate data cache line by set/way →DCCISW
692
693 - データキャッシュå…
694¨ä½“に対する操作はARMv7にはない
695 + Invalidate data cache
696 + Clean data cache(ARMv6のみ)
697 + Clean and Invalidate data cache(ARMv6のみ)
698 - ARMv7では,統合キャッシュの操作は,データキャッシュの操作に統一さ
699 れているが,ARMv6以前では別々
700にある
701 + Invalidate unified cache, or instruction cache and data cache
702 + Invalidate unified cache line by MVA
703 + Invalidate unified cache line by set/way
704 + Clean entire unified cache
705 + Clean unified cache line by MVA
706 + Clean unified cache line by set/way
707 + Clean and invalidate entire unified cache
708 注意:この操作は[1]に掲載されているが,[2]には掲載されていない
709 + Clean and Invalidate unified cache line by MVA
710 + Clean and Invalidate unified cache line by set/way
711 - Set/way指定による命令キャッシュの無効化はARMv7にはない
712 + Invalidate instruction cache line by set/way
713 - ARMv6以前のみにある操作(オプション)
714 + Test and Clean data cache … 下に説明
715 + Test and Clean and Invalidate data cache … 下に説明
716 + Prefetch instruction cache line by MVA … TLBロックダウンで使う
717 - ARMv6のみにある特殊な操作
718 + Cache Dirty Status Register … å…
719¨ä½“をクリーンする時に使う
720
721・ARMv6以前での,Test and Clean/Test and Clean and Invalidateの使い方
722 - クリーン/クリーン&無効化を効率的に行うために用意されている
723 - 条件フラグをデスティネーションとするMRC命令を使う
724 → グローバルキャッシュダーティ状æ…
725‹ãŒZフラグにå…
726¥ã‚‹
727
728 - データキャッシュå…
729¨ä½“のクリーン
730 tc_loop:
731 MRC p15, 0, APSR_nzcv, c7, c10, 3 ; test and clean
732 BNE tc_loop
733
734 - データキャッシュå…
735¨ä½“のクリーン&無効化
736 tci_loop:
737 MRC p15, 0, APSR_nzcv, c7, c14, 3 ; test, clean and invalidate
738 BNE tci_loop
739
740○TLBのメンテナンス操作
741
742●VMSAにおけるTLBのメンテナンス操作([2] B4.2.2節)
743
744※ Hypモードの時は別途規定
745
746・ARMv7-A(VMSA)におけるTLBメンテナンス操作
747 - ITLBIALL, ITLBIMVA, ITLBIASID … 命令TLB
748 - DTLBIALL, DTLBIMVA, DTLBIASID … データTLB
749 - TLBIALL, TLBIMVA, TLBIASID … 統合TLB
750
751・マルチプロセッサ拡張で以下が追加(初期のARMv7にはない)
752 - TLBIMVAA
753 - TLBIALLIS, TLBIMVAIS, TLBIASIDIS, TLBIMVAAIS
754
755・命令/データ/統合の使い分け
756 - 命令TLBとデータTLBが別に実装
757されている場合,統合TLB操作は両者
758を操作する
759 - 統合TLBが実装
760されている場合,命令/データTLB操作は統合TLBを操作する
761 - 命令/データTLB操作を使うことは推奨しない
762
763・操作の種類
764 ...IALL … すべてのTLBを無効化する
765 ...IMVA … アドレス(MVA)指定でTLBを無効化する
766 ...IASID … ASID指定でTLBを無効化する
767 ...IMVAA … アドレスとASIDの両方を指定してTLBを無効化する
768
769・以前のアーキテクチャ
770 - ARMv6については,ARMv7-Aと同じ
771 - ARMv4, ARMv5については,以下のみを持つ([2] D15.7.10節)
772 + ITLBIALL, ITLBIMVA … 命令TLB
773 + DTLBIALL, DTLBIMVA … データTLB
774 + TLBIALL, TLBIMVA … 統合TLB
775
776○メモリタイプ・属性とメモリ順序モデル([2] A3.5節)
777
778●メモリタイプ([2] A3.5.1節)
779
780・3つのメモリタイプ(ARMv6以降)
781 Normal
782 Device
783 Strongly-ordered
784
785・Strongly-ordered,Deviceメモリには,以下の制限がある.
786 - アクセスの回数,順序,サイズが保存される(キャッシュされない).
787 - リード・ライトとも,投機的に実行されない.
788 + ただし,ページテーブルウォークは投機的に実行される.
789 - リード・ライトアクセスが繰り返されない.
790
791●メモリ属性([2] A3.5.2節)
792
793・å…
794±æœ‰å¯èƒ½æ€§ï¼ˆShareability)
795 - Normalと(LPAEを含まない実装
796では)Deviceに適用される.
797 ※ LPAE:Large Physical Address Extension
798 + LPAEを含む実装
799では,Deviceは常にOuter Shareable
800 + DeviceをShareableとOuter Shareable以外にすることは推奨しない.
801 - Outer Shareable
802 - Inner Shareable
803 - Non-shareable
804 - Outer ShareableとInner Shareableの区別はARMv7から
805
806・キャッシュ可能性(Cacheability)
807 - Normalに適用される.
808 + InnerとOuterキャッシュ領域に独立に設定できる.
809 - Non-cacheable
810 - Write-Through Cacheable
811 - Write-Back Cacheable
812
813●Atomicity,原子性([2] A3.5.3節)
814
815 - Single-copy atomicity
816 - Multi-copy atomicity
817
818●Concurrent modification and execution of instructions([2] A3.5.4節)
819
820●Normalメモリ([2] A3.5.5節)
821
822●DeviceとStrongly-orderedメモリ([2] A3.5.6節)
823 - ARMv7では,DeviceとStrongly-orderedの違いはshareabilityのみ
824 + ARMv6では,CPSR変更時の振舞いにも違いがある.
825 - DeviceとStrongly-orderedのアーキテクチャ要求の違いは,
826 + Strongly-orderedメモリへのライトは,メモリ(ペリフェラル)に
827 到達した後でないと完了しない
828 + Deviceメモリへのライトは,メモリ(ペリフェラル)に到達する前
829 でも完了できる
830
831○メモリ順序モデル([1] B2.1節)
832
833・ARMv5までは,メモリアクセス順序に関して整理されていなかった
834 - 実装
835に基づいて以下のような概念があった
836 + Write-Through Cacheable, Write-Back Cacheable
837 + Non-Cacheable Bufferable, Non-Cacheable, Non-Bufferable
838 - VMSA/PMSAのB(bufferable)ビットとC(cacheable)ビットで制御
839 - 互換性がないなどの課題を生じていた
840
841・メモリ属性
842 Shareable(または Shared)… 複数の観測者
843から一貫して見えるか
844
845・他の関係記述
846 VMSA on MMU,PMSA on MPU,キャッシュと分岐予測
847 VMSA:Virtual Memory System Architecture
848 PMSA:Protected Memory System Architecture
849
850○メモリアクセス順序([2] A3.8節)
851
852●リードとライト
853
854・明示的でないメモリアクセス(メモリアクセス順序の議論は当てはまらない)
855 - 命令フェッチ
856 - キャッシュのロードとライトバック
857 - 変換テーブルのウォーク
858
859・リード … 明示的なメモリアクセス
860 - LDR, LDRB, LDRH, LDRSB, LDRSH
861 - LDRT, LDRBT, LDRHT, LDRSBT, LDRSHT
862 - LDREX, LDREXB, LDREXD, LDREXH … 同期プリミティブ
863 - LDM, LDRD, POP, RFE
864 - LDC, LDC2, VLDM, VLDR, VLD1, VLD2, VLD3, VLD4, VPOP
865 - STREX, STREXB, STREXD, STREXH によるステータス値の返却
866 - SWP, SWPB(ARM命令セット)… 同期プリミティブ,ARMv6以降では非推奨
867 - TBB, TBH(Thumb命令セット)
868 *他にJazelle関係
869
870・ライト … 明示的なメモリアクセス
871 - STR, STRB, STRH
872 - STRT, STRBT, STRHT
873 - STREX, STREXB, STREXD, STREXH … 同期プリミティブ
874 - STM, STRD, PUSH, SRS
875 - STC, STC2, VPUSH, VSTM, VSTR, VST1, VST2, VST3, VST4
876 - SWP, SWPB(ARM命令セット)… 同期プリミティブ,ARMv6以降では非推奨
877 *他にJazelle関係
878
879・観測者
880
881 - 観測者
882(observer)とは,システム中でメモリにアクセスできるもの
883 - プロセッサの以下の機構は独立した観測者
884と扱う
885 + メモリのリードとライトを行う機構
886 + 命令フェッチ(命令キャッシュのフィル,直接フェッチ)の機構
887 + 変換テーブルウォークを行う機構
888
889・観測できる/グローバルに観測できるとは?
890
891 *メモリへのアクセス順序は,すべてのオブザーバで一貫していることを想定
892
893 - あるメモリ位置へのライトが,ある観測者
894から観測できると言うのは…
895 + 同じ観測者
896がそのメモリ位置をそれ以降にリードした場合に,以下のい
897 ずれかになる
898 * 書き込んだ値が参ç…
899§ã§ãã‚‹ï¼Œ
900 * 任意の観測者
901によって,それより後に書き込まれた値が参ç…
902§ã§ãã‚‹
903 + かつ,同じ観測者
904がそのメモリ位置にそれ以降に書き込んだ場合に,
905 後者
906のライトの方が後に実行されたものと順序付けられる時
907
908 - あるShareableなメモリ位置へのライトが,グローバルに観測できると言
909 うのは…
910 + 任意の観測者
911がそのメモリ位置をそれ以降にリードした場合に,以下の
912 いずれかになる
913 * 書き込んだ値が参ç…
914§ã§ãã‚‹ï¼Œ
915 * 任意の観測者
916によって,それより後に書き込まれた値が参ç…
917§ã§ãã‚‹
918 + かつ,任意の観測者
919がそのメモリ位置にそれ以降に書き込んだ場合に,
920 後者
921のライトの方が後に実行されたものと順序付けられる時
922
923 - あるメモリ位置へのリードが,ある観測者
924から観測できると言うのは…
925 + 同じ観測者
926がそのメモリ位置にそれ以降に書き込んだ場合でも,
927 リードによって返る値が影響されない時
928
929 - あるShareableなメモリ位置へのリードが,グローバルに観測できると
930 言うのは…
931 + 任意の観測者
932がそのメモリ位置にそれ以降に書き込んだ場合でも,
933 リードによって返る値が影響されない時
934
935 Strongly-orderedメモリの場合には,さらに,
936
937 - 副作用のあるペリフェラルがメモリマップされたメモリ位置のリードま
938 たはライトが観測できるとは,リード・ライトが以下の条件を満た
939 す時
940 + リストアップされている一般的な条件を満たす
941 + ペリフェラルの状æ…
942‹ã«å½±éŸ¿ã‚’開始する
943 + 他のペリフェラル,プロセッサ,メモリに影響する場合には,関連す
944 る副作用をトリガする
945 *言い換えると,メモリアクセスがペリフェラルに到達すること
946
947・リード・ライトの完了とは… <省略>
948
949・Strongly-orderやDeviceメモリアクセスの完了は,すべての副作用がすべて
950 の観測者
951に見えるようになったことを意味しない
952
953●メモリアクセスの順序要求([2] A3.8.2)
954
955・用語の定義
956
957 アドレス依存性:リードアクセスによって返された値が,後続の読み出
958 しやライトアクセスの仮想アドレスの計算に使われる(必
959ずしも,仮想
960 アドレスを変えるとは限らない)時,アドレス依存性があると言う.
961
962 制御依存性:リードアクセスによって返された値が,条件フラグを決定
963 し,条件フラグの値が,後続のリードアクセスのアドレス決定に使われ
964 る(条件付き実行や条件分岐)時,制御依存性があると言う.
965
966・下の表は,明示的なアクセスA1とA2がこのプログラム順序で実行された時の
967 メモリアクセス順序を示す."<"は,メモリマップされたペリフェラルまたは
968 メモリブロックに,プログラム順序でアクセスが届くことを示す.
969
970 A2
971 A1 Normal Device Strongly-ordered
972 Normal - - -
973 Device - < <
974 Strongly-ordered - < <
975
976 *メモリマップされたペリフェラルとメモリブロックのサイズは,実装
977定義
978 (ただし,1KB以上)である.逆に言うと,1KBを超
979えるサイズのメモリブ
980 ロックには,メモリアクセス順序の保証が実装
981依存になる.
982
983・明示的でないメモリアクセスには,アクセス順序要求がない.
984
985・その他に,以下の制約がある.
986 - 単一の観測者
987からのアクセスは,ユニプロセッサのセマンティックス(命
988 令間の依存関係,コヒーレンシ)が維持される.
989 - アドレス依存性があれば,どのオブザーバからもプログラム順序に見える.
990 - 制御依存性だけでは,上の制約は保証されない.
991 - リードアクセスが返した値が,後続のライトアクセスによって使われ
992 る場合,
993
994 <未完成>
995
996・命令実行のプログラム順序
997 - 命令実行のプログラム順序は,プログラムの単純なシーケンシャル実行
998 における命令の順序である.
999
1000 - 実行における明示的なメモリアクセスは,以下のいずれかである
1001 Strictly Ordered < 厳密に順序通り起こる
1002 Ordered <= 順序通り起こるか,同時に起こる
1003
1004 <未完成>
1005
1006●メモリバリア([2] A3.8.3)
1007
1008・ARMv6とARMv7は,3つの明示的なメモリバリア機能を持つ.
1009 - ARMv7では,メモリバリアは命令で実現される.
1010 - ARMv6では,メモリバリアはCP15レジスタへのライトで実現される.
1011
1012 - データメモリバリア(DMB)
1013 - データ同期バリア(DSB)
1014 - 命令同期バリア(ISB)
1015
1016 - DMBとDSBは,ロード/ストア命令によるメモリアクセスや,プロセッサ
1017 によるデータまたは統合キャッシュの保守操作に影響する.命令フェッ
1018 チやハードウェア変換テーブルアクセスによるメモリアクセスは,明示
1019 的なアクセスではない(それらには影響しない).
1020
1021・データメモリバリア(DMB)
1022
1023 【ARMv6での説明([1] B.2.6.1)】
1024 - DMBより前のプログラム順序の命令によるすべての明示的なメモリアクセ
1025 スは,DMBより後のプログラム順序の命令によるすべての明示的なメモリ
1026 アクセスが観測される前に,グローバルに観測できる.
1027 - DMBは,そのプロセッサで実行される他の命令の実行順序には影響しない.
1028 →DMBは,前後の命令の明示的なメモリ操作の順序を保証する.それらの完
1029 了は保証しない(この文は意味不明).
1030
1031 【ARMv7での違い】
1032 - å…
1033±æœ‰å¯èƒ½ãƒ‰ãƒ¡ã‚¤ãƒ³ã¨ã‚¢ã‚¯ã‚»ã‚¹ã‚¿ã‚¤ãƒ—を引数に取る.
1034 + デフォルトは,システムå…
1035¨ä½“で,リード・ライトの両方.
1036 - アクセスの種類をグループAとグループBに分け,さらに詳細に定義.
1037
1038・データ同期バリア(DSB)
1039
1040 【ARMv6での説明([1] B.2.6.2)】
1041 - DSBが完了するのは,DSMの前の明示的なメモリアクセスがすべて完了し,
1042 かつ,この命令にå…
1043ˆè¡Œã™ã‚‹ã‚­ãƒ£ãƒƒã‚·ãƒ¥ï¼Œåˆ†å²äºˆæ¸¬ï¼ŒTLB保守操作がすべて
1044 完了した後である.
1045 - DSBの後続の命令は,DSBがするまで実行されない.
1046
1047 【ARMv7での違い】
1048 - å…
1049±æœ‰å¯èƒ½ãƒ‰ãƒ¡ã‚¤ãƒ³ã¨ã‚¢ã‚¯ã‚»ã‚¹ã‚¿ã‚¤ãƒ—を引数に取る.
1050 + デフォルトは,システムå…
1051¨ä½“で,リード・ライトの両方.
1052 - å…
1053ˆè¡Œã™ã‚‹ã‚­ãƒ£ãƒƒã‚·ãƒ¥ï¼Œåˆ†å²äºˆæ¸¬ï¼ŒTLB保守操作の完了を待
1054つのは,アクセ
1055 スタイプがリード・ライトの両方の場合に限る.
1056
1057 - ARMv6以前は,DWB(DrainWriteBufferまたはDataWriteBarrier)とも呼
1058 ばれていた.
1059
1060・命令同期バリア(ISB)
1061 - ISBの後続の命令が,ISBが完了した後にキャッシュまたはメモリから
1062 フェッチされるように,プロセッサのパイプラインをフラッシュする.
1063
1064 - ARMv6では,PrefetchFlushと呼ばれている.
1065
1066 - ISBの前に実行されたコンテキスト変更操作が,ISBの後にフェッチされ
1067 る命令から見えることを保証する.コンテキスト変更操作の例は,
1068 + ASIDの変更 … [2]に書かれている
1069 + 完了した(←意味不明)キャッシュ・TLB・分岐予測保守操作
1070 + システム制御レジスタ(CP15レジスタ)の変更など
1071
1072 - ISBの後の分岐命令が,ISBの後に見えるコンテキストの分岐予測ロジッ
1073 クに書き込まれることを保証する.これは,命令列が正しく実行される
1074 ことを保証するために必
1075要.
1076 - 命令を動的に書き換えた場合には,ISBとDMB/DSBの両方を使う必
1077要があ
1078 る.
1079
1080●CPSRの変更とメモリ順序モデル([1] B2.7.7)
1081
1082・CPS,SETEND,MSR命令によるCPSRの変更(例外の発生/リターンを伴わない
1083 CPSRに対する操作)は,
1084 - 手前の命令に影響しないことが保証される.
1085 - 以下を除いて,後続の命令から見えることが保証される.
1086 + 命令パーミッションのチェックに対する効果
1087
1088・CPSRの変更により,特権(またはセキュリティ)状æ…
1089‹ãŒå¤‰æ›´ã•ã‚Œã‚‹å ´åˆã«ã¯ï¼Œ
1090 命令パーミッションの効果が見えるためには,ISB,例外の発生,例外からの
1091 リターンのいずれかを経なければならない.
1092
1093・ARMv6では,CPSRの割込みマスクを変更する命令は,手前のStrongly-ordered
1094 アクセスが完了するのを待
1095つが,この仕様はARMv7には適用されない.同期が
1096 必
1097要な場合には,Strongly-orderedアクセスをする命令の直後に,DSBを使う
1098 必
1099要がある.([2] D12.3.4)
1100 - MSR命令と,PCを書き換える命令でSPSRをCPSRにコピーするものが該当.
1101 - ARMv6でも,この振舞いに依存することは推奨しない.
1102 - Deviceアクセスには適用されない.… どこに書いてあったか不明
1103
1104●バリア命令の使用例([2] D7)
1105
1106・SEM(Sequential Execution Model)とは,ある命令を実行開始する前に,手
1107 前の命令の実行が完了しているような実行モデル.最近のプロセッサでは,
1108 内
1109部的にはSEMになっておらず,バリア命令が必
1110要になる.
1111
1112・ここでは,ARMv6以降のDMBとDSBの使用例を説明
1113
1114・weakly consistent ordering の単純な例
1115
1116 初期化 [r1]=0, [r2]=0, r5=0x55, r6=0x66
1117 P1:
1118 str r5, [r1]
1119 ldr r6, [r2]
1120 P2:
1121 str r6, [r2]
1122 ldr r5, [r1]
1123
1124 ⇒ P1でr6=0,P2でr5=0になることがある
1125 strによるライトが,ldrによるリードより後回しにされた場合
1126
1127・Weely ordered におけるメッセージ渡し
1128
1129 初期化 r0=1, r5=0x55
1130 P1:
1131 str r5, [r1]
1132 str r0, [r2]
1133 P2:
1134 wait until [r2]==1
1135 ldr r5, [r1]
1136
1137 ⇒ P2でr5=0になることがある
1138 P1の2つのstrによるライトの順序がå…
1139¥ã‚Œæ›¿ã‚ã£ãŸå ´åˆ
1140
1141 *P2と同じ処理を行うプロセッサが複数あると,プロセッサによって,r5に
1142 ロードしてくる値が異なる場合がある
1143
1144 バリアによる解決
1145 P1:
1146 str r5, [r1]
1147 dmb [ST] … システムå…
1148¨ä½“,ライトのみ
1149 str r0, [r2]
1150 P2:
1151 wait until [r2]==1
1152 dmb
1153 ldr r5, [r1]
1154
1155 アドレス依存性による解決
1156 P1:
1157 str r5, [r1]
1158 dmb [ST] … システムå…
1159¨ä½“,ライトのみ
1160 str r0, [r2]
1161 P2:
1162 wait until [r2]==1 … この中でr12を使っていると想定
1163 and r12, r12, #0
1164 ldr r5, [r1,r12]
1165
1166 ⇒ 最後のldrのアドレス計算にr12が必
1167要。よって,r12へのリードは,この
1168 ldr命令に必
1169ずå…
1170ˆè¡Œã™ã‚‹ï¼ˆã•ã‚‚ないと,アドレスが計算できない)
1171
1172・アドレス依存性と制御依存性
1173
1174 (a) アドレス依存性
1175 ldr r1, [r0]
1176 ldr r2, [r1]
1177 ⇒ アドレス依存性があるため,逆順にならない
1178
1179 (b) アドレス依存性
1180 ldr r1, [r0]
1181 and r1, r1, #0
1182 ldr r2, [r3,r1]
1183 ⇒ [r0]からロードしたr1の値は,実際には[r3,r1]に影響しないが,
1184 形式的にはアドレス依存性があるため,逆順にならない
1185
1186 (c) 制御依存性
1187 ldr r1, [r0]
1188 cmp r1, #55
1189 ldrne r2, [r3]
1190 ⇒ r1の値でldrneを実行するかどうかが変わるが,アドレス依存性は
1191 ない(制御依存性はある)ため,ldrneがå…
1192ˆã«ï¼ˆæŠ•æ©Ÿçš„に)実行
1193 されてもよい(ロードするアドレスは変わらない)
1194
1195 (d) 制御依存性(☆微妙☆)
1196 ldr r1, [r0]
1197 cmp r1, #55
1198 movne r4, #22
1199 ldr r2, [r3,r4]
1200 ⇒ r1の値でmovneを実行するかどうかが変わり,最後のldrでロードす
1201 るアドレスも変わるが,フラグ経由での結合はアドレス依存性と
1202 は扱われず,ldrがå…
1203ˆã«ï¼ˆæŠ•æ©Ÿçš„に)実行されてもよい(ロードす
1204 るアドレスは変わる)
1205
1206☆いくつか省略
1207 - 複数のオブザーバがいるメッセージ渡し(上に記載)
1208 - オブジェクトの構成時のアドレス依存性
1209 リード側はアドレス依存性が使えることが多い
1210 - 複数のオブザーバがいる場合の因果関係
1211 因果関係が崩れたように振る舞うことがある
1212 - 複数のオブザーバがいる複数アドレスへの書き込み
1213
1214<未完成>
1215
1216●バリア命令の必
1217要な状況(考察)
1218
1219・DMBは,マルチプロセッサ(厳密には,マルチマスタ)向けの機能
1220 - シングルプロセッサでは使う状況はないと思われる.
1221
1222・DSBは,メモリアクセスが副作用を持つ時に,その副作用が起こるのを待
1223つた
1224 めに使う機能
1225 - 割込みコントローラの割込み優å…
1226ˆåº¦ãƒžã‚¹ã‚¯ãƒ¬ã‚¸ã‚¹ã‚¿ï¼ˆGICでは,
1227 GICC_PMR)に書き込むことで割込みを禁止した後は,DSBが必
1228要である.
1229 これは,割込み優å…
1230ˆåº¦ãƒžã‚¹ã‚¯ãƒ¬ã‚¸ã‚¹ã‚¿ã¸ã®æ›¸ãè¾¼ã¿ãŒã‚¹ãƒˆã‚¢ãƒãƒƒãƒ•ã‚¡ã«
1231 蓄積された状æ…
1232‹ã§ï¼Œæ¬¡ã®å‘½ä»¤ã‚’実行し,その後に割込みがå…
1233¥ã£ã¦ã—まう
1234 可能性があるためである.
1235 - 優å…
1236ˆåº¦ãƒžã‚¹ã‚¯ãƒ¬ã‚¸ã‚¹ã‚¿ã«æ›¸ãè¾¼ã‚€ã“とで割込みを許可した後に,必
1237ず割
1238 込みがå…
1239¥ã‚‹ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã‚’作りたい場合は,DSBが必
1240要である.割込みがå…
1241¥
1242 るタイミングを作る必
1243要がなく,割込が許可されるタイミングが遅
1244くなっ
1245 ても問題なければ,DSBは必
1246須ではない.
1247
1248・ISBは,プログラムが書き換えられた(または,システム状æ…
1249‹ã®å¤‰åŒ–により実
1250 行すべきプログラムが変わった)時に,新しいプログラムを読み込むことを
1251 保証するための命令
1252 - カーネルでは,プログラムを書き換えることは想定していない.
1253 - システム制御レジスタの変更など,必
1254要な場面は限られると思われる.
1255
1256☆CPSRを書き換える前に,メモリバリアが必
1257要?
1258 … どこに書いてあったか不明([2] D12.3.4のことか??)
1259 - CPSRのどのフラグを書き換えるかによっても話しが違う
1260
1261○コプロセッサ
1262
1263●コプロセッササポート([2] A2.9)
1264
1265・16個までのコプロセッサをサポート
1266・以下のコプロセッサはARMが予約
1267
1268・コプロセッサ15(CP15)
1269 - システム制御
1270 - 仮想メモリシステムアーキテクチャ(VMSA)でのレジスタ
1271 - 物理メモリシステムアーキテクチャ(PMSA)でのレジスタ
1272 - パフォーマンスモニタレジスタ
1273
1274・コプロセッサ14(CP14)
1275 - デバッグ支援
1276
1277・コプロセッサ10と11(CP10とCP11)
1278 - 2つあわせて,浮動小数点とAdvanced SIMD
1279
1280・コプロセッサ8,9,12,13
1281 - 将来の拡張のためにARMが予約
1282
1283●コプロセッサ命令
1284
1285・コプロセッサのデータ処理の開始
1286 - CDP, CDP2
1287 CDP<c> <coproc>, <opc1>, <CRd>, <CRn>, <CRm>, <opc2>
1288
1289・ARMコアレジスタとコプロセッサレジスタの間データの転送
1290 - MCR, MCR2 … ARMコアレジスタ→コプロセッサ
1291 '2'は,条件が付けられない.CP14,15には使えない
1292 MCR<c> <coproc>, <opc1>, <Rt>, <CRn>, <CRm>{, <opc2>}
1293 - MCRR, MCRR2 … 2つのARMコアレジスタ→コプロセッサ
1294 MCRR<c> <coproc>, <opc1>, <Rt>, <Rt2>, <CRm>
1295 - MRC, MRC2 … コプロセッサ → ARMコアレジスタ
1296 MRC<c> <coproc>, <opc1>, <Rt>, <CRn>, <CRm>{, <opc2>}
1297 - MRRC, MRRC2 … コプロセッサ → 2つのARMコアレジスタ
1298 MRRC<c> <coproc>, <opc>, <Rt>, <Rt2>, <CRm>
1299
1300・コプロセッサレジスタのロード/ストア
1301 - LDC, LDC2 (immediate) … メモリ→コプロセッサ
1302 LDC{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!}
1303 LDC{L}<c> <coproc>, <CRd>, [<Rn>], #+/-<imm>
1304 LDC{L}<c> <coproc>, <CRd>, [<Rn>], <option>
1305 - LDC, LDC2 (literal) … メモリ→コプロセッサ
1306 LDC{L}<c> <coproc>, <CRd>, <label>
1307 LDC{L}<c> <coproc>, <CRd>, [PC, #-0] … Special case
1308 LDC{L}<c> <coproc>, <CRd>, [PC], <option>
1309 - STC, STC2 … コプロセッサ→メモリ
1310 STC{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!}
1311 STC{L}<c> <coproc>, <CRd>, [<Rn>], #+/-<imm>
1312 STC{L}<c> <coproc>, <CRd>, [<Rn>], <option>
1313
1314・CP10とCP11は,浮動小数点/Advanced SIMD命令でも操作できる
1315
1316○CP15
1317
1318●仮想メモリシステムアーキテクチャ(VMSA)でのレジスタ
1319
1320●物理メモリシステムアーキテクチャ(PMSA)でのレジスタ
1321
1322●パフォーマンスモニタレジスタ
1323
1324以上
Note: See TracBrowser for help on using the repository browser.