Setup-Stack은 말 그대로, 초기에 스택영역을 초기화해주는 과정이다.
기존에 구현돼있는 Setup-Stack은 아래와 같은데,
/* Create a minimal stack by mapping a zeroed page at the USER_STACK */
static bool
setup_stack(struct intr_frame *if_)
{
uint8_t *kpage;
bool success = false;
kpage = palloc_get_page(PAL_USER | PAL_ZERO);
if (kpage != NULL)
{
success = install_page(((uint8_t *)USER_STACK) - PGSIZE, kpage, true);
if (success)
if_->rsp = USER_STACK;
else
palloc_free_page(kpage);
}
return success;
}
즉, kapge에 1페이지를 할당 받아서 page table mapping시켜주는 것이다.
(실패하면, 다시 palloc_free를 해주고)
project3에서 큰 변화는 없다.
project3에서 구현해야하는 것 중 하나이다.
여태까지는 Stack을 Setup해주면 1페이지 만큼(여기서는 4096kb)만 셋팅이 돼있었고, 추가로 스택영역이 성장하지 못했다.
이제 스택영역이 더 필요하다는 신호가 오면, page_fault를 처리하는 과정에서 스택을 늘려줘야 한다.
이 조건을 잘 판단해주어야 한다. kaist 깃북에서 스택 성장 제한은 1mb로 하라고 되어 있어서 아래와 같이 코드를 짰다.
if (addr < USER_STACK && addr > USER_STACK - (1 << 20))
{
if (rsp == addr + 8 || addr > rsp)
{
vm_stack_growth(pg_round_down(addr));
return true;
}
return false;
}
vm_stack_growth 함수는 새로운 페이지를 할당받아서 page mapping 시켜주는 것과 같이 짜면 된다.