3

一般に、Linux プログラミングは初めてです。

共有メモリ経由でカーネル モジュールと通信しようとしていますが、shmget() などのユーザー アプリで使用される関数を呼び出すことができません。kernel-headers と kernel-devel をインストールし、カーネル モジュール ソースに を含めましたが、ヘッダーには関数が含まれていません。

カーネルで共有メモリを使用する標準的な方法はありますか?

また、同じ状況でソケットを使用する方法に関するヒントは非常に役立ちます。

使用ディストリビューション: CentOS 5.2 カーネル: 2.6.18-92.1.22.e15

前もって感謝します。

//追加// 明確にするために、典型的な組み込み Linux プロジェクトの共通機能を備えたデモを作成しようとしています。最終的な目標は、それを LynxOS に移植して、大規模なプロジェクトで移植するとどのような問題が発生するかを確認することです。

現在、デモの主な機能は、マルチプロセス、パイプ、メッセージ キュー、共有メモリ、ソケット、マルチスレッドです。

これには、相互に通信するユーザー アプリとロード可能なカーネル モジュールがあります。ユーザー アプリ内の 2 つのプロセス間のパイプとメッセージ、およびユーザー アプリとカーネル モジュール間の共有メモリとソケット。

コース外で単純なことをしている場合は、教えてください。

4

3 に答える 3

3

あなたの目的は私にはあまり明確に見えません。共有メモリは、ユーザー空間とカーネル空間の間で通信する方法ではありません。カーネルに割り当てられたメモリにアクセスしたい場合、1 つの方法は mmap システム コールを実装することです。

どうしてもカーネルコードを書く必要がある場合は、以下を読むことをお勧めします: linux device driver third edition。探しているのは第 15 章です。

メモリを共有したら、おそらく同期を行う方法が必要になるでしょう。つまり、カーネル内の 1 つの部分で作業しながら、ユーザー空間の別の部分を使用します。ユーザー空間/カーネルのメモリ共有の例は、V4L2 APIです。よりわかりやすい説明は、LWN シリーズで見つけることができます。

ただし、やりたいことをより具体的にすると、カーネルモジュールが本当に必要かどうか、どのカーネルコードを調べることができるかなど、それを行う方法についてより具体的なヘルプが表示されます。

ソケットのことはよくわかりませんが、linux + kernel + netlink をググるべきです。「標準」ソケット呼び出しを介してユーザー空間からカーネルと通信するために使用されますが、モジュールでの使用方法についてはまったくわかりません。

于 2009-02-05T07:43:54.137 に答える
2

カーネルはユーザー空間メモリに自動的にアクセスできます。カーネルにはすでにこの例がたくさんあります (ヒント: open() は、開くファイル名を読み取るためにユーザー空間にアクセスする必要があります)。

あなたのユースケースが何であるかは明確ではありません。より具体的にしてください。

ユーザー空間とカーネルの間で通信する通常の方法は、sys コールを介して行われます。独自のものを追加したり (必ずしも推奨されるわけではありません)、既存のものを拡張したりできます (キャラクターデバイスの ioctl が一般的です)。

多くのカーネル モジュールがデバイス スペシャル ファイルを実装しています。これは (ほとんどの) デバイス ドライバーが行うことです (Linux ではデバイス スペシャル ファイルではないネットワーク インターフェイスを除く)。

于 2009-02-05T13:32:08.627 に答える
0

以下は、カーネル mmap デバイス ファイル (単純なデバイス ドライバーを作成するか、fifo ファイルも使用するか、Netlink ソケット (ネットワーク スタック)、ソケット (ネットワーク) を使用するか、またはシステム コールを作成するか、またはシステム コールを作成する方法です。あなたが達成したいことを正確に教えてください。私はあなたをもっと助けることができます.

于 2010-03-12T11:45:58.803 に答える