カーネルモジュールとその上でいくつかの機能を開発しました。ここで、ユーザー空間でプログラムを開発し、カーネル モジュールにあるいくつかの関数を呼び出す必要があります。
また、ユーザー空間でプログラムのカーネル モジュールにあるいくつかのグローバル変数にアクセスする必要があります。
カーネルモジュールとその上でいくつかの機能を開発しました。ここで、ユーザー空間でプログラムを開発し、カーネル モジュールにあるいくつかの関数を呼び出す必要があります。
また、ユーザー空間でプログラムのカーネル モジュールにあるいくつかのグローバル変数にアクセスする必要があります。
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 インターフェイス経由で複数のパラメーターを渡すのは困難です)。
カーネルとユーザーランドの分離のポイントが欠けているようです。ユーザー プログラムがカーネル内のデータを直接変更できる場合、それはすぐに惨事につながります。
ユーザープログラムがカーネルからサービスを明示的に要求する従来の方法は 1 つだけmake a system call
です。
トラップや Linux 固有のユーザーランドとカーネルの通信メカニズムもありますが、ここでは関係ありません。
他の投稿者が言及しているように、カーネルとユーザー空間には明確な違いがあります。したがって、カーネル関数をユーザー空間から直接呼び出すことはできません。ユーザー空間とカーネル空間の間でメッセージを送信する最も簡単な方法は、netlink ソケットを使用することだと思います。netlink ソケットを使用すると、ユーザー レベルとカーネル レベルの間で任意のデータ構造を簡単に渡すことができます。
はい、ioctl、システム コールは実行可能な代替手段ですが、任意の情報を渡すための netlink ソケットほど柔軟ではありません。
カーネルを更新するメカニズムがまだない場合は、新しい呼び出しを利用するために新しいカーネルをインストールする必要があります... http://www.cyberciti.biz/tips/how-to-patch-running-linux -kernel.html