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 が発生します。