
진짜 길잃음

Pml4을 보조하는 용도로 SPT를 사용한다...라는걸 알 수 있었다.
저번 글에서 SPT 초기화는 완료했다.
물론 TC가 없기에 검증은 못한다
이후 SPT 구현에 필요한 spt_find_page 와 spt_insert_page
주어진 보조 테이블(spt)에서 특정 가상 주소(VA) 에 해당하는 struct page 정보를 탐색
/* Find VA from spt and return page. On error, return NULL. */
/*
주어진 spt에서 주어진 va에 해당하는 struct page 정보를 탐색
*/
struct page *
spt_find_page(struct supplemental_page_table *spt UNUSED, void *va UNUSED)
{
struct page *page; // 키 비교용 임시 페이지
struct hash_elem *elem;
if (spt == NULL || va == NULL)
{
return NULL;
}
/* TODO: Fill this function. */
// 1. va를 key로 사용
page->va = va;
// 2. hash_find 함수 호출, spt에서 해당 키 가진 struct hash_elem 찾기
elem = hash_find(&spt->pages, &page->hash_elem);
// 3. 찾은 hash_elem => hash_entry 활용해서 페이지를 리턴
// 4. 못찾으면 NULL
return elem != NULL ? hash_entry(elem, struct page, hash_elem) : NULL;
}
spt에 전달된 struct page 정보를 삽입
/* Insert PAGE into spt with validation. */
bool spt_insert_page(struct supplemental_page_table *spt UNUSED,
struct page *page UNUSED)
{
int succ = false;
/* TODO: Fill this function. */
// 유효성 검사 어떻게? => find를 통해서 주소에 대응되는것 체크
// 없다면 집어 넣으면 되고 있다면 false 유지
// NULL 을 반환해야 들어갈 수 있기에 true가 뒤로 가야함
return hash_insert(&spt, &page->hash_elem) ? false : true;
}
spt_insert_page 수정 전 코드 if (hash_find(&spt->pages, &page->hash_elem) == NULL)
{
hash_insert(&spt, &page->hash_elem); // spt에 페이지 삽입
succ = true;
}
return succ;
처음에 find로 없어야 삽입할 수 있다고 해서 저렇게 했는데
팀원이 애초에 insert가 유효성검사를 하면서 삽입한다고 해서
간결하게 수정하였다.
도대체 뭐 부터 해야 해요...?