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    

そのまんまと言えばそのまんま。ここで気になり始めたのが呼び出し元にどうやって値を戻すのか、というナニですが、ちょっとタイムアップなので帰宅後に確認してみます。