미소를뿌리는감자의 코딩
[Pintos_project3 (2)] spt_find_page 본문
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를 적어보았다.
- va를 기준으로 해시 값을 찾고
- 해시 값에 해당되는 hash_elem을 supplemental page table에서 찾고
- 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;
}
그림으로 설명을 하는 것이 좋을 것 같아서, 수기로 작성해 보았다.
우선 빈 페이지를 할당한다.
- 주어진 virtual address가 포함되어 있는 페이지의 시작 주소를 round down을 통해 찾고, 이를 page -> va에 할당한다.
- 이른바 거짓 page에서 찾을 수 있는 hash_elem (해시 값)을 통해서, 실제, hash table에 같이 해시 값을 가지고 있는 페이지를 찾는다.
이 페이지는, 실제 virtual space와 mapping되는 페이지로 '참 page'라고 할 수 있다.
이후, 얻은 hash_elem으로 hash_entry를 통해서 해시값에 해당하는 페이지를 가리키는 포인터를 반환해 준다.
3. 결과
아직은 기존과 동일하게 123 of 141 tests failed를 나타낸다.
728x90
'정글 일지' 카테고리의 다른 글
[Pintos_project3 (4)] vm_alloc_page_with_initializer (0) | 2024.11.30 |
---|---|
[Pintos_project3 (3)] spt_insert_page (0) | 2024.11.29 |
[Pintos_project3 (1)] supplemental_page_table_init (0) | 2024.11.28 |
sftp로 ec2 서버 열기 - ubuntu 18.04 image (0) | 2024.11.12 |
[0주차] 크래프톤 정글 7기 회고 (2) | 2024.09.06 |