[TIL] [WEEK9-10] Pintos Project(2) System Call Handler

woo__j·2024년 6월 2일
0

Pintos Project

목록 보기
6/14

📍세 번째 과제, System Call

시스템 콜?
: 사용자 모드 프로그램이 커널 기능을 사용할 수 있도록 하는 인터페이스로, 커널모드에서 실행되며 처리 후 사용자 모드로 복귀된다.

현재 Pintos에는 시스템 콜 핸들러가 구현되어 있지 않아서 시스템 콜을 호출할 수 없으며, 응용 프로그램이 실행되지 않는다.

각각의 시스템 콜 및 시스템 콜 핸들러를 구현해 핸들러로 시스템 콜을 호출할 수 있도록 하는 게 이번 과제 목표다.

⚙️ Modify

  • void syscall_handler(struct intr_frame *f UNUSED)
    : 유저 스택에 저장된 syscall number(%rax에 해당)를 통해 해당 시스템 콜 함수를 호출하는 함수로, 각 시스템 콜 번호는 syscall-nr.h에 정의되어 있다.
    인자로 전달하는 게 포인터라면, 해당 포인터의 주소 유효성 검사가 필요하다. 두 번째 과제로 작성했던 check_address를 통해 포인터가 가리키는 주소가 유효한 지 확인하고, 잘못된 접근이라면 프로세스를 종료하도록 구현하자.
    또한, 시스템 콜 함수가 반환하는 값이 있다면 인터럽트 프레임의 %rax에 저장한다.

시스템 콜 핸들러를 구현한 후, 각각의 시스템 콜을 구현하는 것이 핵심이다.
우리가 구현해야 할 시스템 콜은 크게 두 가지 종류로 나뉜다.

👉🏻 파일 관련 System Call

1) create() : 새로운 파일 생성
2) remove(): 파일 삭제 (파일의 여/닫 여부에 관계없이 삭제)
3) open(): 파일 열기
4) filesize(): 열려있는 파일 크기 반환
5) read(): 열려있는 파일로부터 size 바이트를 읽어 반환
6) write(): 파일에 size 바이트를 적고 적힌 바이트 수 반환
7) seek(): 읽거나 쓸 다음 바이트의 위치 변경
8) tell(): 읽히거나 써질 다음 바이트의 위치 반환 (시작지점으로부터)
9) close(): 파일 닫기

👉🏻 프로세스 관련 System Call

1) halt(): power_off()를 호출해서 Pintos를 종료하는 시스템 콜
2) exit(): 현재 동작중인 유저 프로그램을 종료하는 시스템 콜로, 종료 시 프로세스의 상태 출력
3) exec(): 현재 프로세스를 인자에서 주어진 이름을 갖는 실행 파일(프로세스)로 변경
4) wait(): 자식 프로세스를 기다리고 자식의 종료 상태(exit status)를 가져오는 시스템 콜로, 자식 프로세스가 살아있다면, 종료될 때까지 기다림
5) fork(): 현재 프로세스의 복제본인 새 프로세스를 생성

[주의]
Pintos에는 syscall.c 파일이 두 개일 것이다.
lib/user/syscall.c는 user 모드에서 호출하는 시스템 콜이다.
우린 kernel 모드에서 시스템 콜을 받아 일을 수행하는 함수를 구현해야 한다.
고로 우리가 수정해야 하는 파일은 userprog/syscall.c다.

systemcall_handler 또한 userprog/syscall.c에 있다. 핸들러를 먼저 구현한 후, 세부적으로 각 시스템 콜들을 구현하자.

0개의 댓글

관련 채용 정보