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

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

3.1.0を反映

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