6.828: Operating System Engineering (84)

ユーザプロセスからシステムコールを呼び出した時に、例えば fork だとプロセス id が戻ってくるのか。

       pid_t fork(void);

なんとなく malloc と勘違いしてたのは秘密w

戻り値

ここだな。syscall.c で定義されてる syscall 手続きの以下。

  num = proc->tf->eax;
  if(num >= 0 && num < NELEM(syscalls) && syscalls[num])
    proc->tf->eax = syscalls[num]();

trapframe の eax に渡せば user なプロセスの戻りになるはず。なんか答えに簡単に到達したのですが、これは xv6-rev5 ならではでしょうな。
あるいは呼び出し前に eax に設定されるナニは system call な番号なのか。ええと、trap 手続きの呼び出し元は alltraps 手続きで

  # vectors.S sends all traps here.
.globl alltraps
alltraps:

# snip

  # Call trap(tf), where tf=%esp
  pushl %esp
  call trap
  addl $4, %esp

この alltraps を呼び出してるのが vectors な配列です。vectors.S で定義。この vectors な配列をナニしてるのが tvinit なのか。

void
tvinit(void)
{
  int i;

  for(i = 0; i < 256; i++)
    SETGATE(idt[i], 0, SEG_KCODE<<3, vectors[i], 0);
  SETGATE(idt[T_SYSCALL], 1, SEG_KCODE<<3, vectors[T_SYSCALL], DPL_USER);
  
  initlock(&tickslock, "time");
}

なんとなくこれで入口と出口のナニが整理されてしまったような気がしてるのですが気のせいなのかどうか。