getpid
システムコールは、呼び出しプロセスのプロセスIDを返します。カーネルは、どのプロセスがシステムコールを呼び出しているかをどのように判断しますか?
カーネルはジョブスケジューリングを行い、システムコールを提供します。
プロセスの実行中、カーネルはランタイムをスケジュールします-特にPIDをそれに割り当てます-そのような情報はカーネルのアドレス空間内、データ構造(タスク構造内など)に保存されます。
したがって、プロセスがgetpid()
システムコールを呼び出すと、カーネルは、呼び出し元の(つまり、現在実行中の)プロセスの タスク構造を調べる を実行するだけです。
システムコールが実行されると、特権スイッチがあります。つまり、実行されたコードは、より多くの命令を実行し、ユーザーランドコードに禁止されているデータにアクセスすることができます。
ただし、プロセスコンテキストスイッチがないため、カーネルコードは呼び出しプロセスコンテキストで実行されています。つまり、カーネルはどのプロセスがそれを呼び出しているかを検索する必要はなく、すでに知っています。 getpidシステムコールコードは、独自のプロセス/スレッド固有の情報を含む内部構造へのポインターからプロセスIDを取得するだけです。この構造は、オペレーティングシステムの実装に依存します。
たとえばIllumos(OpenSolaris)では、構造はprocという名前になります: http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/sys/proc.h# 131
シングルCPUシステムには、実行中のプロセスまたは現在のスレッドのproc構造を指すグローバル変数があります。 proc構造にはプロセスIDが含まれています。
マルチCPUシステムでは、すべてのCPUに同様のポインターがあるか、MMUコンテキストを使用して、syscallにそのようなグローバル変数を設定します。
int64_t
getpid(void)
{
rval_t r;
proc_t *p;
p = ttoproc(curthread);
r.r_val1 = p->p_pid;
この例では、curthreadが使用されるグローバル変数です。