したがって、基本的には、ARMv7コアでメモリ管理ユニットを有効にします。実際の手順は非常に簡単です。変換テーブルのアドレスをにロードTTBR0
し、制御レジスタを使用してMMUを有効にする必要があります。
/* enable mmu */
mcr p15, 0, r0, c2, c0, 0
mrc p15, 0, r12, c1, c0, 0
orr r12, r12, #0x1
mcr p15, 0, r12, c1, c0, 0
現在、ARMv7では(ARMアーキテクチャの他のバージョンとは異なり)CPUが仮想アドレスからのフェッチをすぐに開始するため、MMUが有効になるとすぐに問題が発生します。したがって、ブートローダーがで実行され0x10000000
てからMMUを有効にすると、最初にIDマッピングを入力しない限り、次のフェッチで0x10000004
プリフェッチが中止されます。これで、MMUの初期有効化中にIDマッピングを使用してこれを実行できることを認識しています。ただし、変換テーブルを切り替える(新しい値をにロードするTTBR0
)ときにも同じ問題が発生します。
TTBR0
したがって、基本的に、新しい値をロードして(またはMMUをオンにするだけで)、すぐに新しいアドレスにジャンプする、多かれ少なかれ簡単な方法を探しています。これは、新しいマップで有効になります。これは、MMUを有効にする、または状態を変更する命令に続く少なくとも4つの命令が古いアドレスからフェッチされたため、以前のアーキテクチャで可能でした。理想的には、ページテーブルを切り替えたり、MMUをオンにしたりするたびに、IDマッピングを作成する必要がある、信じられないほど醜いハックに頼ることなく、それを実行できるようにしたいと思います。
古いアーキテクチャについて話していたときの意味を明確にするために、ARM720TでMMUをオンにする方法を説明するARMインフォセンターページへのリンクを次に示します。7.16.1。MMUの有効化