/* 주소 값이 유저 영역에서 사용하는 주소 값인지 확인 */
void check_address(void *addr){
struct thread *t = thread_current();
/* 인자로 받아온 주소가 유저영역의 주소가 아니거나 , 주소가 NULL이거나
해당 페이지가 존재하지 않을경우 프로그램 종료 */
if(!is_user_vaddr(addr) || addr == NULL)
exit(-1);
if(pml4_get_page(t->pml4, addr) == NULL)
exit(-1);
}
✔️순서는 rdi, rsi, rdx 순서대로 인자 값을 넣어주는 것이고 특별한 값이 있는게 아니다.
void syscall_handler (struct intr_frame *f UNUSED) {
/* rax = 시스템 콜 넘버 */
int syscall_n = f->R.rax; /* 시스템 콜 넘버 */
switch (syscall_n)
{
case SYS_HALT:
halt();
break;
case SYS_EXIT:
exit(f->R.rdi);
break;
case SYS_FORK:
f->R.rax = fork(f->R.rdi, f);
break;
case SYS_EXEC:
f->R.rax = exec(f->R.rdi);
break;
case SYS_WAIT:
f->R.rax = wait(f->R.rdi);
break;
case SYS_CREATE:
f->R.rax = create(f->R.rdi, f->R.rsi);
break;
case SYS_REMOVE:
f->R.rax = remove(f->R.rdi);
break;
case SYS_OPEN:
f->R.rax = open(f->R.rdi);
break;
case SYS_FILESIZE:
f->R.rax = filesize(f->R.rdi);
break;
case SYS_READ:
f->R.rax = read(f->R.rdi, f->R.rsi, f->R.rdx);
break;
case SYS_WRITE:
f->R.rax = write(f->R.rdi, f->R.rsi, f->R.rdx);
break;
case SYS_SEEK:
seek(f->R.rdi, f->R.rsi);
break;
case SYS_TELL:
f->R.rax = tell(f->R.rdi);
break;
case SYS_CLOSE:
close(f->R.rdi);
}
}
① halt()
halt()함수 호출 시 핀토스를 종료시키는 시스템 콜
핀토스를 종료시키는 함수 power_off()
/* pintos 종료시키는 시스템 콜 */
void halt(void){
power_off();
}
② exit()
exit()은 현재 실행중인 프로세스만 종료시키는 시스템 콜
스레드를 종료시키는 함수 thread_exit()
thread의 상태를 가져와야하니 thread의 구조체에 상태를 나타내는 exit_status 변수추가
init_thread부분에 exit_status 0으로 초기화
/* 현재 프로세스를 종료시키는 시스템 콜*/
void exit(int status){
/* 종료 시 프로세스 이름 출력하고 정상적으로 종료시 status 0*/
struct thread *t = thread_current();
printf("%s: exit(%d)\n", t->name, status);
thread_exit();
}
③ create()
create()는 파일을 생성하는 시스템 콜
파일 이름과 파일 사이즈를 인자 값으로 받아 파일을 생성하는 함수 filesys_create()
bool create (const char *file, unsigned initial_size){
/*주소 값이 유저 영역에서 사용하는 주소 값인지 확인*/
check_address(file);
/*파일 이름과 파일 사이즈를 인자 값으로 받아 파일 생성*/
return filesys_create(file, initial_size);
}
④ remove()
create()는 파일을 생성하는 시스템 콜
파일 이름에 해당하는 파일을 제거하는 함수 filesys_remove()
bool remove (const char *file){
/*주소 값이 유저 영역에서 사용하는 주소 값인지 확인*/
check_address(file);
/*파일 이름에 해당하는 파일을 제거하는 함수*/
return filesys_remove(file);
}