6.828: Operating System Engineering (70)

Running a process

swtch の仕掛けのイメージが今一つ。というか一連の処理の記述を整理した方が良さげ。
ポイントのみ以下に控えておきます。今日はぼさっとしてて何もできず。

  • trapasm.S の trapret で iret で戻ってます。これって mem.pdf にもある通り、%cs と %ip と %eflags を stack から復帰する模様
  • mem.pdf にて allocproc 手続きがポイント高そうな記述があるな

ええと

swtch では

  • cpu->scheduler に esp を退避
  • proc->context を esp に load

してるはず。context 構造体は proc.h で以下な定義な模様。

struct context {
  uint edi;
  uint esi;
  uint ebx;
  uint ebp;
  uint eip;
};

コメントは参考になりますが、引用は略。上記を stack にした上で swtch の末端で

  # Load new callee-save registers
  popl %edi
  popl %esi
  popl %ebx
  popl %ebp
  ret

したら context->eip にセットされたナニが起動されるのかどうか。allocproc で context->eip にセットされてるのは forkret 手続きです。

// A fork child's very first scheduling by scheduler()
// will swtch here.  "Return" to user space.
void
forkret(void)
{
  // Still holding ptable.lock from scheduler.
  release(&ptable.lock);
  
  // Return to "caller", actually trapret (see allocproc).
}

ぬをー

もう少し俯瞰が必要なのかなぁ。mem.pdf 全部きちんと読めてないし。なんとなくここで trapret なナニが出てくるようなんだけどやっぱ駄目だ。