ウォンツテック

そでやまのーと

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でそのまんまシステムコール呼んでますね。他のシステムコールも大体同じようです。
※この辺は単純なのでちょっとした手直しで移殖出来そうですが当面は止めておきます。

コンパイル

が通らなくなった。。makefileをいじったせいか、こないだいじったファイルシステム作成ツールのせいかどっちだ

追記

コンパイルは通ったけどopenかreadでpage fault発生中