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이라는 특수한 명령어를 도입하여 시스템 콜 핸들러를 빠르게 호출하는 방법을 마련했..
Virtual Memory Layout Pint OS에서 가상 메모리는 2개의 영역으로 나뉜다. User Virtual Memory: 가상 주소 0부터 KERN_BASE(0x8004000000) 사이의 영역 Kernel Virtual Memory: 가상 주소 KERN_BASE(0x8004000000) 이상의 영역 User Virtual Memory 유저 가상 메모리는 프로세스마다 할당된다. 커널이 한 프로세스를 다른 프로세스로 전환할 때, 페이지 테이블을 통해 유저 가상 주소 공간도 전환된다(Context Switching).구조체 thread는 프로세스의 페이지 테이블을 가리키는 포인터를 가지고 있다(curr_thread->pml4). 유저 프로그램은 오직 할당된 유저 가상 메모리에만 접근할 수 있다...