4

したがって、基本的には、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の有効化

4

1 に答える 1

3

簡単に言うと、ARMv7-Aで要求したことを正確に実行する方法はありません。ARM720Tの例は、非常にマイクロアーキテクチャ固有のハックであり、異なるプロセッサ間での移植性が保証されることはありませんでした。

ARMv7-Aの場合MMUのオン/オフを切り替えるためにIDマッピングを使用しない移植可能な方法はありませんが、変換テーブルの更新に関しては、次のことができます(ARM720Tでは使用できませんでした)。TTBR1/TTBR0の組み合わせを使用することです。記述子を保持します。TTBCRのNフィールドは、TTBR1テーブルをオーバーレイするTTBR0テーブルのサイズを構成します。このように、TTBスイッチングコードが、更新しているものとは異なるTTBRを介して記述された領域に存在する限り、マップの競合はありません。

もう1つのオプションは、切り替えるのではなく、TTBR0によって記述された変換テーブルを書き直すことです。

于 2012-12-03T16:46:18.433 に答える