web-dev-qa-db-ja.com

ユーザー空間でプログラムからカーネルモジュール関数を呼び出す

カーネルモジュールとその上でいくつかの関数を開発しました。次に、ユーザー空間でプログラムを開発し、カーネルモジュールにあるいくつかの関数を呼び出す必要があります。

また、プログラムのカーネルモジュールのユーザー空間にあるグローバル変数にアクセスする必要があります。

23
Ricardo

Linux-kernelモジュールと相互作用するユーザー空間プログラムの完全な概要があります http://wiki.tldp.org/kernel_user_space_howto "カーネル空間、ユーザー空間インターフェイス "by Ariane Keller(2008-09-28からですが、カーネル約2.6です。主要な新しい方法は relayfs です)

ユーザー空間からカーネル空間への通常の関数呼び出しはリストされていません。syscall(新しいsyscallの追加は簡単ではありません)とupcall(逆方向の呼び出し)のみです。

最も簡単なインターフェースの1つはioctlです。ただし、procfs、sysfs、または同様のファイルを作成する前にioctlの使用を開始することはできません。

その他はsysctlです。ただし、sysctlは、グローバル変数の読み取り/書き込みにより適しています。 (sysctlインターフェースを介していくつかのパラメーターを渡すことは困難です)。

24
osgx

カーネルとユーザーランドの分離のポイントが欠けているようです。ユーザープログラムがカーネル内のデータを直接変更できる場合、それはすぐに災害につながります。

ユーザープログラムがカーネルからサービスを明示的に要求する従来の方法は1つだけです make a system call

trapsといくつかのLinux固有のユーザーランドカーネル通信メカニズムもありますが、それらはここでは関係ありません。

6

他のポスターが述べたように、カーネルとユーザー空間の間には明確な違いがあります。したがって、ユーザー空間から直接カーネル関数を呼び出すことはできません。ユーザー空間とカーネル空間の間でメッセージを送信する最も簡単な方法は、netlinkソケットを経由することだと思います。 netlinkソケットを使用すると、ユーザーレベルとカーネルレベルの間で任意のデータ構造を簡単に渡すことができます。

はい、ioctl、システムコールは実行可能な代替手段であり、任意の情報を渡すためのnetlinkソケットほど柔軟ではありません。

ここにサンプルコード: http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-3.html

5
ajpyles

カーネルを更新するための何らかのメカニズムがない場合を除いて、新しい呼び出しを使用するには新しいカーネルをインストールする必要があります... http://www.cyberciti.biz/tips/how-to-patch -running-linux-kernel.html

1
Jay