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 なナニが出てくるようなんだけどやっぱ駄目だ。