🚨 시스템 콜 호출 시 시스템 콜 핸들러가 호출되는 과정 (이동)

check_addr()

시스템 콜을 통해 들어온 포인터로부터 데이터를 읽어야 하는 경우에, 이 주소가 유효하지 않은 주소라면 유저 프로세스를 종료시킬 수 있어야 한다. 따라서 이런 역할을 하는 함수가 필요하다.

🔎  유효하지 않은 주소란 ?

  1. 커널 영역의 주소 → 커널 영역이면 종료
  2. 자신이 할당받지 않은 메모리 영역의 주소 → 할당받지 않은 영역이면 종료

다행히 핀토스에서는 위 두가지를 체크해주는 함수를 이미 제공하고 있다. 따라서 아래와 같이 정의할 수 있다.

void check_addr(void * addr) {
	struct thread *t = thread_current();
	if(is_kernel_vaddr(addr) || pml4_get_page(t->pml4, addr)== NULL ){
	   syscall_abnormal_exit(-1); 
	}
}

🗒️  syscall_abnormal_exit() 함수


시스템 콜

halt

fork

wait

exit

create

remove

open