http://www.makelinux.net/ldd3/chp-2-sect-3#chp-2-ITERM-4135このリンクでは、ユーザー空間とカーネル空間の通信について説明しています。カーネルオブジェクトにリンクして通信(値の送信/受信)するcの単純なユーザー空間アプリケーションプログラムで誰かがそれを説明できますか?
2 に答える
ほとんどのLinuxマシンで利用可能なプログラム(ただし、実行するにはsudo権限が必要)は、システムコールinsmod
を介して指定されたモジュール(カーネルオブジェクト)をロードするようにカーネルに指示します。 init_module
より一般的には、ユーザースペースプログラムは、これらのシステムコールを介してカーネルと通信します。これらのシステムコールは、基本的にユーザースペースからカーネルへの要求です。Cで作成するアプリケーションは、システムと対話するために何らかの方法でシステムコールを使用する必要があります(たとえば、内部でシステムコールをprintf
使用しwrite
て、画面に文字を配置します)。
でファイルを開くだけですopen(2)
。コンパイラは、関数の引数をスタックに置き、特定の方法でクラッシュさせるこの呼び出しのコードをアプリケーションに追加します (システム コールを参照)。カーネルはすべてのクラッシュをキャッチして処理します。
これは「正常な」クラッシュであるため、カーネルは呼び出す関数を検索し、スタックから引数を取得して関数を呼び出します。
この複雑なアプローチの理由はセキュリティです。「クラッシュ」によって、アプリケーションは制御を完全に放棄します。CPUも別のモードに切り替わります。このモードでは、ハードウェアにアクセスできます (「アプリケーション」モードでは、ハードウェアへのアクセスは「不正アクセス」クラッシュにつながり、アプリが終了します)。
関数自体はopen(2)
あまりできません。代わりに、どのファイル システムが要求を処理できるかをチェックし、ファイル システムの open 関数を呼び出します。ファイル システムは、カーネル モジュールとして実装されます。