2012-08-27 8 views
0

pintos/src/lib/user/syscall.c에 정의 된 PintOS (halt(), create() ... 등)에서 이미 정의 된 시스템 호출을 구현하려고합니다. pintos/src/userprog/syscall.c의 현재 시스템 호출 핸들러는 아무 것도하지 않습니다. 시스템 호출을하는 프로세스는 어떻게 만들 수 있습니까? 또한 몇 가지 시스템 호출을 추가해야합니다. 어떻게 진행해야합니까? 하지만 먼저 기존 시스템 호출을 구현해야합니다.Pintos의 시스템 호출 구현

답변

4

pintos의 기본 구현은 호출 프로세스를 종료합니다.
goto this link. 시스템 호출을 구현하기 위해 코드를 수정할 위치에 대한 설명이 있습니다.

"src/examples"디렉토리에는 몇 가지 샘플 사용자 프로그램이 있습니다.
이 디렉토리의 "Makefile"은 제공된 예제를 컴파일하고 사용자가 편집하여 자신의 프로그램을 컴파일 할 수도 있습니다.
이 프로그램/프로세스가 실행되면 inturn이 시스템 호출을합니다.
gdb를 사용하여 이러한 프로그램을 실행하면 간단한 printf 문이 STDOUT 파일에 대한 시스템 호출 쓰기를 호출합니다.
주어진 링크는 gdb에서 핀토를 실행하는 방법에 대한 지침을 가지고 있습니다. 내 생각에 bochs 또는 qemu를 사용하고 있습니다. 어떤 경우에도 pintos에서 실행되는 간단한 hello world 프로그램으로 gdb를 실행하십시오.
이렇게하면 시스템 호출이 어떻게 생성되는지 알 수 있습니다.

static void 
syscall_handler (struct intr_frame *f)// UNUSED) 
{ 
    int *p=f->esp; 
switch(*p) 
case *p=SYS_CREATE // NUMBER # DEFINED 

     const char *name=*(p+1); //extract the filename 
     if(name==NULL||*name==NULL) 
      exit(-1); 

     off_t size=(int32_t)*(p+2);//extract file size 

     f->eax=filesys_create(name,size,_FILE); //call filesys_create 
     //eax will have the return value 
} 

이것은 sys_create에 대한 의사 코드 .. 모든 파일 시스템 관련 시스템 호출은 매우 사소한, 하는 filesys realted 시스템이 그에 상응하는 FD (파일 기술자)에 파일을 변환 할 필요가 열려 읽기 쓰기 가까운처럼 호출입니다. 당신은 트랙이을 유지하기 위해 각 프로세스의 파일 테이블을 추가해야합니다,이 중 전처리 데이터 나 글로벌 데이터가 될 수 있습니다 (UR 선택),

case (*p==SYS_WRITE) 
    { 
    // printf("wite syscall\n"); 
     char *buffer=*(p+2); 
    unsigned size=*(p+3); 
    int fd=*(p+1); 
     // getiing the fd of specified file  
    struct file *fil= thread_current()->fdtable[fd];/ my per thread fdtable 
    if(fd==1) goto here; 

    if(is_directory(fil->inode)){ 
     exit(-1); 
     goto done; 
    } 
here: 
    if(buffer>=PHYS_BASE)exit(-1); 
    if(fd<0||fd>=128){exit(-1);} 
    if(fd==0){exit(-1);} // writing to STDIN 
    if(fd==1)  //writing to STDOUT 
    { 
    int a=(int)size; 
    while(a>=100) 
    { 
     putbuf(buffer,100); 
     buffer=buffer+100; 
     a-=100; 
    } 
    putbuf(buffer,a); 
    f->eax=(int)size; 
    } 
    else 
     if(thread_current()->fdtable[fd]==NULL) 
     {f->eax=-1;} 
    else 
    { 
     f->eax=file_write(thread_current()->fdtable[fd],buffer,(off_t)size); 
    } 
done: ; 

    }//printf("write");}     /* Write to a file. */ 

열기 -. fdtable와 FD의 수를 반환하는 항목을 새롭게 추가 u 파일에 부여,
닫기 - fd 테이블에서 해당 항목을 제거하십시오.
읽기 - 쓰기와 유사합니다.

process_create, 대기는 ...

건배 :)

+0

덕분에 간단하게 구현할 수 없습니다. 그러나 나는해야 할 편집이 무엇인지 알고 싶습니다. syscall 핸들러를 수정해야한다는 것을 알고 있지만, 작성해야 할 문장은 무엇입니까? – Dynamite

+0

편집 됨 시스템 호출 중 하나에 대해 변경해야 할 사항 – Deepthought

+0

링크가 깨졌습니다. –