1

では、カーネル空間で定義されているユーザーレベル空間から読み取りたい構造体を考えてみましょう。ただし、ユーザーレベル空間には複数のプロセスがあります。

例:

カーネル モジュールには、グローバル構造体があります。構造体 { int a; int b; } テスト;

ユーザーレベルのモジュールで、そのグローバル構造体を「外部化」しました

extern struct { int a; int b; } テスト;

コンパイラは文句を言わないし、リンケージエディタも文句を言わない。ただし、ユーザーが複数のプロセスを持っている場合、その構造体はプロセスごとに複製されますか? extern と一緒に共有メモリを使用すると、カーネルの構造体にアクセスできます。n 個のプロセスがある場合、共有されているため、構造体は 1 つしかありません。1 つのユーザー レベル プロセスでカーネル レベル変数にアクセスできますが、それ以上のプロセスがある場合は、「外部化」された各構造体のクローンを取得します。

私の質問は、複数のユーザーレベルのプロセスがカーネルレベルの変数を読み取ることはできますか?

4

3 に答える 3

2

いずれの場合も、ユーザー空間はカーネル RAM を直接見ることができません。また、/dev/kmem を mmap することも良い解決策ではありません (私の意見では、これは非常に見苦しく、カーネルのデバッグにのみ使用する必要があります)。

最も良い方法は、/proc 内のファイル (これは非常に簡単です) または IOCTL を備えたキャラクター デバイス (これは少しだけ複雑です) のいずれかを介して公開することだと思います。

(注意: これは Linux / Unix 固有のものです)

于 2010-02-18T08:11:25.077 に答える
1

mmapUnixでは、これは通常、/dev/kmem.

于 2010-02-17T14:02:02.097 に答える
1

ほとんどのオペレーティング システムでは、ユーザー空間からカーネル空間変数にアクセスできません。
OS が提供するメカニズムを介してデータを公開する必要があります。これは、カスタム システム コール、vfs を介して公開されたファイル、またはその他の形式の IPC である可能性があります。

于 2010-02-05T10:20:57.287 に答える