미소를뿌리는감자의 코딩

[Pintos_project3 (2)] spt_find_page 본문

정글 일지

[Pintos_project3 (2)] spt_find_page

미뿌감 2024. 11. 29. 15:04
728x90

1. 개요

spt_find_page를 구현하려고 한다.

 

이 함수의 목적은 supplemental page table에서 va(virtual address)에 해당하는 페이지를 찾는 것이다.

// vm/vm.c

/* Find VA from spt and return page. On error, return NULL. */
struct page *
spt_find_page (struct supplemental_page_table *spt UNUSED, void *va UNUSED) {
	/* [Pseudo]
	va에 해당하는 값이 spt에 있는 지 확인.
	  (true) -> 해당 페이지 반환
	  (false) -> NULL 반환

	  uint64_t hash_va = hash_bytes(va, sizeof(va)) -> 해시 값을 얻고,
	  spt -> hash -> buckets ... -> 여기서 해시값에 해당하는 위치 찾고 (이걸 어떻게 할지 조금 애매모호...)
      있으면? 해당 hash_elem을 &로, 참조해서 해당 페이지 반환.
	  없으면... NULL 반환
	 */
}

코드를 참고하기에 앞서, pseudo code를 적어보았다.

  1. va를 기준으로 해시 값을 찾고
  2. 해시 값에 해당되는 hash_elem을 supplemental page table에서 찾고
  3. hash_elem을 바탕으로 외부 구조체인 Page를 찾아서 반환

한다고 생각하였다.

 

2. 본문

실제 코드의 전반적인 흐름은 예상한 pseudo code와 유사했지만, 접근 방식이 조금 달랐다.

// vm/vm.c

/* Find VA from spt and return page. On error, return NULL. */
struct page *
spt_find_page (struct supplemental_page_table *spt UNUSED, void *va UNUSED) {

	struct page *page = (struct page *)malloc(sizeof(struct page)); // 가상 주소에 대응하는 해시 값 도출을 위해 새로운 페이지 할당
	page->va = pg_round_down(va); // 가상 주소의 시작 주소를 페이지의 va에 복제
	struct hash_elem *e = hash_find(&spt->spt_hash, &page->hash_elem); // spt hash 테이블에서 hash_elem과 같은 hash를 갖는 페이지를 찾아서 return
	free(page); // 복제한 페이지 삭제

	return e != NULL ? hash_entry(e, struct page, hash_elem) : NULL;
}

그림으로 설명을 하는 것이 좋을 것 같아서, 수기로 작성해 보았다.

 

우선 빈 페이지를 할당한다.

  1. 주어진 virtual address가 포함되어 있는 페이지의 시작 주소를 round down을 통해 찾고, 이를 page -> va에 할당한다.
  2. 이른바 거짓 page에서 찾을 수 있는 hash_elem (해시 값)을 통해서, 실제, hash table에 같이 해시 값을 가지고 있는 페이지를 찾는다.
    이 페이지는, 실제 virtual space와 mapping되는 페이지로 '참 page'라고 할 수 있다.

이후, 얻은 hash_elem으로 hash_entry를 통해서 해시값에 해당하는 페이지를 가리키는 포인터를 반환해 준다.

 

3. 결과

아직은 기존과 동일하게 123 of 141 tests failed를 나타낸다.

728x90