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);
}
  1. ์ƒˆ๋กœ์šด ๋ฌผ๋ฆฌ ํ”„๋ ˆ์ž„์„ ํ• ๋‹น๋ฐ›๋Š”๋‹ค. (struct frame *frame = vm_get_frame();)
  2. ํ”„๋ ˆ์ž„๊ณผ ํŽ˜์ด์ง€ ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„ ์„ค์ • (frame->page = page; page->frame = frame;)
  3. ํ˜„์žฌ ์Šค๋ ˆ๋“œ์˜ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”(pml4)์— VA->PA ๋งคํ•‘์„ ์ถ”๊ฐ€
    3-1. ๋งคํ•‘ ์‹คํŒจ ์‹œ false ๋ฐ˜ํ™˜
  4. ๋””์Šคํฌ์—์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ž‘์—… (swap in)