운영체제(구현) - 핀토스-2(시스템 콜 핸들러)

연도·2024년 6월 5일
0
post-thumbnail

구현 전 알아야 할 것

커널 vs 유저 영역

  • 시스템 콜은 운영체제가 제공하는 서비스에 대한 프로그래밍 인터페이스
  • 사용자 모드 프로그램이 커널 기능을 사용할 수 있게한다.
  • 시스템 콜은 커널 모드에서 실행되고, 처리 후 사용자 모드로 복귀한다.

시스템 콜 호출 과정(리눅스)

구현 예시

구현해야 할 것

System Call함수들

halt

시스템 종료

구현 전 힌트

  • power_off()를 사용하여 pintos 종료
void
halt(void)
{
	power_off(); // 시스템 종료
}

exit

현재 프로세스 종료

구현 전 힌트

  • 실행중인 스레드 구조체 가져옴
  • 프로레스 종료 메시지 출력. 출력 양식 : “프로레스이름: exit(종료상태)”
  • 스레드 종료
void
exit(int status)
{
	struct thread *cur = thread_current(); // 현재 실행중인 스레드 가져오기
	cur->exit_status = status; // 프로세스 디스크립터에 exit status 저장.
	
	printf("%s: exit(%d)\n", cur->name, status);
	thread_exit();
}

create

파일 생성

구현 전 힌트

  • 파일 이름과 크기에 해당하는 파일 생성
  • 파일 생성 성공 시 true 반환, 실패 시 false 반환
bool
create(const char *file, unsigned initial_size)
{
	return filesys_create(file, initial_size);
}

remove

파일 제거

구현 전 힌트

  • 파일 이름에 해당하는 파일 제거
  • 파일 제거 성공 시 true 반환, 실패 시 false 반환
bool
remove(const char *file)
{
	return filesys_remove(file);
}

그 외 함수들

check_address()

주소 유효성 검사 - 포인터가 가리키는 주소가 사용자 영역 인지 확인.

구현 전 힌트

  1. 포인터가 가리키는 주소가 유저 영역의 주소인지 확인
  2. 잘못된 접근일 경우 프로세스 종료
void
check_address(void *addr)
{
	if(addr == NULL ||  !is_user_vaddr(addr))
	{
		exit(-1);
	}
}

0개의 댓글