source: asp3_wo_tecs/trunk/arch/arm_gcc/doc/arm_vmsa_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: 19.8 KB
RevLine 
[302]1 TOPPERS Confidential
2 TOPPERSプロジェクト 設計メモ
3 ARMのVMSAに関するメモ
4
5 作成者
6: 高田広章(名古屋大学)
7 最終更新: 2015年8月6日
8
9○メモの位置づけ
10
11このメモは,ARMのVMSA(Virtual Memory System Architecture)に関して,
12TOPPERSカーネルをポーティングするにあたって必
13要となる事項
14をまとめたもの
15である.
16
17ARMのVMSAは,ARMv5以前とARMv6以降ではかなり違っている.また,ARMv7では,
18セキュリティ拡張,ラージ物理アドレス拡張(LPAS; Large Physical Address
19Extension),仮想化拡張などが追加されている.
20
21このメモでは,ARMv5以前とARMv6以降の両方について扱うが,ARMv7における拡
22張については,TOPPERSカーネルでは直接サポートしないため,扱わないことと
23する(現時点では,ARMv6を中心に記述してある).
24
25○目次
26
27・参考文献
28
29○参考文献
30
31[1] ARM Architecture Reference Manual, 2005
32DDI 01001.pdf
33※ ARMv6以前の定義
34
35[2] ARM Architecture Reference Manual - ARMv7-A and ARv7-R edition, 2014
36DDI0406C_C_arm_architecture_reference_manual.pdf
37※ ARMv7の定義,ARMv6以前との差分についても記載あり
38
39○ARMのVMSAの概要
40
41●主な特徴
42
43・2レベルのテーブルを用いたハードウェアによるアドレス変換
44・マッピングサイズ:4KB,16KB,1MB,16MB
45・セクション(1MB,16MB)単位でのアクセス許可指定が可能
46・ラージページ(64KB)とスモールページ(4KB)単位でのアクセス許可指定
47・エントリに8ビットのASID(アドレス空間識別子)を付与可能(ARMv6以降)
48・エントリをグローバルに設定可能(ARMv6以降)
49・16個のドメイン
50
51●セクションとページ
52
53スーパーセクション:16MB単位(ARMv6以降,ARMv5ではオプション)
54セクション:1MB単位
55ラージページ:64KB単位
56スモールページ:4KB単位
57タイニーページ:1KB単位(ARMv6ではサポートされない)
58
59●ARMv5からARMb6への拡張点
60
61ARMv6のMMUは,ARMv5に対して様々
62な拡張がされている.ARMv6の(新しい)ア
63ドレス変換機構は,過去のものと互換性がないため,過去と互換のアドレス変
64換機構もサポートしている.ARMv6での主な拡張点は次の通り.
65
66・メモリ領域のタイプを拡張(メモリモデルの指定など).
67・プロセス(ASID)毎のページとグローバルページをサポート.
68・アクセス許可を拡張.実行禁止領域を指定可能.
69・複数のプロセッサでå…
70±æœ‰ã™ã‚‹ãƒ¡ãƒ¢ãƒªé ˜åŸŸã‚’指定可能.
71・変換テーブルベースレジスタ(TTBR)が2つある.
72・ファインページテーブルとタイニーページ(1KB)を廃止.
73
74プロセス(ASID)毎のページとグローバルページは,TLBのフラッシュを不必
75要
76にし,TLBミスが減るため,ARMv6では新しいアドレス変換機構を使用すべきで
77ある.
78
79参考:ARM11 MPCoreのVMSAの特徴
80
81・ラウンドロビンリプレースメント
82・64エントリの統合TLBと8エントリのロックダウンTLB
83・マイクロTLBとマクロTLBの2階層のTLB(実装
84の問題)
85
86●ドメイン
87
88ドメインは,メモリ領域の集合である.すべてのメモリ領域は,いずれかのド
89メインに属する.ドメインの最大数は16個である.
90
91ドメインアクセス制御レジスタ(DACR; Domain Access Control Register)に
92より,各ドメインに対して次のいずれかのアクセス許可を設定できる.
93
94・アクセスできない
95・TLBエントリのアクセス許可に従う(client)
96・TLBエントリのアクセス許可にかかわらず必
97ずアクセスできる(manager)
98
99メモリ領域がどのドメインに属するかは,第1レベルディスクリプタ中で指定さ
100れる.そのため,異なるドメインに属するように設定できるのは,1MB単位とい
101うことになる.
102
103スーパーセクション(16MB単位のメモリ領域)は,必
104ずドメイン0に属する.
105
106●ページテーブルのマッピング制限
107
108仮想インデックス物理タグ(VIPT)キャッシュにおけるエイリアスの処理を容
109易にするための制限として,以下を設ける(命令キャッシュでは無害).
110
111・複数の論理アドレスが同じ物理アドレスにマッピングされる場合に,論理ア
112ドレスのビット[13:12]と,マッピングされる物理アドレスのビット[13:12]を
113必
114ず一致させること.
115
116・または,すべてのマッピングが4KB単位の場合には,同じ物理アドレスにマッ
117ピングされる論理アドレスのビット[13:12]がすべて同じであること.
118
119MPCoreでは,物理インデックス物理タグ(PIPT)キャッシュを用いているため,
120この制限は適用されない.PIPTキャッシュで高速アクセスを実現するために,
121超
122高速・小容量のマイクロTLBを備えている.
123
124→ HRP3カーネルでは,論理アドレスと物理アドレスを一致させているため,上
125の制限が常に満たされる.
126
127○アドレス変換機構
128
129●ARMv6の新しいアドレス変換機構
130
131ここでは,(過去と互換のアドレス変換機構ではなく)ARMv6の(新しい)アド
132レス変換機構について説明する.CP15制御レジスタc1のXPビット(ビット23)
133で,サブページAPビットをディスエーブルすることで,ARMv6の(新しい)アド
134レス変換機構が使われる.
135
136論理アドレスから物理アドレスへの変換は,2レベルの変換テーブルによって行
137われる.1段目の変換テーブルを第1レベルテーブル,2段目の変換テーブルを第
1382レベルテーブルと呼ぶ.
139
140*変換テーブルベースレジスタ
141
142第1レベルテーブルは,変換テーブルベースレジスタ(TTBR)によって指定され
143る.ARMv6には,2つの変換テーブルベースレジスタ(TTBR0とTTBR1)があり,
144論理アドレスの上位ビットによって使い分けることができる.å…
145·ä½“的には,論
146理アドレスの上位Nビットがすべて0の場合にTTBR0が使われ,そうでない時に
147TTBR1が使われる.Nは,変換テーブルベース制御レジスタ(TTBCR)で設定する.
148Nに0を設定すると,常にTTBR0が使われる.
149
150TTBRには,第1レベルテーブルのアドレスに加えて,キャッシュ可能/不可能を
151制御するビットがある(詳細省略).
152
153→ TTBR1をカーネル,TTBR0をユーザプロセスに使うことを想定した機構である
154が,HRP3ではアドレス変換を行わないため,TTBR1をうまく活用できない.常に
155TTBR0を使う設定で用いることにする.
156
157*第1レベルディスクリプタ
158
159論理アドレスのビット[31:20](上位12ビット)をインデックスとして,第1レ
160ベルテーブルを検索し,第1レベルディスクリプタを取り出す.そのため,第1
161レベルディスクリプタは,1MBのメモリ領域に対応する.
162
163第1レベルディスクリプタには,次の種類がある.
164
165フォルト
166・下位2ビットが00または11
167・変換フォルトを引き起こす
168※サブページを使う時(ARMv5互換モード)は,下位2ビットが11は予約
169
170コアースページテーブル
171・下位2ビットが01
172・第2レベルテーブル(コアースページテーブル)を指す
173 ビット31〜10(22ビット):第2レベルテーブルのアドレス
174 ビット9:実装
175定義,MPCoreではPビット(ECCが有効であることを示す)
176 ビット8〜5:属するドメイン
177 ビット4〜2:0に設定(未使用)
178 ビット1〜0:01に設定(コアースページテーブルを示す)
179
180セクション
181・下位2ビットが10で,ビット18が0
182・セクション(1MB単位のメモリ領域)を示す
183 ビット31〜20(12ビット):セクションのアドレス
184 ビット19:0に設定(未使用)
185 ビット18:0に設定(セクションを示す)
186 ビット17:nGビット(グローバルでない)
187 ビット16:Sビット(プロセッサ間でå…
188±æœ‰ï¼‰
189 ビット15:APXビット
190 ビット14〜12:TEXビット
191 ビット11〜10:APビット
192 ビット9:実装
193定義,MPCoreではPビット(ECCが有効であることを示す)
194 ビット8〜5:属するドメイン
195 ビット4:XNビット(実行禁止)
196 ビット3:Cビット
197 ビット2:Bビット
198 ビット1〜0:10に設定(セクション/スーパーセクションを示す)
199
200スーパーセクション
201・下位2ビットが10で,ビット18が1
202・セクション(16MB単位のメモリ領域)を示す
203 ビット31〜24(8ビット):セクションのアドレス
204 ビット23〜19:0に設定(未使用)
205 ビット18:1に設定(スーパーセクションを示す)
206 以降,セクションと同じ(nG,S,APX,TEX,AP,P,XN,C,B)
207 ただし,ドメインは無視される(必
208ずドメイン0)
209・第1レベルテーブルには,同じディスクリプタを16回繰り返してå…
210¥ã‚Œã¦ãŠã
211
212*第2レベルディスクリプタ
213
214第1レベルディスクリプタが,コアースページテーブルを指す場合には,論理ア
215ドレスのビット[19:12](中央の8ビット)をインデックスとしてそのテーブル
216を検索し,第2レベルディスクリプタを取り出す.そのため,第2レベルディス
217クリプタは,4KBのメモリ領域に対応する.
218
219第2レベルディスクリプタには,次の種類がある.
220
221フォルト
222・下位2ビットが00
223・メモリアクセスフォルトを引き起こす
224
225スモールページ
226・下位2ビットが10または11
227・スモールページ(4KB単位のメモリ領域)を示す
228 ビット31〜12(20ビット):ページのアドレス
229 ビット11:nGビット(グローバルでない)
230 ビット10:Sビット(プロセッサ間でå…
231±æœ‰ï¼‰
232 ビット9:APXビット
233 ビット8〜6:TEXビット
234 ビット5〜4:APビット
235 ビット3:Cビット
236 ビット2:Bビット
237 ビット1:1に設定(スモールページを示す)
238 ビット0:XNビット(実行禁止)
239※ セクションと比べると,ドメインとPビットがない.
240
241ラージページ
242・下位2ビットが01
243・ラージページ(64KB単位のメモリ領域)を示す
244 ビット31〜16(16ビット):ページのアドレス
245 ビット15:XNビット(実行禁止)
246 ビット14〜12:TEXビット
247 ビット11:nGビット(グローバルでない)
248 ビット10:Sビット(プロセッサ間でå…
249±æœ‰ï¼‰
250 ビット9:APXビット
251 ビット8〜6:0に設定(未使用)
252 ビット5〜4:APビット
253 ビット3:Cビット
254 ビット2:Bビット
255 ビット1〜0:01に設定(ラージページを示す)
256・第2レベルテーブルには,同じディスクリプタを16回繰り返してå…
257¥ã‚Œã¦ãŠã
258
259●アクセス許可と属性
260
261アクセス許可(詳しくは下記)
262 APXビット(1ビット)書込みアクセス禁止の場合に1
263 APビット(2ビット) ユーザアクセスを制御
264
265キャッシュとメモリモデル
266 TEXビット(3ビット)タイプ拡張フィールド
267 Cビット(1ビット) (å…
268ƒã€…
269は)キャッシュ可能
270 Bビット(1ビット) (å…
271ƒã€…
272は)バッファ可能
273
274その他
275 nGビット(1ビット) グローバルなメモリ領域でない場合に1
276 Sビット(1ビット) プロセッサ間でå…
277±æœ‰ã™ã‚‹ãƒ¡ãƒ¢ãƒªé ˜åŸŸã®å ´åˆã«1
278 XNビット(1ビット) 実行不可のメモリ領域の場合に1
279
280●アクセス許可
281
282CPのSビットとRビットをå…
283±ã«0に設定した場合(それ以外の使い方は推奨されな
284い)
285
286 APX AP 特権アクセス ユーザアクセス
287× 0 0 0 アクセス禁止 アクセス禁止 常にアクセス禁止
288 0 0 1 R/W アクセス禁止
289 0 1 0 R/W RO
290 0 1 1 R/W R/W
291× 1 0 0 <予約>
292 1 0 1 RO アクセス禁止
293 1 1 0 RO RO
294× 1 1 1 RO RO
295
296凡例)×は,HRP3では用いないことを示す.
297
298●キャッシュとメモリモデル(ARMv6以降)
299
300 TEX C B
301 000 0 0 ストロングオーダ,å…
302±æœ‰å¯èƒ½
303 000 0 1 デバイス,å…
304±æœ‰å¯èƒ½
305 000 1 0 外側・内
306側ライトスルー,no write allocate,Sビットで
307× 000 1 1 外側・内
308側ライトバック,no write allocate,Sビットで
309 001 0 0 外側・内
310側キャッシュ不可
311 001 1 1 外側・内
312側ライトバック,write allocate,Sビットで
313× 010 0 0 デバイス,非å…
314±æœ‰
315× 1BB A A キャッシュされるメモリ,å…
316±æœ‰ã‹ã©ã†ã‹ã¯Sビットで
317 BB … 外側のキャッシュポリシー
318 AA … 内
319側のキャッシュポリシー(L1キャッシュ)
320
321 AAとBBの値
322 00 … キャッシュ不可,バッファ不可
323 01 … ライトバック,write allocate,バッファ可
324 10 … ライトスルー,no write allocate,バッファ可
325 11 … ライトバック,no write allocate,バッファ可
326
327凡例)×は,HRP3では用いないことを示す.
328
329ストロングオーダメモリ属性 … 前後にメモリバリア命令があるのと同等
330デバイスメモリ属性 … バッファはされる,キャッシュはされない,回数が保存
331通常メモリ属性
332
333●キャッシュとメモリモデル(ARMv5以前)
334
335ARMv5TEより前は,TEXビットはサポートされていない.また,第2レベルのスモー
336ルページディスクリプタには,TEXビットがない.そこで,標準では,TEXビッ
337トを使わないコードを出すことにする.
338
339 C B
340 0 0 ストロングオーダ
341 0 1 デバイス
342 1 0 内
343側ライトスルー
344 1 1 内
345側ライトバック
346
347○CP15コプロセッサの構成
348
349●TTBCR(Translation Table Base Control Register)… (0, c2, c0, 2)
350
351・TTBR0を使うか,TTBR1を使うかを制御する
352・TTBR0が指すセクションテーブルのサイズを制御する
353・下位3ビット(N)の意味
354 000 TTBR0のみを使う.ARMv5との互換モード
355 TTBR0が指すセクションテーブルのサイズは16KB(4Kエントリ)
356 001 アドレスのMSBが0ならTTBR0を使う.そうでなければTTBR1を使う
357 TTBR0が指すセクションテーブルのサイズは8KB(2Kエントリ)
358 010 アドレスの上位2ビットがすべて0ならTTBR0を使う.以下同じ
359 TTBR0が指すセクションテーブルのサイズは4KB(1Kエントリ)
360 … …
361 111 アドレスの上位7ビットがすべて0ならTTBR0を使う.以下同じ
362 TTBR0が指すセクションテーブルのサイズは128B(32エントリ)
363・上位29ビットは未使用
364
365→ HRP3では,TTBR0のみを使うため,下位3ビットを000に設定する.
366
367●TTBR0(Translation Table Base Register 0)… (0, c2, c0, 0)
368
369・第1レベルテーブルの物理アドレスを保持するレジスタ
370・プロセス切換え時に書き換える
371
372・上位18+Nビット
373 第1レベルテーブルの物理アドレス
374・ビット[4:3]
375 ページテーブル領域に対する外側のキャッシュポリシー
376 00:Outer Noncachable
377 01:Outer Cachable Write-Back cached, Write Allocate
378 10:Outer Cachable Write-Through, No Allocate on Write
379 11:Outer Cachable Write-Back, No Allocate on Write
380・ビット[1]
381 ページテーブル領域がå…
382±æœ‰ï¼ˆ1)か非å…
383±æœ‰ï¼ˆ0)か
384・他のビットは未使用
385
386●TTBR1(Translation Table Base Register 1)… (0, c2, c0, 1)
387
388→ HRP3では使わない.
389
390●DACR(Domain Access Control Register)… (0, c3, c0, 0)
391
392・各ドメインに対して,以下のいずれかを設定する.
393 00:アクセスできない
394 01:TLBエントリのアクセス許可に従う(client)
395 10:<予約>
396 11:TLBエントリのアクセス許可にかかわらず必
397ずアクセスできる(manager)
398
399・ビット[31:30] … ドメイン15の設定
400 …
401 ビット[1:0] … ドメイン0の設定
402
403→ HRP3カーネルでは,0x01U(ドメイン0に対してTLBエントリのアクセス許可
404に従う,他のドメインはアクセスできない)に設定する.
405
406●定数定義
407
408/*
409 * サイズの定義
410 */
411#define ARM_SSECTION_SIZE 0x1000000 /* スーパーセクション(16MB)*/
412#define ARM_SECTION_SIZE 0x0100000 /* セクション(1MB)*/
413#define ARM_LPAGE_SIZE 0x0010000 /* ラージページ(64KB)*/
414#define ARM_PAGE_SIZE 0x0001000 /* スモールページ(4KB)*/
415
416/*
417 * 第1レベルディスクリプタの設定値
418 */
419#define ARMV6_MMU_DSCR1_FAULT 0x00000 /* フォルト */
420#define ARMV6_MMU_DSCR1_PAGETABLE 0x00001 /* コアースページテーブル */
421#define ARMV6_MMU_DSCR1_SECTION 0x00002 /* セクション */
422#define ARMV6_MMU_DSCR1_SSECTION 0x40002 /* スーパーセクション */
423
424#define ARMV6_MMU_DSCR1_NONGLOBAL 0x20000 /* グローバルでない */
425#define ARMV6_MMU_DSCR1_SHARED 0x10000 /* プロセッサ間でå…
426±æœ‰ */
427#define ARMV6_MMU_DSCR1_APX0 0x00000 /* APXビットが0 */
428#define ARMV6_MMU_DSCR1_APX1 0x08000 /* APXビットが1 */
429#define ARMV6_MMU_DSCR1_TEX000 0x00000 /* TEXビットが000 */
430#define ARMV6_MMU_DSCR1_TEX001 0x01000 /* TEXビットが001 */
431#define ARMV6_MMU_DSCR1_TEX010 0x02000 /* TEXビットが010 */
432#define ARMV6_MMU_DSCR1_TEX100 0x04000 /* TEXビットが100 */
433#define ARMV6_MMU_DSCR1_AP01 0x00400 /* APビットが01 */
434#define ARMV6_MMU_DSCR1_AP10 0x00800 /* APビットが10 */
435#define ARMV6_MMU_DSCR1_AP11 0x00c00 /* APビットが11 */
436#define ARMV6_MMU_DSCR1_ECC 0x00200 /* ECCが有効(MPCore)*/
437#define ARMV6_MMU_DSCR1_NOEXEC 0x00010 /* 実行不可 */
438#define ARMV6_MMU_DSCR1_CB00 0x00000 /* Cビットが0,Bビットが0 */
439#define ARMV6_MMU_DSCR1_CB01 0x00004 /* Cビットが0,Bビットが1 */
440#define ARMV6_MMU_DSCR1_CB10 0x00008 /* Cビットが1,Bビットが0 */
441#define ARMV6_MMU_DSCR1_CB11 0x0000c /* Cビットが1,Bビットが1 */
442
443/*
444 * 第2レベルディスクリプタの設定値
445 */
446#define ARMV6_MMU_DSCR2_FAULT 0x0000 /* フォルト */
447#define ARMV6_MMU_DSCR2_LARGE 0x0001 /* ラージページ */
448#define ARMV6_MMU_DSCR2_SMALL 0x0002 /* スモールページ */
449
450#define ARMV6_MMU_DSCR2_NONGLOBAL 0x0800 /* グローバルでない */
451#define ARMV6_MMU_DSCR2_SHARED 0x0400 /* プロセッサ間でå…
452±æœ‰ */
453#define ARMV6_MMU_DSCR2_APX0 0x0000 /* APXビットが0 */
454#define ARMV6_MMU_DSCR2_APX1 0x0200 /* APXビットが1 */
455#define ARMV6_MMU_DSCR2_AP01 0x0010 /* APビットが01 */
456#define ARMV6_MMU_DSCR2_AP10 0x0020 /* APビットが10 */
457#define ARMV6_MMU_DSCR2_AP11 0x0030 /* APビットが11 */
458#define ARMV6_MMU_DSCR2_CB00 0x0000 /* Cビットが0,Bビットが0 */
459#define ARMV6_MMU_DSCR2_CB01 0x0004 /* Cビットが0,Bビットが1 */
460#define ARMV6_MMU_DSCR2_CB10 0x0008 /* Cビットが1,Bビットが0 */
461#define ARMV6_MMU_DSCR2_CB11 0x000c /* Cビットが1,Bビットが1 */
462
463/* ラージページのディスクリプタ用 */
464#define ARMV6_MMU_DSCR2L_TEX000 0x0000 /* TEXビットが000 */
465#define ARMV6_MMU_DSCR2L_TEX001 0x1000 /* TEXビットが001 */
466#define ARMV6_MMU_DSCR2L_TEX010 0x2000 /* TEXビットが010 */
467#define ARMV6_MMU_DSCR2L_TEX100 0x4000 /* TEXビットが100 */
468#define ARMV6_MMU_DSCR2L_NOEXEC 0x8000 /* 実行不可 */
469
470/* スモールページのディスクリプタ用 */
471#define ARMV6_MMU_DSCR2S_TEX000 0x0000 /* TEXビットが000 */
472#define ARMV6_MMU_DSCR2S_TEX001 0x0040 /* TEXビットが001 */
473#define ARMV6_MMU_DSCR2S_TEX010 0x0080 /* TEXビットが010 */
474#define ARMV6_MMU_DSCR2S_TEX100 0x0100 /* TEXビットが100 */
475#define ARMV6_MMU_DSCR2S_NOEXEC 0x0001 /* 実行不可 */
476
477以上
Note: See TracBrowser for help on using the repository browser.