8

mmap()この BAR をプロセッサ キャッシュにキャッシュ可能にすることを目標に、PCIe BAR のカスタム関数を使用してドライバーを作成しようとしています。これが最大の帯域幅を達成するための最良の方法ではなく、書き込みの順序が予測できないことは承知しています (この場合も問題ではありません)。

これは、MMAP が値をキャッシュするのをどのように防止しますか?で説明されている内容と似ています。

プロセッサは Sandy Bridge i7、PCIe デバイスは Altera Stratix IV dev です。ボード。

まず、CentOS 5 (2.6.18) でやってみました。MTRR 設定を変更して、BAR がキャッシュ不可能な MTRR 内にないことを確認し、ビットをクリアして使用io_remap_pfn_range()しました。読み取りは期待どおりに機能しました。読み取りは正しい値を返し、同じアドレスへの 2 回目の読み取りでは必ずしも読み取りが PCIe に送られるとは限りません (FPGA で読み取りカウンターがチェックされました)。ただし、書き込みによりシステムがフリーズし、ログや画面にメッセージが表示されずに再起動しました。_PAGE_PCD_PAGE_PWT

次に、PAT をサポートする CentOS 6 (2.6.32) で試してみました。結果は同じです。読み取りは正しく動作し、書き込みはシステムのフリーズと再起動を引き起こします。興味深いことに、非テンポラル/書き込み結合フル キャッシュ ライン書き込み (AVX/SSE) は期待どおりに動作します。つまり、それらは常に FPGA に送信され、FPGA はフル キャッシュ ライン書き込みを監視し、読み取りは後で正しい値を返します。ただし、単純な 64 ビット書き込みでもシステムのフリーズ/再起動が発生します。

また、ドライバーコードioremap_cache()を試してみました。iowrite32()結果は同じです。

ハードウェアの問題だと思いますが、何が起こっているのかについて誰かがアイデアを共有できれば幸いです.

編集: CentOS 6: Machine Check Exception: 5 Bank 5: be2000000003110a で MCE メッセージをキャプチャできました。

2 ソケットの Sandy Bridge (Romley) でも同じコードを試しました。読み取りと非一時的な書き込みの動作は同じです。単純な書き込みでは MCE/クラッシュは発生しませんが、システム状態には影響しません。つまり、メモリ内の値は変化しません。 .

また、古い 2 ソケット Nehalem システムでも同じコードを試しました。コードは異なりますが、単純な書き込みでも MCE が発生します。

4

1 に答える 1

10

MMIO アドレスの WriteBack (WB) メモリ タイプをサポートする x86 ハードウェアを私は知りません。ほぼ確実に、その非互換性の結果が見られます。このトピックについての議論をブログhttp://blogs.utexas.edu/jdm4372/2013/05/29/およびhttp://blogs.utexas.edu/jdm4372/2013/05/30/に投稿しました。

これらの投稿では、一部のプロセッサで機能する方法について説明します。MMIO 範囲を 2 回マップします。1 回目は、Write-Combining (WC) メモリ タイプを使用したプロセッサから FPGA へのストア操作用で、もう 1 回はプロセッサからの読み取り用です。ライト プロテクト (WP) またはライト スルー (WT) タイプを使用して FPGA に書き込みます。「書き込み専用」領域のキャッシュ ラインのエイリアスに書き込む場合、「読み取り専用」領域のキャッシュ ラインで CLFLUSH を使用して手動で一貫性を維持する必要があります。また、IO デバイスは MMIO アドレスのキャッシュ無効化トランザクションを生成できないため、FPGA メモリの値の変更に関して一貫性を手動で維持する必要があります。

私のチームは、私が AMD にいた数年前にこれを行い、現在、新しい Linux カーネルと Intel プロセッサでそれを行う方法を見つけようとしています。Linux は、事前定義されたマッピング関数で WP または WT メモリ タイプを直接サポートしていないため、いくつかのハッキングが必要です.. リージョンの MTRR をオーバーライドするのはかなり簡単ですが、正しい場所を見つけるのにもっと苦労しています( s) remap_pfn_range() 関数の子孫で、範囲の PAT エントリに設定された WP または WT 属性を取得するために変更する必要があります。

この方法は、FPGA のプログラム可能性により、PCI BAR をこの二重マップ モードで動作するように定義し、プロセッサと連携する柔軟性が得られるため、おそらく他の (事前定義された) タイプの IO デバイスよりも FPGA に適しています。キャッシュの一貫性を維持するためのサイド ドライバー。

于 2013-06-06T17:52:43.333 に答える