2

Linux 上の C++ アプリケーションで「バスマスタリング」を介してネットワーク パケットにアクセスすることに興味があります。この全体的なトピックに関連していくつか質問があります。

1) 「バス マスタリング」対応のネットワーク カードがデータを書き込んでいるメモリ アドレス範囲と、これがカーネル空間かユーザー空間かをどのように知ることができますか?

2) #2 が「カーネル空間」の場合、ユーザー空間のメモリに書き込むようにカードを変更するにはどうすればよいですか?

3a) C++ からこの特定のユーザー空間メモリ領域にアクセスするにはどうすればよいですか?

3b) 1 つのアプリケーションから他のプロセスのメモリ領域へのアクセスを開始することはできず、明示的に「共有」されているメモリ領域にのみアクセスできることを理解しています。では、ネットワーク カードによって直接書き込まれたメモリ領域が明示的に共有されていることを確認するにはどうすればよいですか?

4) ネットワーク カードが「バス マスタリング」を実装しているかどうかは、どうすればわかりますか?

私はこの用語に出くわしましたPACKET_MMAP- これは私が必要とするものでしょうか?

4

1 に答える 1

0

メモリの領域を mmap し、そのアドレスを OS に渡すと、OS はその領域をロックして (スワップアウトされないように)、メモリの物理アドレスを取得できます。

この目的にはまったく使用されませんが、drivers/xen/privcmd.c 内のコードは、 from (間接的に、by によって)mmap_mfn_range呼び出される関数内にあります。これは、から順番に呼び出します。privcmd_ioctl_mmaptraverse_mapremap_area_mfn_pte_fnxen_remap_domain_mfn_range

したがって、ページがメモリにロックされ、アプリケーションに属するように、ドライバーでこれらの行に沿って何かを行うと、mmap'd 領域の物理アドレスをネットワークドライバーのハードウェアにプログラムできます。ユーザー コードによって mmap されたユーザー モード メモリにデータを直接取得します。

于 2013-08-17T23:19:20.630 に答える