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()
์ ์งํํ๋ค.