210221 개발일지(76일차) - 운영체제(OS) 프로젝트 #3-2 Setup Stack 및 Stack Growth

고재개발·2021년 2월 28일
0

OS Project

목록 보기
19/28

Setup-Stack

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에서 큰 변화는 없다.

Stack-Growth

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 시켜주는 것과 같이 짜면 된다.

profile
고재개발

0개의 댓글