vm_claim_page() - sihyun10/pintos-lab-vm GitHub Wiki

vm_claim_page() κ΅¬ν˜„

μ£Όμ–΄μ§„ 가상 μ£Όμ†Œ va에 ν•΄λ‹Ήν•˜λŠ” νŽ˜μ΄μ§€λ₯Ό claimν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.
λ¨Όμ € va에 ν•΄λ‹Ήν•˜λŠ” pageλ₯Ό μ°Ύμ•„λ‚΄κ³ , vm_do_claim_pageλ₯Ό ν˜ΈμΆœν•˜μ—¬ ν• λ‹Ήν•œλ‹€.

/* Claim the page that allocate on VA. */
// VA둜 ν• λ‹Ήλœ νŽ˜μ΄μ§€λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.
bool vm_claim_page(void *va UNUSED)
{
  struct page *page = NULL;
  /* TODO: Fill this function */
  // κΈ°λŠ₯을 κ΅¬ν˜„ν•˜μ„Έμš”.

  return vm_do_claim_page(page);
}
  • ν•΄λ‹Ή 가상 μ£Όμ†Œ va에 λŒ€μ‘ν•˜λŠ” struct page *λ₯Ό 보쑰 νŽ˜μ΄μ§€ ν…Œμ΄λΈ”(SPT)μ—μ„œ κ°€μ Έμ˜¨λ‹€.
  • λ§Œμ•½ ν•΄λ‹Ή pageκ°€ μ—†λ‹€λ©΄ μ‹€νŒ¨λ₯Ό λ°˜ν™˜ν•˜κ³ ,
  • μžˆλ‹€λ©΄ vm_do_claim_page()λ₯Ό ν˜ΈμΆœν•˜μ—¬
    • 물리 ν”„λ ˆμž„ ν• λ‹Ή
    • VA->PA λ§€ν•‘
    • swap in

spt_find_page() ν•¨μˆ˜ ν™œμš©

// sptμ—μ„œ VAλ₯Ό μ°Ύμ•„ νŽ˜μ΄μ§€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ NULL을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
struct page *
spt_find_page(struct supplemental_page_table *spt UNUSED, void *va UNUSED)
{
  struct page dummy_page;
  dummy_page.va = pg_round_down(va);

  struct hash_elem *e = hash_find(&spt->spt_hash, &dummy_page.hash_elem);
  if (e == NULL)
    return NULL;

  return hash_entry(e, struct page, hash_elem);
}

ν˜„μž¬ μŠ€λ ˆλ“œμ˜ SPTμ—μ„œ ν•΄λ‹Ή 가상 μ£Όμ†Œμ˜ νŽ˜μ΄μ§€λ₯Ό μ°Ύμ•„μ£ΌλŠ” ν•¨μˆ˜μ΄λ‹€.

이 ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜μ—¬ μ•„λž˜μ™€ 같이 μž‘μ„±ν•œλ‹€.

// vm_claim_page() ν•¨μˆ˜ μ½”λ“œ κ΅¬ν˜„
// ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‚¬μš©μž ν”„λ‘œμ„ΈμŠ€κ°€ μš”μ²­ν•œ va μ£Όμ†Œμ— ν•΄λ‹Ήν•˜λŠ” 가상 νŽ˜μ΄μ§€κ°€ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” 둜직
page = spt_find_page(&thread_current()->spt, va);

thread_current()
: ν˜„μž¬ μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œλ₯Ό κ°€μ Έμ˜¨λ‹€.
각 μŠ€λ ˆλ“œλŠ” μžμ‹ λ§Œμ˜ 보쑰 νŽ˜μ΄μ§€ ν…Œμ΄λΈ”(SPT)을 κ°€μ§€κ³  μžˆλ‹€.

thread_current()->spt
: ν˜„μž¬ μŠ€λ ˆλ“œκ°€ μ†Œμœ ν•œ SPTλ₯Ό 가리킨닀.
이 ν…Œμ΄λΈ”μ€ ν•΄λ‹Ή μŠ€λ ˆλ“œκ°€ μ‚¬μš©ν•˜λŠ” λͺ¨λ“  가상 νŽ˜μ΄μ§€ 정보λ₯Ό λ‹΄κ³  μžˆκΈ°μ—
μ–΄λ–€ 가상 μ£Όμ†Œ vaκ°€ λ“±λ‘λ˜μ–΄ μžˆλŠ”μ§€λ₯Ό 확인할 수 μžˆλ‹€.


κ΅¬ν˜„ μ½”λ“œ - vm/vm.c

/* Claim the page that allocate on VA. */
// VA둜 ν• λ‹Ήλœ νŽ˜μ΄μ§€λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.
bool vm_claim_page(void *va UNUSED)
{
  struct page *page = NULL;

  page = spt_find_page(&thread_current()->spt, va);

  if (page == NULL)
    return false;

  return vm_do_claim_page(page);
}