x86-64 기반 Pint OS 프로젝트 2의 System Calls를 구현하기 위해 공부한 개념을 정리한다. fork 정의 pid_t fork (const char *thread_name); thread_name을 name으로 가지는, 현재 실행 중인 프로세스의 클론(자식) 프로세스를 만든다. fork 함수는 자식 프로세스의 PID(프로세스 식별자)를 반환해야 한다. 반환 값이 0인 경우는 자식 프로세스에서 실행 중임을 나타낸다. 자식 프로세스는 부모 프로세스의 자원(file descriptor, 가상 메모리 공간 등)을 복제해야 한다. 부모 프로세스는 자식 프로세스가 성공적으로 복제되었는지 알기 전까지 fork 호출에서 반환되지 않는다. 즉, 자식 프로세스가 자원을 복제하는 데 실패한 경우, 부모 프..
x86-64 기반 Pint OS 프로젝트 2의 System Calls를 구현하기 위해 공부한 개념을 정리한다. exec 정의 int exec (const char *cmd_line); 현재 실행 중인 프로세스를 cmd_line으로 주어진 실행 파일로 바꾼다. exec 함수가 성공하면 리턴되지 않는다. 어떤 오류가 발생해서 실패한다면 exit (-1)을 호출해서 현재 프로세스를 종료시킨다. exec 함수는 현재 실행 중인 프로세스(스레드)의 이름을 바꿀 필요는 없다. exec 함수를 호출해도 fd(file decriptor)는 열린 상태를 유지한다! 구현 시 어려웠던 점 exec 시스템 콜의 정의를 이해하기 어려웠다. 자식 프로세스를 새로 만들어서 실행 파일을 실행시키는 건지, 아니면 현재 프로세스를 덮어..
x86-64 기반 Pint OS 프로젝트 2의 System Calls를 구현하기 위해 공부한 개념을 정리한다. User Memory Access 시스템 콜을 구현하기 전에, 유저가 보낸 포인터가 유효한 주소를 가리키는 지 확인할 필요가 있다. 만약에 유저 프로그램이 커널 영역을 조작하려고 한다면, 프로세스를 종료함으로써 막을 필요가 있다. 이외에도 포인터가 NULL 포인터인지, 유효한 페이지를 가리키는 지를 확인해야 한다. check_address() void check_address(void *addr) { if (is_kernel_vaddr (addr) || addr == NULL || pml4_get_page(thread_current()->pml4, addr) == NULL) { exit (-1)..
발생 syscall_handler ()와 halt (), exit (), write () 시스템콜 함수를 구현하고 테스트해보기 위해 돌려보았는데, 모든 테스트케이스가 터졌다. halt ()와 exit () 함수가 틀리기도 어려운 정도의 쉬운 함수라서 어디서 틀린건지 도저히 알 수 없었다. 이틀을 넘게 코드를 뒤져봐도 원인을 알 수 없어서 포기하고, 이전 깃헙 푸쉬내역으로 롤백한 후 다시 구현했는데 통과했다.. 너무 허탈하다. 뭐가 달랐던 걸까? pintos -v -k -T 60 -m 20 --fs-disk=10 -p tests/userprog/args-dbl-space:args-dbl-space -- -q -f run 'args-dbl-space two spaces!' test..
x86-64 기반 Pint OS 프로젝트 2의 System Calls를 구현하기 위해 공부한 개념을 정리한다. Implementation userprog/syscall.c에서 system call handler를 구현한다. 핀토스에서 기본적으로 제공된 스켈레톤 코드는 system call을 오직 프로세스 종료로만 다룬다. 우리는 system call number와 argument를 읽고, 적절한 actions을 수행하도록 해야한다. System Call Detail 전통적인 x86 아키텍처에서 시스템 콜은 다른 software exceptions와 동일하게 처리되었다. 그러나 x86-64 아키텍처부터 설계자들은 syscall이라는 특수한 명령어를 도입하여 시스템 콜 핸들러를 빠르게 호출하는 방법을 마련했..