6.828: Operating System Engineering (83)
Required reading: xv6 trapasm.S, trap.c, syscall.c, initcode.S, usys.S. Skim vectors.S, lapic.c, ioapic.c, picirq.c.
とのことなのですが、まだ目を通していないソースファイルがありますね。確認してみます。
ちょっと道に迷った
usys.S の中は以下なカンジで
#define SYSCALL(name) \ .globl name; \ name: \ movl $SYS_ ## name, %eax; \ int $T_SYSCALL; \ ret SYSCALL(fork)
system call 呼び出し側の i/f を提供しているように見えます。例えば fork を取り上げてみますが、proc.c にも fork という関数の定義は存在します。
// Create a new process copying p as the parent. // Sets up stack to return as if from system call. // Caller must set state of returned proc to RUNNABLE. int fork(void)
Makefile 見てみると kernel 内部で使ってるのは proc.c の方で、というか usys.S は kernel の生成とあまり関係無い模様。上記の通り i/f になってるのか。Makefile の _forktest なルールの記述が以下。
_forktest: forktest.o $(ULIB) # forktest has less library code linked in - needs to be small # in order to be able to max out the proc table. $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o _forktest forktest.o ulib.o usys.o $(OBJDUMP) -S _forktest > forktest.asm
リンク時に usys.o を使ってます。forktest.asm でも以下な記述があります。
00000340 <fork>: name: \ movl $SYS_ ## name, %eax; \ int $T_SYSCALL; \ ret SYSCALL(fork) 340: b8 01 00 00 00 mov $0x1,%eax 345: cd 40 int $0x40 347: c3 ret
そのまんまと言えばそのまんま。ここで気になり始めたのが呼び出し元にどうやって値を戻すのか、というナニですが、ちょっとタイムアップなので帰宅後に確認してみます。