OS作成 - シェル編
シェル編という事で今作成してあるシステムコール(open, write, read等)用の静的ライブラリを作成中です。それぞれのシステムコールに対応するファイル(open.S, write.S等)を用意しそれらをarで固めました。libc.aを生成するmakefileとプロセスを生成する(とりあえずproc3用)makefileは以下のようになりました。
libc.a用
include ../../../../makefile.inc SRCS = write.S \ read.S \ open.S \ creat.S \ close.S \ lseek.S \ mkdir.S \ execve.S OBJS = $(SRCS:.S=.o) LIBA = ../libc.a all: ${OBJS} $(AR) rcs $(LIBA) ${OBJS} %.o : %.S $(CC) -c ${CFLAGS} -I ${INCLUDE} -o $@ $< .PHONY: clean clean: rm $(LIBA) h
process用
include ../makefile.inc CRTOBJ = ${LIBDIR}/crt0.o LIBAOBJ = ${LIBCDIR}/libc.a CFLAGS = -nostdlib -Wall LFLAGS = -nostdlib STATIC_LIBS = ${CRTOBJ} \ ${LIBAOBJ} PROC3 = ${USRDIR}/bin/proc3 all: ${PROC3} ${CRTOBJ} ${LIBAOBJ} ${LD} ${LFLAGS} proc3.o -o ${PROC3} ${STATIC_LIBS} %.o: %.c ${CC} -c ${CFLAGS} -I ${INCLUDE} -o $@ $< .PHONY: clean clean: rm ${PROC3}
後、Linuxの静的ライブラリはどうなっているのか気になったのでlibc.aを見てみました。
/usr/lib/libc.aを「 ar xv libc.a 」で展開しそのうちのreadシステムコール用らしきread.oを見てみます。
% ar xv libc.a % objdump -D read.o
0000000a <__read_nocancel>: a: 53 push %ebx b: 8b 54 24 10 mov 0x10(%esp),%edx f: 8b 4c 24 0c mov 0xc(%esp),%ecx 13: 8b 5c 24 08 mov 0x8(%esp),%ebx 17: b8 03 00 00 00 mov $0x3,%eax 1c: cd 80 int $0x80 1e: 5b pop %ebx 1f: 3d 01 f0 ff ff cmp $0xfffff001,%eax 24: 0f 83 fc ff ff ff jae 26 <__read_nocancel+0x1c> 2a: c3 ret 2b: e8 fc ff ff ff call 2c <__read_nocancel+0x22> 30: 50 push %eax 31: 53 push %ebx 32: 8b 54 24 14 mov 0x14(%esp),%edx 36: 8b 4c 24 10 mov 0x10(%esp),%ecx 3a: 8b 5c 24 0c mov 0xc(%esp),%ebx 3e: b8 03 00 00 00 mov $0x3,%eax 43: cd 80 int $0x80 45: 5b pop %ebx 46: 87 04 24 xchg %eax,(%esp) 49: e8 fc ff ff ff call 4a <__read_nocancel+0x40> 4e: 58 pop %eax 4f: 3d 01 f0 ff ff cmp $0xfffff001,%eax 54: 0f 83 fc ff ff ff jae 56 <__read_nocancel+0x4c> 5a: c3 ret
int $0x80でそのまんまシステムコール呼んでますね。他のシステムコールも大体同じようです。
※この辺は単純なのでちょっとした手直しで移殖出来そうですが当面は止めておきます。
追記
コンパイルは通ったけどopenかreadでpage fault発生中