시스템 호출 인프라를 구현

userprog/syscall.c에 시스템 호출 핸들러를 구현. 제공된 골격 구현은 프로세스를 종료하여 시스템 호출을 "처리”함. 시스템 호출 번호와 인수를 검색하고 적절한 조치를 수행해야함.


시스템 호출 세부 정보

첫 번째 프로젝트에서는 운영 체제가 사용자 프로그램으로부터 제어권을 되찾는 한 가지 방법인 타이머 및 I/O 장치로부터의 인터럽트를 다뤘습니다. 이는 CPU 외부의 엔티티에 의해 발생하므로 "외부" 인터럽트입니다.

운영 체제는 프로그램 코드에서 발생하는 이벤트인 소프트웨어 예외도 처리합니다. 여기에는 페이지 폴트 또는 0으로 나누기와 같은 오류가 포함될 수 있습니다. 예외는 또한 사용자 프로그램이 운영 체제에 서비스("시스템 호출")를 요청하는 수단이기도 합니다.

전통적인 x86 아키텍처에서 시스템 호출은 다른 소프트웨어 예외와 동일하게 처리되었습니다. 그러나 x86-64에서는 제조업체가 시스템 호출을 위한 특수 명령인 **syscall**을 도입했습니다. 이는 시스템 호출 핸들러를 호출하는 빠른 방법을 제공합니다.

오늘날 syscall 명령어는 x86-64에서 시스템 호출을 호출하는 가장 일반적으로 사용되는 수단입니다. Pintos에서 사용자 프로그램은 syscall을 호출하여 시스템 호출을 수행합니다. 시스템 호출 번호 및 추가 인수두 가지 점을 제외하고 syscall 명령어를 호출하기 전에 일반적인 방식으로 레지스터에 설정되어야 합니다.

따라서 시스템 호출 핸들러인 syscall_handler()가 제어권을 얻으면 시스템 호출 번호는 rax 있고, 인수는 %rdi, %rsi, %rdx, %r10, %r8, %r9 순서로 전달됩니다.

호출자의 레지스터는 struct intr_frame을 통해 접근할 수 있습니다. (struct intr_frame은 커널 스택에 있습니다.)

함수 반환 값에 대한 x86-64 규칙은 반환 값을 RAX 레지스터에 배치하는 것입니다. 값을 반환하는 시스템 호출은 struct intr_framerax 멤버를 수정하여 이를 수행할 수 있습니다.

다음 시스템 호출을 구현하세요.

나열된 프로토타입include/lib/user/syscall.h를 포함하는 사용자 프로그램이 볼 수 있는 프로토타입입니다. (이 헤더와 include/lib/user의 다른 모든 헤더는 사용자 프로그램 전용입니다.) 각 시스템 호출에 대한 시스템 호출 번호include/lib/syscall-nr.h에 정의되어 있습니다.

시스템 호출 구현 목록

void halt (void);
void exit (int status);