diary)この広告は、90日以上更新していないブログに表示しています。勉強はじめに今回は12章の続きを追います。breakを見ていきます。breakの順に見ていきます。こちらの方が理解しやすいと思います。callforkとexecシステムコールはセットで使用されることが多いです。それぞれの概要を見ていきます。forkとはforkはプロセスを新たに生成するシステムコールです。新しいプロセスはforkシステムコールを呼び出したプロセスのコピーと言えます。ppidはforkシステムコールを呼び出したプロセスのpidになります。)の1861-1869あたりや以前のエントリを参考にしてください。forkシステムコールを絵で表すとこんな感じです。execとはexecは、execシステムコールを呼び出したプロセスを「あるプログラムを実行するプロセス」に切り替えるシステムコールです。切り替えることをオーバーレイと呼ぶそうです。絵で描くとこんな感じです。execforkとexecを使うことで、あるプログラムを実行することができます。このときの流れを絵で描くとこんな感じです。アセンブリコードで書くとこんな感じです。waitを呼び出して寝ます。新プロセスはswtchで選択された後、brでhogeに飛んでexec実行した後にexitでプロセスを終了します。ここの詳細はソースコードで確認できます。forkのソースコードforkのソースコードを見ていきます。forkを呼び出したプロセスと新しく生成されたプロセスの二つの観点でソースを見ていきます。proc配列から空きエントリ(p_stat==NULL)を探す。)を呼び出して新しいプロセスを生成。forkシステムコールを呼び出したユーザプロセスのpcをインクリメントする。waitが実行されます。・新しく生成されたプロセスforkを呼び出したプロセスは(たいていの場合?)waitシステムコールを呼び出されます。wait内ではsleepが呼び出され、プロセスは寝ます。sleep内でswtchが呼び出され、実行プロセスが切り替わります。swtchで新しく生成されたプロセスが選択されることで、初めて新しいプロセスは動き出します。waitシステムコールを実行したときに呼ばれるswtchで新プロセスが選択されるとは限らないです(たぶん)。swtchで選択されたときswtchから1が返ってきてここから処理が開始される。返り値として?新プロセスのr0に親プロセス(システムコールを実行したプロセス)のpidを格納する。時刻関係の値を初期化しreturn先に掲載したアセンブリコードでは、このあとforkの次の命令であるbrが実行されhogeに飛びます。execのソースコードmanulalで確認すると、execへの引数は以下のようになっています。...\0...nameはプログラムファイルのパス、argsはプログラムの引数です。argnは最後がnull(\0)文字の文字列です。・プログラムファイルのinodeを取得&プログラムへの引数を詰めるためのバッファを取得するinodeに関しては後の章で出てくる(はず)なので、今回は深く追いません。プログラムへの引数はバッファに詰めてからユーザスタックに積みます。バッファの詳細は後の章で出てくる(はず)なので、inode同様深くは追いません。プログラムファイルのinodeを取得する。uchar(7689)はu.u_dirp(=u.arg[0])から文字列を取得するための関数だと思われる。exec実行中のプロセスが(NEXEC=3)以上ならsleepを呼び出して寝る。この理由は3009からのコメント参照。引数を詰めるためのバッファ取得待ちを気にしているらしい。getblkを使って引数を詰めるためのバッファを取得する。