spt_insert_page() - sihyun10/pintos-lab-vm GitHub Wiki
π οΈ μΈλ²μ§Έ λͺ©ν - spt_insert_page()
ν¨μ ꡬν
μ΄ ν¨μλ μ£Όμ΄μ§ supplemental_page_table
μ page
λ₯Ό μ½μ
νλ ν¨μμ΄λ€.
μ΄λ 쑰건μ, ν΄λΉ page
μ κ°μμ£Όμ(va
)κ° μ΄λ―Έ μ‘΄μ¬νλ©΄ μ½μ
νμ§ μκ³ , false
λ₯Ό λ°ννλ€.
μ‘΄μ¬νμ§ μμΌλ©΄ μ½μ
νκ³ , true
λ₯Ό λ°ννλ€.
- κ°μ μ£Όμ μ ν¨μ± κ²μ¬ (
is_user_vaddr()
) page
μva
λ₯Ό ν€λ‘ νμ¬ μ΄λ―Έ μ‘΄μ¬νλ νμ΄μ§κ° μλμ§ κ²μ¬ (spt_find_page()
)- μλ€λ©΄
hash_insert()
λ‘ μ½μ μλ - μ½μ μ±κ³΅ μ true λ°ν, μ€ν¨ μ false λ°ν
ꡬν μ½λ
// κ²μ¦μ ν΅ν΄ sptμ PAGEλ₯Ό μ½μ
ν©λλ€.
bool spt_insert_page(struct supplemental_page_table *spt UNUSED,
struct page *page UNUSED)
{
int succ = false; // μ½μ
μ±κ³΅ μ¬λΆλ₯Ό μ μ₯ν λ³μ
if (is_user_vaddr(page->va))
{
if (spt_find_page(spt, page->va) == NULL)
{
hash_insert(&spt->hash_table, &page->hash_elem);
succ = true;
}
}
return succ;
}
ꡬν μ½λ μ€λͺ
bool spt_insert_page(struct supplemental_page_table *spt UNUSED,
struct page *page UNUSED)
spt
: μ½μ ν λμ -supplemental_page_table
page
: μ½μ νλ €λ νμ΄μ§ κ°μ²΄
| κ°μ μ£Όμ μ ν¨μ± κ²μ¬
if (is_user_vaddr(page->va))
μ½μ
νλ €λ νμ΄μ§μ μ£Όμκ° μ¬μ©μ κ³΅κ° μ£ΌμμΈμ§ νμΈνλ€.
컀λ μ£Όμ 곡κ°μ μλͺ» λ£λ κ²½μ°λ₯Ό λ°©μ§νλ€.
μλμ is_user_vaddr()
λ₯Ό νμ©νμ¬ μ¬μ©μ κ³΅κ° μ£ΌμμΈμ§ κ²μ¬νλ€.
// vaκ° μ μ μ£ΌμμΈκ°?
#define is_user_vaddr(vaddr) (!is_kernel_vaddr((vaddr)))
| page
μ va
λ₯Ό ν€λ‘ νμ¬ μ΄λ―Έ μ‘΄μ¬νλ νμ΄μ§κ° μλμ§ κ²μ¬
if (spt_find_page(spt, page->va) == NULL)
μ°λ¦¬κ° μ΄μ μ ꡬνν΄λ spt_find_page()
λ₯Ό νμνμ¬ νμ¬ spt
μ μ΄λ―Έ λμΌν va
λ₯Ό κ°μ§ νμ΄μ§κ° μ‘΄μ¬νλμ§ νμΈνλ€.
λ§μ½, μλ€λ©΄ μ½μ
κ°λ₯νλ€!
| μλ€λ©΄ hash_insert()λ‘ μ½μ μλ
struct hash_elem *
hash_insert (struct hash *h, struct hash_elem *new) {
struct list *bucket = find_bucket (h, new);
struct hash_elem *old = find_elem (h, bucket, new);
if (old == NULL)
insert_elem (h, bucket, new);
rehash (h);
return old;
}
μ hash_insert()
ν¨μλ₯Ό νμ©νμ¬ νμ΄μ§μ ν΄μ μμλ₯Ό ν΄μ ν
μ΄λΈμ μ½μ
νλ€.
hash_insert(&spt->hash_table, &page->hash_elem);
succ = true;
μ€λ³΅ ν€κ° μλ κ²½μ°μλ§ μ±κ³΅νλ€.
λ°λΌμ μ½μ
μ μ±κ³΅νκΈ°μ succ
λ₯Ό trueλ‘ λ°κΏμ€λ€.