23

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

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

4

4 に答える 4

24

linux-kernel モジュールと対話するユーザー空間プログラムの完全な概要がありますhttp://wiki.tldp.org/kernel_user_space_howto " Kernel Space, User Space Interfaces " by Ariane Keller (これは 2008-09-28 のものですが、約 2.6カーネル; 唯一の主要な新しい方法はrelayfs です)

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

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

他は sysctl です。ただし、sysctl はグローバル変数への読み取り/書き込みに適しています。(sysctl インターフェイス経由で複数のパラメーターを渡すのは困難です)。

于 2012-05-30T13:06:33.013 に答える
6

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

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

トラップや Linux 固有のユーザーランドとカーネルの通信メカニズムもありますが、ここでは関係ありません。

于 2012-05-30T13:14:46.170 に答える
5

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

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

于 2012-05-31T12:13:46.893 に答える
1

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

于 2012-05-30T13:43:31.500 に答える