プロセスがファイルを開くためにシステムコールを実行すると仮定します。 Linuxカーネルがこのシステムコールを実行すると、Linuxカーネルはシステムコールをfd
実行したプロセスのテーブルに開いたファイルを追加する必要があります。fd
システムコールに渡されたパラメータにPIDが含まれていない場合、Linuxカーネルはどのプロセスがシステムコールを行ったかをどうやって知ることができますか?
答え1
カーネルシステムコールは、呼び出しプロセスのコンテキストで他の権限レベルとは異なるサポートインフラストラクチャを使用して実行されます。 Linuxカーネルには、現在のプロセスを追跡するCPU固有の変数があります。current_task
;現在のプロセスが何であるかを知る必要があるときはいつでもこれを使います。特定のCPUでは、現在のタスクはスケジューラが決定したときにのみ変更され、コンテキストスイッチはカーネルが何が起こっているかを追跡するのに必要なすべての情報を保存するように注意します。
LWNにはシステムコールに関するいくつかの役に立つ記事があります。システムコール分析第1部そしてパート2。システムコールの定義方法とその実行方法について説明します。ユーザー空間からカーネル空間への変換について詳しく説明していないので、実際に質問に答えるのに十分な詳細はありませんが、これは「ただ」落とし穴です。 CPU変換サポートで使用できるベーストラップです。
答え2
あなたの質問によると、アプリケーションは自分のPIDを知って管理し、カーネルがどのように動作するかを知るためにカーネルに渡す必要があります。これは一般的な誤解です。この情報の流れ方は実際には逆です。プロセスは、プロセスID、ファイル記述子テーブルなどを知ったり保存したりする必要はありません。これに関する情報を取得するには、次のシステムコールを使用してカーネルからgetpid
情報を取得する必要がありますioctl
。
カーネルは複数行のソースコードで構成されていますが、片側で実行される単一のプログラムではありません。ユーザー空間プログラムは、反対側からWebブラウザが送信するのと同じように、カーネルに要求を送信します。カーネルに要求します。ネットワークサーバー。システムコールパラメータと戻り値は、アプリケーションとカーネルの間を流れる唯一の情報ではなく、状態(実行中、待機中、休止中...)に関係なく、各スレッドとプロセスに関するすべての下位レベルの情報が格納されます。カーネルメモリ。
システムで実行されているすべてのプロセスに関連する大きなライブラリなど、ほとんどのカーネルコードを表示できます。プロセス(実際にはスレッド)がシステムコールを実行すると、その特殊ライブラリに入り、短時間で超能力が得られます。しかし、まだ同じスレッドなので、カーネル(ここではスケジューラ)なので、所有者、グループ、PID、ファイル記述子テーブルなど、実行中のスレッドを識別して管理するために必要なすべての情報がカーネルにあります。使用可能な(v)CPUにスレッドを割り当てます。