9

初期化ルーチン中に、サイズが4KBの構造体をカーネルメモリに書き込むLinuxカーネルモジュールがあります。私がしたいのは、このメモリを共有して、単一のユーザー空間プロセスがこの構造体に読み取り専用でアクセスできるようにすることです。

IOCTLS はこれを行うための最良の方法ではないため、使用を避けるように言われました。したがって、私が読んだことから、それを行うための最良の方法は function を使用するmmapことですが、少し混乱していますCで必要なものを実装する方法について。

function の使用を確認しましたshmgetが、これは IPC 機能を必要とするユーザー空間アプリ向けに設計されているようです。

アドバイス、または簡単な例をいただければ幸いです。

ありがとう!

4

1 に答える 1

0

mmapのような直接アクセスメカニズムでは、誰でも使用できるため、これを安全に行うことはできません。

Linuxでは、ユーザーメモリとカーネルメモリは独立しており、別々のアドレス空間に実装されています。アドレス空間は仮想化されています。つまり、アドレスは物理メモリから抽象化されています。アドレス空間は仮想化されているため、多くのアドレス空間が存在する可能性があります。実際、カーネル自体は1つのアドレス空間に存在し、各プロセスは独自のアドレス空間に存在します。これらのアドレス空間は仮想メモリアドレスで構成されているため、独立したアドレス空間を持つ多くのプロセスは、かなり小さい物理アドレス空間(マシンの物理メモリ)を参照できます。これは便利なだけでなく、各アドレス空間が独立して分離されているため安全であるため、安全です。

ただし、このセキュリティにはコストがかかります。各プロセス(およびカーネル)は、物理メモリの異なる領域を参照する同一のアドレスを持つことができるため、メモリをすぐに共有することはできません。ソース

于 2013-01-12T01:13:43.333 に答える