を切り替えることTTB_BASE
は、MMU をオンにすることとほとんど同じです。操作前に 1 つのメモリ空間があり、操作後に別のメモリ空間があります。操作中に有効な状態を維持するには、現在実行中のコードが必要です。選択肢は、
- 現在のコードを両方の同じ場所にマップします。
- キャッシュに依存して移行します。
1つ目は基本的にMMUを有効にするときのphys ==
virtです。更新する場合TTB_BASE
、古いバージョンの完全なコピーが最も基本的です。割り込みがロックされている場合は、切り替えコードが必要とするページをマップするだけで済みます。これは、現在のコード ページが最終的に別のメモリ アドレスに再配置される 2 段階の操作である可能性があります。最初にページにエイリアスを設定し、エイリアスの場所に分岐して元のページを削除します。すべてのステップで、 TLBとキャッシュを安全にフラッシュできます。変更のコンテキストによっては、これを行う必要がない場合があります。ただし、最初のフラッシュの後、後続のフラッシュは、d-cache、i-cache、およびTLBのそれぞれに対して高価ではありません。
2番目の方法はかなり不安定です。StrongARMでは、MMU を有効にすると、これはダンス オブ デスと呼ばれていました。基本的に、プリフェッチとNOPパディングによって命令が順序付けられるように命令のタイミングが調整され、遷移時に物理アドレスから仮想アドレスへの分岐が実行されます。を更新する場合、現在のコード ページが TLB にあり、コードが適切に配置されている場合はI-CACHE行を開始すると想定できます。の後に実行される可能性のある約 6 つの命令があります。TTB_BASE
TTB_BASE
CPU がメモリを取得する前に更新します。TLBをフラッシュしないと、フルページになります。
2番目の方法は、メモリ マップ全体を頻繁に切り替えたいハイパーバイザーの場合にのみ使用されています。通常、ハイパーバイザーは、コンテキスト スイッチでメモリ マップの一部のみを変更します。2番目の方法はわずかに高速ですが、欠点は明らかです。