시스템 호출 인프라를 구현
userprog/syscall.c에 시스템 호출 핸들러를 구현. 제공된 골격 구현은 프로세스를 종료하여 시스템 호출을 "처리”함. 시스템 호출 번호와 인수를 검색하고 적절한 조치를 수행해야함.
첫 번째 프로젝트에서는 운영 체제가 사용자 프로그램으로부터 제어권을 되찾는 한 가지 방법인 타이머 및 I/O 장치로부터의 인터럽트를 다뤘습니다. 이는 CPU 외부의 엔티티에 의해 발생하므로 "외부" 인터럽트입니다.
운영 체제는 프로그램 코드에서 발생하는 이벤트인 소프트웨어 예외도 처리합니다. 여기에는 페이지 폴트 또는 0으로 나누기와 같은 오류가 포함될 수 있습니다. 예외는 또한 사용자 프로그램이 운영 체제에 서비스("시스템 호출")를 요청하는 수단이기도 합니다.
전통적인 x86 아키텍처에서 시스템 호출은 다른 소프트웨어 예외와 동일하게 처리되었습니다. 그러나 x86-64에서는 제조업체가 시스템 호출을 위한 특수 명령인 **syscall**을 도입했습니다. 이는 시스템 호출 핸들러를 호출하는 빠른 방법을 제공합니다.
오늘날 syscall 명령어는 x86-64에서 시스템 호출을 호출하는 가장 일반적으로 사용되는 수단입니다. Pintos에서 사용자 프로그램은 syscall을 호출하여 시스템 호출을 수행합니다. 시스템 호출 번호 및 추가 인수는 두 가지 점을 제외하고 syscall 명령어를 호출하기 전에 일반적인 방식으로 레지스터에 설정되어야 합니다.
%rax**는 시스템 호출 번호입니다.%rcx가 아닌 **%r10**입니다.따라서 시스템 호출 핸들러인 syscall_handler()가 제어권을 얻으면 시스템 호출 번호는 rax에 있고, 인수는 %rdi, %rsi, %rdx, %r10, %r8, %r9 순서로 전달됩니다.
호출자의 레지스터는 struct intr_frame을 통해 접근할 수 있습니다. (struct intr_frame은 커널 스택에 있습니다.)
함수 반환 값에 대한 x86-64 규칙은 반환 값을 RAX 레지스터에 배치하는 것입니다. 값을 반환하는 시스템 호출은 struct intr_frame의 rax 멤버를 수정하여 이를 수행할 수 있습니다.
나열된 프로토타입은 include/lib/user/syscall.h를 포함하는 사용자 프로그램이 볼 수 있는 프로토타입입니다. (이 헤더와 include/lib/user의 다른 모든 헤더는 사용자 프로그램 전용입니다.) 각 시스템 호출에 대한 시스템 호출 번호는 include/lib/syscall-nr.h에 정의되어 있습니다.
void halt (void);
power_off()를 호출하여 Pintos를 종료합니다. (src/include/threads/init.h에 선언됨) 교착 상태 등에 대한 일부 정보를 잃을 수 있으므로 거의 사용해서는 안 됩니다.void exit (int status);
status를 반환합니다. 프로세스의 부모가 이를 기다리면 (아래 참조) 이 상태가 반환됩니다. 일반적으로 status 0은 성공을, 0이 아닌 값은 오류를 나타냅니다.