MOBLOG | indiakiloの記録

モブでできている

UNIX fork (1) | セキュリティキャンプ2017 選-A-4

 

indiakilo.hatenablog.com 宣言したとおり、UNIXのforkについて(C言語の実装を)調べた。

 

1.概要

forkは現在実行中のプロセスを複製し、子プロセスを作成する。

親プロセスでは子プロセスのpid、子プロセスでは0が返る(返り値に関してはいろいろありそうだ)。

pid = fork();

と呼び出した時、pid==0なら子プロセス、pid!=0ならば親プロセスとなる。

2.参考

以下のUNIX V6のソースコードを参考にした。

基本的にソースコードで十分だった。

3. forkの大まかな流れ

 まずsys1.cのforkの定義を見ていく。

UNIX V6 fork system call in /usr/sys/ken/sys1.c .

 最初に、uという構造体からu_procpというメンバの値を取得している。uについては後述するが、プロセスを管理する上で必要なものなのだろう。

 行6-13でprocという配列から、p_statがNULLでない要素を探している。
proc配列はstruct proc型の配列で、/usr/sys/proc.hで宣言されている。
どうやらこのproc配列は、プロセスを管理するために使用されているようだ。

 

 forkはprocの中から空き(p_statがNULL)を探し、見つけたらgoto文でfoundに移る(行11)。
見つからなかった場合は、エラー処理のようなものを行い、gotoでoutに移る(行12-13)。
foundでは、newprocという関数を呼び出している(行16)。
おそらく新しいプロセスを生成しているようだが、詳しくは後ほど見ていこう。

 newprocを呼び出したあとはu構造体のメンバの値をいろいろと変更している(初期化のようだ)。
procとuserとを合わせて、プロセスの管理に用いられているのだろう。

 ところで、forkはpidを返すはずだが、考えてみればforkはvoidである。
どのようにpidが返されるのだろうか。今度は、所々で現れるuとprocについて見てみよう。

3.  proc と user

 forkで参照されていたproc配列、uという構造体変数はそれぞれ/usr/sys/proc.h, /usr/sys/user.hで定義、宣言されている。

UNIX V6 struct user in /usr/sys/proc.h

UNIX V6 struct user in /usr/sys/user.h .

 コメントを見る限り、プロセスごとにprocとuserが割り当てられ、procはプロセスの情報、userはプロセスのすべてのデータを持っているらしい。
またprocはプロセスのスワップに関する必要なデータを持っていて、userは時にスワップされるらしい。
procはuserに対する参照を持っていないようだが、userはprocに対する参照u_procpを持っている(user.h:行25)。
procとuserはuidやpidを持っている。

 userはu_dsizeなど、意味有りげなメンバを持っている。

 

切りが悪いが、メモ代わりに一旦ここで投稿する。
(あと2日は掛かりそうだ...)

今度はprocとuserによるプロセスの管理方法、newproc関数に関して詳しく調べて行きたい。