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);
}