1

独自のファイル記述子を実装するにはどうすればよいですか? 一部のハードウェアを制御するカーネル モジュールがあり、このハードウェアと通信する機能を read() および write() を介してユーザー空間に公開したいとします。IOCTL、netlink、またはその他のユーザー空間とカーネル空間のメソッドを使用したくない。カーネルを再コンパイルする必要がありますか、それともカーネル モジュールを作成するだけで実行できますか?

ファイル記述子を作成するには、ユーザー空間がカーネル空間にタスクのファイル構造体 (つまり、open()、eventfd()、timerfd()、socket() に相当する関数) にエントリを作成するように指示するメカニズムが必要であることを理解しています。IOCTL を介して実装できますが (カーネルを再コンパイルする必要がないように)、read() と write() をハックするにはどうすればよいですか?以前に LD_PRELOAD を使用してパッチを適用しましたが、それが唯一の方法ですか? カーネルを再コンパイルしたくありません!

4

2 に答える 2

0

konrad.kruczynski は正しいです!

ハードウェアと通信するためのユーザー空間メカニズムとしてキャラクターデバイスを使用し、/dev/hardware_type_A などの /dev ファイルシステムにデバイスを作成します。

次に、カーネルでモジュールをコンパイル && ロードします。すべてのコードが適切であれば、カーネルは /dev/ に /dev/hardware_type_A という名前のキャラクター デバイスを作成します。

次に、他のデバイスやファイルを使用してハードウェアを制御するのと同じように、読み取り、書き込み、オープン、クローズの呼び出しを使用できます。

本当に ioctl 経由で制御したくないと言う場合は、書き込みを使用してデータを送信する新しいプロトコルが必要であり、ドライバーはそのデータをアンパックし、ユーザーのプログラムに代わってハードウェアを制御します。

于 2013-03-31T18:00:04.823 に答える
0

私はあなたの質問をすべて理解しているかどうか確信が持てません。それにもかかわらず:

  • これをカーネルモジュールとして確実に持つことができます。
  • おそらくキャラクターデバイスを作成したいでしょう(質問の2番目の部分)。
  • char デバイスの場合、必要なシステム コールを実装できます。readwrite- 問題ありません。

この本の第 3 章 (およびその他) を見てください。

于 2013-03-26T08:59:13.997 に答える