
오늘은 시스템 콜 핸들러 및 시스템 콜 (halt, exit, create, remove)을 구현 하는 것을 목표로 공부를 시작했습니다
우선 각각의 시스템 콜에 대해서 설명하자면
1. halt():
halt() 시스템 콜은 컴퓨터를 종료합니다. 이는 운영체제의 권한으로 실행되며, 시스템 전원을 종료합니다. 사용자 프로그램은 이 시스템 콜을 직접 호출할 수 없습니다.
exit(int status):
exit() 시스템 콜은 현재 실행 중인 프로세스를 종료합니다. status는 프로세스가 종료될 때 운영체제에 반환하는 상태 코드입니다. 이는 프로세스의 종료 상태를 나타내며, 종료 상태를 이용하여 프로그램의 성공 또는 실패 여부를 판단할 수 있습니다.
create(const char *file, unsigned initial_size):
create() 시스템 콜은 새로운 파일을 생성합니다. file은 생성할 파일의 이름과 경로를 나타내며, initial_size는 파일의 초기 크기를 지정합니다. 새로운 파일을 생성하여 파일 시스템에 저장할 수 있게 됩니다.
remove(const char *file):
remove() 시스템 콜은 파일을 삭제합니다. file은 삭제할 파일의 이름과 경로를 나타냅니다. 파일 시스템에서 해당 파일을 삭제하여 저장 공간을 해제합니다.
이러한 시스템 콜은 운영체제에 의해 제공되며, 사용자 프로그램은 시스템 콜을 호출하여 운영체제의 기능을 사용할 수 있습니다. 시스템 콜은 운영체제와 사용자 프로그램 간의 인터페이스 역할을 하며, 프로그램의 실행과 파일 시스템 조작 등 다양한 작업을 수행하는 데 사용됩니다

추가로 check_address 함수도 필요한 거 같습니다
void
syscall_handler (struct intr_frame *f UNUSED) {
// TODO: Your implementation goes here.
int sys_num = f->R.rax; //syscall number
switch (sys_num) {
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);
break;
default:
exit(-1);
break;
}
// printf("system call!\n");
// thread_exit ();
}
syscall_handler를 호출할 때 이미 인터럽트 프레임에 해당 시스템 콜 넘버에 맞는 인자 수만큼 들어있습니다. 그러니 각 함수별로 필요한 인자 수만큼 인자를 넣어줍니다. 이때 rdi, rsi, ...얘네들은 특정 값이 있는 게 아니라 그냥 인자를 담는 그릇의 번호 순서입니다. 어떤 특정 인자와 매칭되는 게 아니라 첫번째 인자면 rdi, 두번째 인자면 rsi 이런 식이니 헷갈리지 않는 것이 중요한 거 같습니다
void halt (void) {
power_off(); // src/include/threads/init.h
}
hatl()는 호출 시 핀토스를 종료시키는 함수입니다
void exit (int status) {
thread_current()->exit_status = status;
printf("%s: exit(%d)\n", thread_name(), status); //종료 메시지 출력
thread_exit();
}
exit()는 핀토스 전체가 아닌 현재 돌고 있는 프로세스만을 종료시키는 함수입니다
bool create (const char *file, unsigned initial_size) {
check_address(file); //유저 영역의 주소인지 확인
return filesys_create(file, initial_size);
}
create()은 파일을 생성하는 함수입니다
remove()
bool remove (const char *file) {
check_address(file); //유저 영역의 주소인지 확인
return filesys_remove(file);
}
remove()는 파일을 제거하는 함수입니다
오늘은 저녁에 회식이 있어서 공부를 많이 하지는 못했지만, 앞으로도 열심히 공부해보겠습니다:)