1

私の知る限り、mmuをオフ/オンにすることは、ARMでTTB_BASEを切り替える良い方法ではありません。より良い方法は何ですか? 主な手順はこのようなものですか? (アーム 920T アームV4T)

1. sync dcache --> 外部メモリ
2 . clean_icache () && 無効化_dcache () ; // これは私の質問です。現在の命令が既に icache にある場合、それらを消去して無効にします。ARM コアは次のステップをどのように認識できますか? ARM コアは再び外部メモリから命令をフェッチできますか?
3. tlb 全体を無効
にする 4. ttb ベースレジスタを変更する

別のより良い方法はありますか?どんな助けでも大歓迎です!^_^

4

1 に答える 1

2

を切り替えることTTB_BASEは、MMU をオンにすることとほとんど同じです。操作前に 1 つのメモリ空間があり、操作後に別のメモリ空間があります。操作中に有効な状態を維持するには、現在実行中のコードが必要です。選択肢は、

  1. 現在のコードを両方の同じ場所にマップします。
  2. キャッシュに依存して移行します。

1つは基本的にMMUを有効にするときのphys == virtです。更新する場合TTB_BASE、古いバージョンの完全なコピーが最も基本的です。割り込みがロックされている場合は、切り替えコードが必要とするページをマップするだけで済みます。これは、現在のコード ページが最終的に別のメモリ アドレスに再配置される 2 段階の操作である可能性があります。最初にページにエイリアスを設定し、エイリアスの場所に分岐ページを削除します。すべてのステップで、 TLBとキャッシュを安全にフラッシュできます。変更のコンテキストによっては、これを行う必要がない場合があります。ただし、最初のフラッシュの後、後続のフラッシュは、d-cachei-cache、およびTLBのそれぞれに対して高価ではありません。

2番目の方法はかなり不安定です。StrongARMでは、MMU を有効にすると、これはダンス オブ デスと呼ばれていました。基本的に、プリフェッチとNOPパディングによって命令が順序付けられるように命令のタイミングが調整され、遷移時に物理アドレスから仮想アドレスへの分岐が実行されます。を更新する場合、現在のコード ページが TLB にあり、コードが適切に配置されている場合はI-CACHE行を開始すると想定できます。の後に実行される可能性のある約 6 つの命令があります。TTB_BASETTB_BASECPU がメモリを取得する前に更新します。TLBをフラッシュしないと、フルページになります。

2番目の方法は、メモリ マップ全体を頻繁に切り替えたいハイパーバイザーの場合にのみ使用されています。通常、ハイパーバイザーは、コンテキスト スイッチでメモリ マップの一部のみを変更します。2番目の方法はわずかに高速ですが、欠点は明らかです。

于 2013-05-08T17:27:55.680 に答える