UNIX V6: プロセス切り替えのところを読む
プロセス切り替えの肝、swtch()を読みつつ、 UNIX V6のプロセス管理の仕組みの理解を整理しつつ。
まず一般的に考えてみて、
あるプロセスから別のプロセスに切り替わる作業は、
・今のプロセスのコンテクストを保存しておく
・切り替え先プロセスのコンテクストに戻す
を行う。
コンテクストはプログラムが走っている途中の状態を指すが、実際は、
・PC
・SP
・作業中のレジスタ情報
の情報になる。(これらが復帰すれば、いったん中断された状態に戻れる)
もちろん、そのプロセスが使っているスタック、変数領域は全部、破壊されずに保存されているのが前提。
で、UNIXの場合、
関数(サブルーチン)呼び出しの時は、戻り先PCとレジスタ群はスタックに積まれる。
コンテクストを戻す際は、スタックの状態が安全に保存されている前提であれば、
最低限戻すべき情報は
SP
だけで良いはず。
しかし、実際はUNIXというかCは、関数内ローカル変数のアクセスに
r5 (フレームポインタ)を使っているので、この情報も戻さないと動きがおかしくなる。
UNIX V6のCはr5をフレームポインタに使っているが、pdp-11版gccのも同じ役割でr5を使っていた。
スタックの処理が肝になるのだが、まだよくわからない点:
・システムコール時のSPはどこを指しているの?
・PDP-11のSPは、割り込み(カーネルモード)用とユーザ用とがあるが、切り替えはどこ?
・プロセスごとにカーネル作業用スタック領域があるがこれは何?
・プロセスごとのスタックは、制御がプロセスに戻るときに使われるんだろうな、
とりあえず、以上。
2014-10-18 08:43
nice!(0)
コメント(0)
トラックバック(0)
コメント 0