pintos/src/lib/user/syscall.c에 정의 된 PintOS (halt(), create() ... 등)에서 이미 정의 된 시스템 호출을 구현하려고합니다. pintos/src/userprog/syscall.c의 현재 시스템 호출 핸들러는 아무 것도하지 않습니다. 시스템 호출을하는 프로세스는 어떻게 만들 수 있습니까? 또한 몇 가지 시스템 호출을 추가해야합니다. 어떻게 진행해야합니까? 하지만 먼저 기존 시스템 호출을 구현해야합니다.Pintos의 시스템 호출 구현
답변
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, 대기는 ...
건배 :)
덕분에 간단하게 구현할 수 없습니다. 그러나 나는해야 할 편집이 무엇인지 알고 싶습니다. syscall 핸들러를 수정해야한다는 것을 알고 있지만, 작성해야 할 문장은 무엇입니까? – Dynamite
편집 됨 시스템 호출 중 하나에 대해 변경해야 할 사항 – Deepthought
링크가 깨졌습니다. –