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"); }
なんとなくこれで入口と出口のナニが整理されてしまったような気がしてるのですが気のせいなのかどうか。