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

vm_get_frame() ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ

์‚ฌ์šฉ์ž ์˜์—ญ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ(frame)๋ฅผ ํ•˜๋‚˜ ํ• ๋‹นํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
๊ทธ๋ƒฅ ํŽ˜์ด์ง€๋ฅผ ํ• ๋‹น๋งŒ ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, frame์ด๋ผ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ฒด์— wrappingํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ดํ›„ ํŽ˜์ด์ง€๊ฐ€ ์ด ํ”„๋ ˆ์ž„์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ด ๋‘˜์€ ๋งคํ•‘ ๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•œ๋‹ค.

Gitbook ํ•จ์ˆ˜ ๊ตฌํ˜„ ์š”๊ตฌ์‚ฌํ•ญ

static struct frame *vm_get_frame (void);
  • ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€ ํ• ๋‹น
    • palloc_get_page(PAL_USER)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋„ ๊ฐ€์ƒ ์ฃผ์†Œ(kva)๋ฅผ ์–ป์–ด์•ผ ํ•œ๋‹ค
  • frame ๊ตฌ์กฐ์ฒด ๋™์  ์ƒ์„ฑ
    • malloc() ๋“ฑ์„ ํ†ตํ•ด struct frame์„ ํ• ๋‹นํ•˜๊ณ  kva, page ํ•„๋“œ ์ดˆ๊ธฐํ™”
  • page๋Š” ์•„์ง ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ NULL๋กœ ์ดˆ๊ธฐํ™”
  • ํ• ๋‹น์— ์‹คํŒจํ•  ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด ์ง€๊ธˆ์€ swap out ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
    • ๊ทธ ๋Œ€์‹ , PANIC ("todo")์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด์„œ ์ข…๋ฃŒํ•˜๋„๋ก ํ‘œ์‹œ

๊ตฌํ˜„ ์ฝ”๋“œ - vm/vm.c

static struct frame *
vm_get_frame(void)
{
  void *kva = palloc_get_page(PAL_USER);
  if (kva == NULL)
  {
    PANIC("todo");
  }

  struct frame *frame = malloc(sizeof(struct frame));
  if (frame == NULL)
    PANIC("failed");

  frame->kva = kva;
  frame->page = NULL; // ์•„์ง ์–ด๋–ค ํŽ˜์ด์ง€์™€๋„ ๋งคํ•‘๋˜์ง€ ์•Š์•˜์Œ

  ASSERT(frame != NULL);
  ASSERT(frame->page == NULL);
  return frame;
}

์ฝ”๋“œ ์„ค๋ช…

| ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€ ํ• ๋‹น

void *kva = palloc_get_page(PAL_USER);

์ปค๋„์ด ์ œ๊ณตํ•˜๋Š” palloc_get_page() ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ์ž ์˜์—ญ(PAL_USER)์—์„œ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€ ํ•˜๋‚˜๋ฅผ ํ• ๋‹น ๋ฐ›๋Š”๋‹ค.
์ด ๋ฐ˜ํ™˜๊ฐ’์€ ์ปค๋„ ๊ฐ€์ƒ ์ฃผ์†Œ(kva)์ด๋‹ค.

| ํŽ˜์ด์ง€ ํ• ๋‹น ์‹คํŒจ ์‹œ, PANIC ์ฒ˜๋ฆฌ

if (kva == NULL)
{
  PANIC("todo");
}

๋งŒ์•ฝ ํŽ˜์ด์ง€ ํ• ๋‹น์— ์‹คํŒจํ•˜๋ฉด, ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค.
๋”ฐ๋ผ์„œ PANIC("todo")๋กœ ์ค‘๋‹จํ•œ๋‹ค.

| frame ๊ตฌ์กฐ์ฒด ๋™์  ์ƒ์„ฑ

struct frame *frame = malloc(sizeof(struct frame));

์ƒˆ๋กœ ํ• ๋‹นํ•œ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด frame ๊ตฌ์กฐ์ฒด๋ฅผ ํž™์— ๋™์  ํ• ๋‹นํ•œ๋‹ค.
struct frame์€ kva, page ๋“ฑ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.

if (frame == NULL)
  PANIC("failed");

๋งŒ์•ฝ malloc()์ด ์‹คํŒจํ•˜๋ฉด ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•œ ์ƒํƒœ์ด๋ฏ€๋กœ, PANIC ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

frame->kva = kva;
frame->page = NULL;

์œ„์—์„œ ํ• ๋‹นํ•œ ์‹ค์ œ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€ ์ฃผ์†Œ(kva)๋ฅผ frame ๊ตฌ์กฐ์ฒด์— ์ €์žฅํ•ด์ค€๋‹ค.
์•„์ง ์ด ํ”„๋ ˆ์ž„์— ์—ฐ๊ฒฐ๋œ page๋Š” ์—†์œผ๋ฏ€๋กœ NULL๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

return frame;

์ƒˆ๋กœ ์ƒ์„ฑํ•œ frame์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.


์™œ palloc_get_page()๋ฅผ ๋จผ์ € ํ˜ธ์ถœํ•˜๊ณ , ๊ทธ ๋‹ค์Œ์— malloc()์„ ํ˜ธ์ถœํ• ๊นŒ?

palloc_get_page()๋Š” ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ํ•œ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•œ๋‹ค.
์ด ๊ฒฝ์šฐ ํ•œ์ •๋œ user pool์—์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๊ธฐ์— ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋‹ค.

malloc()์€ ์ปค๋„ ํž™ ์˜์—ญ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์ฒด ๊ณต๊ฐ„์„ ํ• ๋‹นํ•œ๋‹ค.
์˜๋ฏธ์—†์ด ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

struct frame *frame = malloc(sizeof(struct frame));
void *kva = palloc_get_page(PAL_USER);

malloc() ํ• ๋‹น ์„ฑ๊ณต โž” palloc_get_page()๊ฐ€ ์‹คํŒจํ•ด์„œ NULL ๋ฐ˜ํ™˜ํ•˜๋ฉด
frame ํฌ์ธํ„ฐ๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ๊ณ  ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— palloc_get_page()๋ถ€ํ„ฐ ๊ฒ€์‚ฌํ•˜๊ณ , malloc()์„ ์ง„ํ–‰ํ•œ๋‹ค.