[PintOS] Project3: Stack Growth

김상호·2022년 6월 28일
0

Development Log

목록 보기
39/45

Stack Growth

목표

이제까지의 pintos의 stack 단일 페이지 stack으로 되어있었다.

이러한 스택을 적절한 page fault에서 stack을 추가로 할당하는 작업을 구현하는 것이 목표이다.

Q. 적절한 stack page fault 범위 잡는 범위를 rsp에서 4KB를 설정하였는데 왜 4KB인지 잘 모르겠음

  • 4KB가 아닌가하는 생각도 드는데 그렇다면 잘 못 코드를 작성하고 모든 케이스를 통과 하는 것인가 하는 생각이듬
  • rsp에서 - 8byte

vm_try_handle_fault 수정

  • addr의 범위가 f→rsp - PGSIZE 보다 크고 addr 가 f→rsp보다 작거나 같다.
  • 위의 범위가 stack growth에 대한 페이지 폴트 일때의 범위이다.
  • 아래는 추가 코드이다.
if (page == NULL)
  {
    struct thread *current_thread = thread_current();
    void *stack_bottom = pg_round_down(thread_current()->user_rsp);
    if (write && (addr >= pg_round_down(thread_current()->user_rsp - PGSIZE)) && (addr < USER_STACK))
    {
      vm_stack_growth(addr);
      return true;
    }
    return false;
  }

vm_stack_growth

  • stack_bottom을 4KB(PGSIZE)만큼 이동한다.
  • VM_ANON으로 page를 할당하고 vm_claim_page를 호출하여 frame과 맵핑시킨다.
  • thread_current의 stack_bottom을 갱신한다.
static void
vm_stack_growth(void *addr)
{
  void *pg_addr = pg_round_down(addr);
  ASSERT((uintptr_t)USER_STACK - (uintptr_t)pg_addr <= (1 << 20));

  while (vm_alloc_page(VM_ANON, pg_addr, true))
  {
    struct page *pg = spt_find_page(&thread_current()->spt, pg_addr);
    vm_claim_page(pg_addr);
    pg_addr += PGSIZE;
  }
}



PintOS Project3 GIthub 주소 PintOS

0개의 댓글