1

私は arm cortex-a9 クアッド コア デバイスを使用しており、マルチプロセス アプリケーションをプログラミングしています。これらのプロセスは、同じ入力ソース (mmap() 呼び出しを使用してすべてアクセスする DMA バッファ) を共有します。

プロセスが DMA メモリにアクセスするのにかかる時間が、入力のソースを通常の割り当てられたバッファ (つまり、malloc を使用して割り当てられた) に変更した場合よりも大幅に長くなることに気付きました。

DMAバッファがキャッシュ不可でなければならない理由は理解していますが、バッファが安定している(ほとんどの場合、ハードウェアによって変更されていない)かダーティ(データが変更されている)かを判断できるためです。メモリ領域を一時的にキャッシュ可能にすると、速度が大幅に向上する可能性があります。

それを行う方法はありますか?

現在、この行を使用してメモリをマップしています。

void *buf = mmap(0, size, PROT_READ | PROT_WRITE,MAP_SHARED, fd, phy_addr);

ありがとう!

4

1 に答える 1

1

最近のほとんどの CPU は、スヌーピングを使用して、キャッシュ ラインをメモリにフラッシュする必要があるかどうか、またはいつ無効にする必要があるかを判断します。このような CPU では、「DMA バッファ」はバッファと同じですkmalloc()。もちろん、これはスヌープ機能が正しく機能し、OS がスヌープ機能を利用していることを前提としています。DMA メモリ領域と非 DMA メモリ領域へのアクセスに違いがある場合は、CPU にキャッシュ スヌーピング機能がないか (CPU ドキュメントを確認してください)、機能しないために機能が使用されていない (CPU エラッタを確認してください) としか考えられません。 )。

提案されたアプローチの問題:

  1. メモリ領域をキャッシュ不可に戻す時期を知っていますか?
  2. メモリ領域の MMU 設定を変更することは必ずしも簡単ではありません (CPU に依存します)。そのような設定を変更するための API が OS 内に存在するかどうかもわかりません。
  3. メモリ領域の MMU 設定を変更することは、可能であっても危険であり、そのような変更は DMA 操作と慎重に同期する必要があり、そうしないとデータの破損が事実上保証されます。

これらすべての重大な問題を考えるとkmalloc()、DMA バッファーが更新されたことを検出したときに、DMA バッファーからバッファーにデータをコピーすることをお勧めします。

于 2013-06-10T20:13:33.290 に答える