1

DMA と CPU 間の一貫性に関する問題に遭遇しました。これが単純化されたユースケースです。

  1. Cortex A5 CPU は、非セキュア状態で非セキュア メモリに書き込みます。MMU は有効で、メモリ属性は通常、共有可能、キャッシュ可能です。したがって、データは、次の参考文献によると、いわゆる非セキュア キャッシュにある可能性があります。

    [1] DDI0434B_cortex_a5_mpcore_r0p1_trm の「データ キャッシュ タグ データ フォーマット」

    [2] アーティレス ノイズからの回答セキュア モードでセキュア/非セキュア メモリにアクセスするにはどうすればよいですか?

    [3] http://atmel.force.com/support/servlet/fileField?id=0BEG000000002Urの 6 ページ目

  2. DMA は、そのメモリ領域に対して安全なコヒーレント読み取りを発行します。DMA は ACP に接続されています。

  3. SCU は、セキュアとしてタグ付けされたキャッシュのみをチェックしようとします。したがって、データは DDI0434B_cortex_a5_mpcore_r0p1_trm の「ACP 要求」に従ってメイン メモリから返されます。

  4. DMA は古いデータを取得する可能性があります。


私の説明が正しければ、ここに私の 2 番目の質問があります。この問題を解決できるアクションはどれですか?

1) DMA 読み取りの前に明示的にキャッシュを消去する

2) メモリの属性を通常、共有可能、キャッシュ不可に変更します。

また、TRM は、「バス インターフェイス ユニットと SCU インターフェイス」の SCU インターフェイスに書き出される前に、キャッシュ エビクションまたはキャッシュ不可能な書き込みバーストからのデータを保持するために使用される書き込みバッファーがあると述べています。ただし、書き込みバッファーに関するこれ以上の情報は見つかりません。書き込みバッファには一貫性を確保するための魔法があると思いますか? 誰かが魔法を説明できるなら、私はとても感謝しています.


より多くの組み合わせを考慮して、このテーブルを自分で取得します。

 CPU state |   Memory   | DMA access | Result    
-----------+------------+------------+-----------+    
non-secure | non-secure | non-secure | OK            
non-secure | non-secure |   secure   | NG    
non-secure |   secure   |     -      | NA    
secure     | non-secure | non-secure | OK    
secure     | non-secure |   secure   | NG (Same reason as the second case)
secure     |   secure   | non-secure | NA    
secure     |   secure   |   secure   | OK

最初の列は、CPU がメモリに書き込む状態を示します。

2 番目の列は、メモリが安全かどうかを示します。ここで「セキュア」とは、AxPROT[1] が High の場合に AXI によってアクセスが拒否されることを意味します。メモリ属性は通常、共有可能、キャッシュ可能です。

3 列目は、DMA が発行するアクセスの種類を示しています。アクセスは一貫しています。

4 番目の列は、何が起こるかを示します。

NG は、DMA が古いデータを取得する可能性があることを意味します。

NA は、アクセスが不可能であることを意味します。

OK は、DMA が CPU とコヒーレントであることを意味します。

ですよね?


Notlikethat's answer に従って、この部分を追加します。実際には悪夢かもしれません。しかし、私は理論的に何が起こるか知りたいです。

  1. 物理アドレス 0x10 が 2 つの仮想アドレス NS:0x110 と S:0x210 にマッピングされているとします。
  2. セキュア状態の CPU は、値 0x110 を NS:0x110 に書き込み、次に値 0x210 を S:0x210 に書き込みます。
    つまり、両方が同時に L1 キャッシュにある可能性がありますよね?
  3. 次に、DMA1 は PA 0x10 への安全な読み取りを行い、0x210 を取得する場合があります。DMA2 は、PA 0x10 に対して非セキュアな読み取りを行い、0x110 を取得する場合があります。
  4. その後、最終的にどちらが主記憶に残るかは予測不能です。

私の理解を確認または修正してください。どうもありがとうございます。

4

1 に答える 1

1

アーキテクチャ上、「非セキュア メモリへのセキュア アクセス」を行うことはできません。安全な物理アドレス空間と非安全な物理アドレス空間は独立しています (多くの TrustZone 対応システムには、安全なアクセスと非安全なアクセスのために異なるアドレスに表示されるものがあります)。ただし、実際には、多くの周辺機器 (メモリ コントローラーを含む) が TrustZone に対応していないため、ほとんどのシステムでは TZASC の背後にあり、その時点でセキュア アドレス空間と非セキュア アドレス空間が大きく重なります。

CPU では、セキュア ソフトウェアは、NS ビットが設定されたページ テーブル エントリを介して、または SCR.NS が設定されたモニタ モードから、非セキュア メモリにアクセスします。どちらの場合も、結果のバス アクセスには AxPROT[1] が設定されています。つまり、非セキュア アクセスです。周辺機器が非セキュア メモリに正しくアクセスできるようにする場合は、同様の方法で非セキュア アクセスを発行する必要があります。

それ以外の場合は、物理エイリアスのより一般的な問題のケースであり、絶対に必要でない限り通常は推奨されません。より伝統的な例は、かなり高い物理アドレス (0x80000000、または LPAE の 32 ビット以上) にある DRAM を備えたシステムです。その一部は、MMU がセットアップされるまで使用するために、下位 (たとえば、ブート ベクトルの場合は 0x0) にエイリアスされます。物理的にタグ付けされたキャッシュでさえ、0x0 と 0x80000000 が実際に相互接続の反対側の同じ場所にあることを認識していません。アーキテクチャであり、明示的なキャッシュ メンテナンスでのみ管理できます。

同様に、物理アドレス タグの一部としてセキュリティ状態を含む TrustZone 対応キャッシュは、S:0x80000000 と NS:0x80000000 が実際に特定のシステムの同じ場所に配置される可能性があることを認識しません (一般に、 、そうではないかもしれません)、繰り返しますが、手動で管理しない限り、2 つのアドレスは一貫性がありません。1 つのエイリアスに書き込まれたデータは、キャッシュから消去して、表示されるようになる前に、TZASC を超えたポイント (つまり、通常は DRAM まで) に移動する必要があります。もう一方から。Cortex-A5 システムに PL310 のような外部 L2 キャッシュがある場合、これは VA から PoC への CPU キャッシュのクリーニング、続いて必要に応じてセキュア/非セキュア アクセスを介した PA による L2 のクリーニングを意味することに注意してください。同期の問題を回避するために、安全な世界だけで行われます。理論的には、すべてをキャッシュ不可のアクセスにすることで、すべてのデータが DRAM を介して強制的に往復することでコヒーレンシの問題を回避できますが、特定の外部キャッシュ構成が依然としてそれを妨げる可能性があることは不可能ではありません。DMA コントローラが非セキュアなアクセスを適切な場所で直接発行するようにする方がはるかに優れているため、実際にそれらと戦うのではなく、キャッシュから利益を得ます。

于 2016-12-02T11:19:49.200 に答える