PintOS 3주차 - day 8

솔다·2023년 1월 9일
0

다시 또 오랜만에 쓰는 TIL이다.. 무한loop에 빠져서 제대로 된 진도가 나가지 않는게 매우 힘들다.

아래 코드가 project 3 에서 실행해야 하는 함수 중에 가장 핵심인 vm_try_handle_fault 함수이다. 이 함수를 통해서, 기존의 pml4 기반의 페이지 탐색에 실패했을 때, 새로운 보충 페이지테이블인 spt(supplemental_page_table)에서 검색한다.

그리고 만일 spt에서도 페이지를 찾을 수 없으면, vm_do_claim_page 를 통해서 새롭게 page를 요청하고, pml4를 찾아주는 순서로 코드가 실행되어야 했다.

bool vm_try_handle_fault (struct intr_frame *f UNUSED, void *addr UNUSED,
		bool user UNUSED, bool write UNUSED, bool not_present UNUSED) {
	
	struct supplemental_page_table *spt UNUSED = &thread_current()->spt;
	//bool succ = false;
	struct page *page = NULL;
	/* TODO: Your code goes here */

	/* TODO: Validate the fault */
	if (is_kernel_vaddr(addr))
		return false;
	// if (write)
	// 	return false;
	
	page = spt_find_page(spt, addr);
	if (page == NULL)
		return false;
	if (!vm_do_claim_page (page))
		return false;

	return true;
}

하지만 커널 패닉이 뜬다. 분명 is_kernel_vaddr 를 통해서 주소가 제대로 커널 영역에 있는걸 확인하고 vm_do_claim으로 넘어가는데, 계속해서 새로운 페이지만 생성하고 제대로 참조가 되지 않았다.

그렇게 무한루프에 빠졌다.

오늘 이걸 디버깅 하느라 거의 하루를 날렸는데도 여전히 난항중에 있다.

내일은 다시 gitbook을 정독하면서 함수들을 하나하나 다시 확인해볼 예정이다. 주어진 함수를 써서 pml4에 새롭게 정보를 업데이트 해주는 과정에서 문제가 발생한건지, interrupt_frame을 인자로 받았던 함수에서 레지스터의 값을 제대로 활용하지 않아서 문제가 발생한 것인지. 아직은 잘 모르겠다. 의심가는 부분이 몇군데 있는데, 일단 내일아침부터는 처음부터 다시 점검하고, 의심가는 부분 위주로 디버깅을 진행해봐야겠다.

0개의 댓글