(1)タスク毎に独立した4Gbyteのメモリ空間
この場合はタスクスイッチ時にページテーブルを切り替える
全てのタスクが広大なメモリ空間を扱えるが、タスクスイッチコストが重い
(2)カーネルとユーザータスクが4Gbyteのメモリ空間を共有
カーネルAPI呼び出し時にページテーブルを切り替える必要がない
ただし、カーネルとユーザーでメモリ空間を折半することになる
まずはいずれの場合でも必要となるページ機能有効化とページテーブルの設定方法を確認
例によって仕様書
■Cortex-A8仕様書
Cortex-A8 Technical Reference Manual
ページテーブルの物理アドレスはARMコプロセッサで設定する
設定するコプロセッサレジスタはTranslation Table Base Register(略してTTBR)
136ページ 3.2.31 c2, Translation Table Base Register 0
137ページ 3.2.32 c2, Translation Table Base Register 1
TTBR0がユーザープロセス用、TTBR1がOS用ということらしい。
TTBR0とTTBR1のどっちを使うか、または両方使うかはTranslation Table Base Control Register(略してTTBCR)で設定する
138ページ 3.2.33 c2, Translation Table Base Control Register
OS用であるTTBR1は固定で16kbyteのサイズを持つテーブルへのアドレスを保持する。
それに対してTTBR0が指すテーブルはTTBRC.Nビットで指定されるサイズになる。このサイズは128byte~16kbyteである。
N=0の時に最大サイズ16kbyteになる。この時はTTBR0で指定されるページテーブルのみでアドレス変換が行われる。これはARMv6仕様の仮想メモリ機構と同一動作となる。
■TTBRフォーマット
31 14 13 5 4 3 2 1 0
+------------------------------------------------+
| Base Address | 0 | RGN | P | 0 | C |
+------------------------------------------------+
ページテーブルは16kbyteのサイズ(TTBCRで変えられる)
RGN、P、Cはページテーブルのキャッシュに関する設定
面倒だからオール0(キャッシュしない)でまずは試す
ページテーブル内のフォーマットについてはARM v7 Architecture Reference Manualを参照する
■TTBCRフォーマット
31 6 5 4 3 0
+------------------------------------------------+
| 0 |PD1|PD0| 0 | N |
+------------------------------------------------+
セキュリティ拡張機能が実装されている場合の話だが、PD0, PD1はTTBR0,1それぞれを使ってアドレス変換をするかどうかを指定する。
1だと変換しない。例えばPD0=1とするとTTBR0によるページ変換をしなくなる。
もしTTBR0で指定されるページテーブルでアドレス変換しなければならない場合はページフォールトが発生する。
セキュリティ拡張機能が実装されていない場合はPD0、PD1は存在しない。NビットのみがTTBCRに存在することになる。
NはTTBR0のサイズを指定、すなわちTTBR0でアドレス変換をするメモリ範囲を指定する。
12-NがTTBR0を使ってアドレス変換する第1レベル記述子のインデックス範囲になる。
N=0なら12ビット範囲(0~0xFFF)、すなわち全第1レベル記述子範囲がTTBR0になる。
N=7なら5ビット範囲(0~32)、すなわち第1レベル記述子の最初の方、メモリアドレスで言うと0~0x2000000(2^5*256*4096)がTTBR0になる。
Linuxカーネルみたいに0xC0000000~0xFFFFFFFFをカーネル領域としてTTBR1に変換させたい場合は・・・、残念ながらN=1で0~0x80000000がTTBR0範囲となるためこの仕組みでは実現できない。
■ページテーブルフォーマット
ARM v7 Architecture Reference Manualの729ページ B4.7.4 第1 レベル記述子
第1レベル記述子はコアースページテーブル、セクションテーブル、スーパーセクションテーブルの3種類がある
とりあえずコアースページテーブルで実装する。
(コアースページテーブル)
31 10 9 8 5 4 2 1 0
+------------------------------------------------------+
| 第2レベル記述子 Base Address | IMP | Domain | 0 | 01 |
+------------------------------------------------------+
IMPの部分が何を意味するか良くわからない。
どうもユーザーが勝手に使って良いビットのようだが・・・。とりあえず0にしておく。
Domainはアクセス権に関係する設定。
別途ドメインアクセス制御レジスタ(DACR)を使ってあるメモリ領域ごとにアクセス権を設定できる。まずは0を指定して全領域ドメイン0で動かす。
■第2レベル記述子
ARM v7 Architecture Reference Manualの733ページB4.7.7 第2 レベル記述子 - コアースページテーブルのフォーマット
1ページメモリを4kbyteで扱う場合はスモールページを使う
(スモールページ)
上記は古いARMのフォーマット。Cortex-A8はVMSAv7なので以下のフォーマット
31 12 11 10 9 8 6 5 4 3 2 1 0
+----------------------------------------------------------------+
| 物理メモリページ Base Address | nG | S | APX | TEX | AP | C | B | 10 |
+----------------------------------------------------------------+
C,Bの詳細は713ページ B4.4.1 C、B、TEX のエンコードを参照
0 件のコメント:
コメントを投稿