http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/Bihgfcgf.htmlを参照してください。
ARM5 以下の場合、TTB テーブルのサイズと位置合わせは固定されています (16k まで)。各レベル 1 エントリは 1MB を表します。テーブル エントリは 32 ビット (16k*1M/(32 ビット/8) = 4GB) です。TTBCRはTTBR0テーブル サイズを制御します。上記URLより、
使用する変換テーブル ベース レジスタの選択
変換テーブル ベース レジスタは次のように選択されます
。N = 0 の場合、常に変換テーブル ベース レジスタ 0 を使用
します。 - これはリセット時のデフォルト ケースです。ARMv5 以前のプロセッサとの下位互換性があります。
N が 0 より大きい場合:
- 仮想アドレスのビット [31:32-N] がすべて 0 の場合は、変換テーブル ベース レジスタ 0 を使用します。それ以外の場合は、変換テーブル ベース レジスタ 1 を使用します。
したがって、TTBR0のサイズもメモリ分割を設定します。従来のLinux 3G/1G 1G/3G では、値2を選択する必要があります。4kB テーブル == 1G メモリ == ビット 31..30 はゼロです。値が6の場合、テーブルは 256 バイト == 64MB == ビット 31..26 はゼロです。
Linux の用語では、これらはページ グローバルエントリです (これにより、このページ グローバルディレクトリが分割されます)。エントリは、別のテーブルを指すことも、1MBのセグメントのみを指すこともできます。次のテーブル エントリは、ページ中央の Linux ディレクトリであり、最後のページ テーブルエントリです。ページの中間エントリは ARM では使用されていないと思います。
MMU ハードウェアは、毎回テーブルを移動するわけではありません。TLB(翻訳ルックアサイドバッファ)があります。これは、MMU テーブルのキャッシュのようなものです。OS がこれらのテーブルを更新するときは、TLB をフラッシュする必要があります。フラッシュしないと、プロセッサが古いエントリを使用します。同様に、ARM キャッシュは仮想タグ付きであるため、マッピングを変更すると、キャッシュをフラッシュする必要があることも意味する場合があります。これらの理由から、コンテキスト スイッチで何かを変更したくはありません。共有ライブラリ テキスト ( libc.soなど) は、コンテキスト スイッチで同じにする必要があります。各プロセスが同じ仮想アドレスにマッピングされた libc.so を持っていることを願っています。これを行うことには大きな利点があります。メモリの使用量が少なく、I キャッシュの使用量が多い。
ドメインとPIDレジスタ、およびスーパーバイザ/ユーザー モードもメモリ アクセスを制御できます。これらは、コンテキスト スイッチで切り替えることができる単一のレジスタです。
ARMV5での PID とドメインの使用に関する情報については、http://lwn.net/images/conf/rtlws11/papers/proc/p01.pdf を参照してください。現在の Linux ソースは、論文で説明されているとおりには動作しません。Linux がこのメカニズムを使用する必要がなく、TTBCRを 0 に設定して、ARM サブアーキテクチャの VM コードが類似している可能性は十分にあります。
編集: TTBCR機能を使用して 3G/1G 分割を実現できるとは 思いません。Rutger のページでは、 Linuxのコンテキストではなく、一般的にTTBCRについて議論していたと思います。また、少なくとも2.6.38 Linux はドメインまたはDACRを使用していましたが、限られた数のプロセスをサポートする ため、 pidまたはfcseを使用していません。
http://lwn.net/Articles/106177/ - ラトガースのページでも参照されています。