2017-06-20 2 views
2

私はUARTレジスタの読み書きのために/ dev/memを開くのにmmapを使用しています。 正常に動作しますが、私の質問は次のとおりです。 書き込み後、MS_SYNCフラグ付きのmsyncシステムコールが本当に必要ですか?/dev/memに書き込むときには常にmsyncが本当に必要ですか?

私の理解から、/ dev/memは、仮想メモリアドレスを変換することによって物理メモリゾーン(私の場合はUARTレジスタ)へのアクセスを提供し、ユーザスペースから物理メモリにアクセスできる仮想デバイスです。

これは一般的なファイルではないので、レジスタの変更はバッファリング/キャッシュされていないと思います。私は実際にパフォーマンス上の理由からこのシステムコールを避けたいと思っています。

おかげ

+0

"私はmmapを使って/ dev/memをUARTレジスタに読み書きするために使用しています。" **大ミス**。これにはカーネルドライバとシリアルAPIを使用します。 –

答えて

3

私の理解では、msync()mmap()で作成されたマッピングを介して変更され、通常のファイル内のデータを更新するために必要とされるということです。

しかし、あなたはあなたは自分のプロセスの仮想アドレス空間に直接必要なハードウェアのメモリ範囲をマッピングしているので、msync()が話題オフで、ディスク上の通常のファイルをマッピングされていません/dev/memmmapを使用する場合、それは何もしません。

mmapped仮想空間への書き込みとハードウェアデバイスの間にあるのは、CPUキャッシュだけです。強制的にキャッシュを強制的にフラッシュすることができます(__clear_cache()?)が、カーネルがメモリマップされたデバイスレジスタを識別し、その範囲のキャッシュを無効にするため、通常は不要です。通常MTRRで行われるX86 CPUでは、詳細はわかりません...

関連する問題