vm_do_claim_page() - sihyun10/pintos-lab-vm GitHub Wiki
vm_do_claim_page() ๊ตฌํํ๊ธฐ
๋
ผ๋ฆฌ์ ํ์ด์ง(Page
)์ ์ค์ ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ(Frame
)๋ฅผ ์ฐ๊ฒฐํ๊ณ ,
MMU(Page Table)์ ๊ฐ์ ์ฃผ์(VA
)์ ๋ฌผ๋ฆฌ ์ฃผ์(PA
)๋ฅผ ๋งคํํ๋ ํจ์์ด๋ค.
์ฐ๋ฆฌ๊ฐ ํด์ผํ ๊ฒ์ ๊ฐ์ ์ฃผ์์ ๋ฌผ๋ฆฌ ์ฃผ์๋ฅผ ๋งคํํ ์ ๋ณด๋ฅผ ํ์ด์ง ํ ์ด๋ธ์ ์ถ๊ฐํด์ผํ๋ค!
/* Claim the PAGE and set up the mmu. */
// PAGE๋ฅผ ์ ์ธํ๊ณ mmu๋ฅผ ์ค์ ํ์ธ์.
static bool
vm_do_claim_page(struct page *page)
{
struct frame *frame = vm_get_frame();
/* Set links */
frame->page = page;
page->frame = frame;
/* TODO: Insert page table entry to map page's VA to frame's PA. */
// ํ์ด์ง์ VA๋ฅผ ํ๋ ์์ PA์ ๋งคํํ๊ธฐ ์ํด ํ์ด์ง ํ
์ด๋ธ ํญ๋ชฉ์ ์ฝ์
ํฉ๋๋ค.
return swap_in(page, frame->kva);
}
๊ตฌํํ ์ฝ๋
static bool
vm_do_claim_page(struct page *page)
{
struct frame *frame = vm_get_frame();
/* Set links */
frame->page = page;
page->frame = frame;
/* TODO: Insert page table entry to map page's VA to frame's PA. */
// ํ์ด์ง์ VA๋ฅผ ํ๋ ์์ PA์ ๋งคํํ๊ธฐ ์ํด ํ์ด์ง ํ
์ด๋ธ ํญ๋ชฉ์ ์ฝ์
ํฉ๋๋ค.
struct thread *curr = thread_current();
bool writable = page->writable;
bool success = pml4_set_page(curr->pml4, page->va, frame->kva, writable);
if (!success)
return false;
return swap_in(page, frame->kva);
}
- ์๋ก์ด ๋ฌผ๋ฆฌ ํ๋ ์์ ํ ๋น๋ฐ๋๋ค. (
struct frame *frame = vm_get_frame();
) - ํ๋ ์๊ณผ ํ์ด์ง ์ฌ์ด์ ์ฐ๊ฒฐ ๊ด๊ณ ์ค์ (
frame->page = page; page->frame = frame;
) - ํ์ฌ ์ค๋ ๋์ ํ์ด์ง ํ
์ด๋ธ(
pml4
)์VA
->PA
๋งคํ์ ์ถ๊ฐ
3-1. ๋งคํ ์คํจ ์false
๋ฐํ - ๋์คํฌ์์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ถ๋ฌ์ค๋ ์์
(
swap in
)