Linuxには、共有メモリ、(名前付き)パイプ、ソケット、メッセージキューなど、プロセス間通信のためのさまざまな方法があります。
Linuxカーネルとプロセスが通信する同等または類似の方法は何ですか?いくつかの方法がありますか?
- プロセスはカーネルにシステムコールを行います。
- カーネルはプロセスに信号を送ります。
- プロセスはカーネルファイルを使用して、次のようないくつかの機能を公開します。QEMUは/dev/kvmデバイスノードを介してKVMを使用します。
- もっと…?
プロセス間通信はプロセス間で任意のデータを転送できますが、カーネルとプロセス間で転送できるデータ形式は(私がリストした方法に応じて)より制限されていますか?
ありがとうございます。
答え1
プロセス間通信は、ある点ではユーザー空間とカーネル間通信の特別なケースです。プロセス間通信は常にカーネルによって調停されるためです(少なくとも設定と解放の場合)。
プロセスがカーネルを呼び出すとき、プロセスはまだ実行中ですが、カーネルモードになっています。したがって、プロセスとカーネルを区別するのは便利ですが、多少不正確で誤解を招く可能性があります。リストされたイベントにより、データがユーザー空間からカーネルに渡され、カーネルモードで実行される処理は次のとおりです。
ioctl
(これは実際にはシステムコールですが、非常に一般的なので、別々に考慮するのが便利です。)- メモリマッピングファイル(メモリマッピングはプロセス間でメモリを共有する方法でもあります)
- ネットワークリンクソケット。
ユーザー空間とカーネルの間で転送できるデータの性質には本質的に制限はありません。write
ファイルに何でも書き込むことができます。send
ソケットに何でも書くことができます。データが意味があるかどうかは、自分が実行する操作によって異なります。ソケットを使用する2つのプログラム間の通信にアプリケーション層プロトコルが存在する必要がありますか?質問(あらゆる形態のコミュニケーションに適用可能)