ARMのリファレンスマニュアルにある
3.2. Address translation辺りのめもです。
まずは適当に書いた図を・・・ ちょっと間違えてて1段階目はCoarse page table、2段階目はSmall pageが本当です。
x86だとcr2にアドレスがセットされるけどARM926の場合はページフォルトが起きたときにそのアドレスはどこに書かれるのか?ARM926はFault Address Register(c6)にアドレスが入る。マニュアルによるとこのレジスタは書き込みも可能でデバッグ用途に使う感じみたい。
そして、このアドレスはModified Virtual Address(MVA)と呼ばれている。
アドレスはx86と同様にbitNからbitMまでをテーブルのインデックスとして使うという形になっています。ただ、ページサイズの設定によってビットの幅は変わる。
ページサイズの種類は以下の3つ。
- large pages(64KB)
- small pages(4KB)
- tiny pages(1KB)
貼り付けた図はsmall pagesの場合です。この場合のMVAはというと以下のようになります。
bits | 用途 |
31:20 | Translation tableのインデックス |
19:12 | Coarse page tableのインデックス |
11:0 | Small pageのインデックス |
次に、ページテーブルの設定まわりを。ここではsmall pagesを使っていると仮定していきます。
x86の場合、cr3レジスタにページディレクトリテーブルのアドレスをセットしますね。ARM926は32bit幅のTranslation Table Base Register(TTBR)の上位18ビット(bits[31:14]でマニュアルだとTranslation table baseと呼んでます)にアドレスをセットします。そして、このアドレスは16KB alignになっている必要があります。x86の場合はページディレクトリテーブルと呼んでいるものは、ARM926だとTranslation tableと呼んでいます。
TTBはTranslation tableの先頭アドレスを差し、MVAのbits[31:20]がTranslation tableのインデックスとして使われる。
そしてインデックスが指す要素は(c言語っぽく書くと、translation_table[index])First-level descriptorというものが格納されている。
このディスクリプタはページの種類によって違うが、small pageの場合は、
bit | 用途 |
31:12 | 二段階目のページテーブルのアドレス |
11:9 | 0が入る |
8:5 | ドメインコントロールビット |
4 | 絶対に1がセットされていること |
3:2 | 0が入る |
1:0 | ページサイズの種類 |
ページサイズの種類の種類というのは以下のようにlarge、small、tinyとinvalidを含めて4種類です。
0 0 | Invalid |
0 1 | Coarse page table |
1 0 | Section |
1 1 | Fine page table |
ディスクリプタを読んでCoarse page table base addressを得たらCoarse page tableにアクセスできますね。
次はMVAのbits [19:10]をインデックスとしてこのテーブルの要素にアクセスします。そうするとこのテーブルの要素(Coarse page table descriptor)を得ることができます。
これは以下のようになっています。
bit | 用途 |
31:10 | 2段階目のページテーブルのベースアドレス |
9 | 0が入る |
8:5 | ドメインアクセスコントロール用 |
4 | 1が入る |
3:2 | 0が入る |
1:0 | 0、1となる(ページ種類のCoarse page tableがセットされるということ) |
次は2段階目のページテーブルでsmall pageの場合はそのままsmall pageという名前のテーブル。先ほどのCoarse page table descriptoからsmall pageへのアドレスが分かるので、このアドレスとMVAのbits[11:0]をインデックスとしてテーブルの要素にアクセス。
このテーブルの要素はSecond-level descriptorと呼ばれるもので以下のような内容。
bits | 用途 |
31:12 | 物理アドレス |
11:4 | アクセス権限bit |
3:2 | キャッシュポリシー(ライトバック、ライトスルー) |
1:0 | ページサイズ種類(First-level descriptorと同じ) |
Second-level descripto上記のようになっていて、31:12bitにある物理アドレスは下位13bitsが0なので、これにMVAの下位13bitを足して物理アドレスとなります。x86と同じような感じですね。
仮想アドレス->物理アドレスの変換方式はx86と大きく変わらないですが、用語が違うので最後にまとめ。
x86 | ARM926 | 意味 |
Page Fault Linear Address (PFLA) | Modified Virtual Address(MVA) | ページフォルトが起きたアドレス |
CR2 | Fault Address Register | ページフォルトが起きたアドレスがセットされるレジスタ |
CR3 | Translation Table Base Register(TTBR) | ページディレクトリのアドレス |
ページディレクトリ | Translation table | ページディレクトリ |
( ´Д`)ノ