09_pintos_VM_stack_growth

신치우·2022년 12월 11일

data_structure_and_Pintos

목록 보기
30/36

Project 2에서 스택은 USER_STACK 에서 시작하는 단일 페이지였으며, 프로그램은 이 크기(4KB)로 제한하여 실행했습니다. 이제 스택이 현재 크기를 초과하면 필요에 따라 추가 페이지를 할당합니다.

stack 을 키우기 위해서 thread 구조체에 void *rsp_stack; 을 넣어줌

  struct supplemental_page_table spt;
  void *stack_bottom; // setup stack에서 bottom의 정보를 가지고 있기위해서 너놓음
  void *rsp_stack; // stack이 가득 찼을때 움직이면서 공간을 더 확보하기 위함이자 page_fault를 통해서 얻은 rsp는 이미 기록이 되어있지만 유저에서 죽지 않고 kernel에서 죽으면 알수가 없음 그래서 kernel의 rsp도 기억하기 위한 공간

기존에 구현한 syscall.c 에서 rsp_stack의 값을 저장해줌

void
syscall_handler (struct intr_frame *f UNUSED) {
  // TODO: Your implementation goes here.
  thread_current()->rsp_stack = f->rsp;
  1. vm_try_handle_fault
bool
vm_try_handle_fault (struct intr_frame *f UNUSED, void *addr UNUSED, bool user UNUSED, bool write UNUSED, bool not_present UNUSED) {
  struct supplemental_page_table *spt UNUSED = &thread_current ()->spt;
  struct page *page = NULL;
  /* TODO: Validate the fault */
  /* TODO: Your code goes here */
  if (is_kernel_vaddr (addr)) // addr 를 먼저 check 해줌
    return false;

  void *rsp_stack = is_kernel_vaddr (f->rsp) ? thread_current ()->rsp_stack : f->rsp; // f->rsp가 kernel address인지 확인하고 kernel이면 thread에 저장한걸 불러오고 user면 frame에 있는걸 그대로 사용
  if (not_present) {
    if (!vm_claim_page (addr)) {
      if (rsp_stack - 8 <= addr && USER_STACK - 0x100000 <= addr && addr <= USER_STACK) {
        // rsp_stack - 8 --> 다음줄로 옮긴후 그 주소가 addr보다 작으면
        // USER STACK 부터 1MB(GITBOOK에서 허용한 USER_STACK) 까지 이내에 addr가 존재하면
        vm_stack_growth (thread_current ()->stack_bottom - PGSIZE); // stack을 더 키워줌
        return true;
      }
      return false;
    } else
      return true;
  }

  return false;
}

2.vm_stack_growth

static void
vm_stack_growth (void *addr UNUSED) {
  if (vm_alloc_page (VM_ANON | VM_MARKER_0, addr, 1)) { // 해당 addr를 이용하여 page를 할당 받고 거기서 성공했다면
    vm_claim_page (addr); // claim_page를 통해서 연결해주고
    thread_current ()->stack_bottom -= PGSIZE; // PGSIZE 만큼 늘었으니 stack_bottom을 PGSIZE 만큼 늘려줌
  }
}

여기까지 구현이 완료되면 stack과 관련된 부분은 전부 완료되어야함
남는 test case는 30개정도

profile
https://shin8037.tistory.com/

0개의 댓글