私は多くのチュートリアルで、ユーザーモードプログラムがカーネルメモリとは異なるプロセスのメモリにアクセスできないことを読んでいます。
しかし、これは常に本当ですか?
例:カーネルは、カーネルメモリまたは他のプロセスのメモリをプロセスの仮想アドレス空間にマップできませんか?
答え1
カーネルアドレスはファイルを読み書きできます/dev/mem
。
ルートである必要があり、Linuxカーネルをコンパイルする必要がありますCONFIG_STRICT_DEVMEM=n
(多くのディストリビューションではデフォルトCONFIG_STRICT_DEVMEM
でセキュリティを有効にします)。
私が書いたGitHubプロジェクトを試してみてください。協会
答え2
私が使用する少なくとも1つのプログラムはカーネルスペースを最大限に活用します(netsniff-ng)。 Netsniff-ngはフレームキャプチャのためのゼロコピーメカニズムです。カーネル空間をユーザー空間にマッピングしてこれを利用します。特に、SOCKET_MMAPシステムコールを使用します。結果は素晴らしいです。一度は、2.1Gbpsを実行しているスイッチポートからフレームをキャプチャしましたが、フレーム損失はまったくありませんでした。
カチッという音ここSOCKET_MMAPシステムコールがどのように機能するかを見てください。いくつかのアイデアを得ることができます。
答え3
他のプロセスのメモリにアクセスするには、次の機能が必要ですノーマルユーザーはそうではありません。ただし、root になるなど、これらの機能へのアクセス権を取得すると、これを行うことができます。