- 이전 Pintos는 하나의 큰 페이지로 스택을 할당하여 사용했다.
- 이젠 프로세스가 필요할 때마다 1페이지씩 자라나는 스택을 만들어 준다.
<aside>
💡 이때 자라나는 타이밍은 Page Fault
에 의해 자라나는 스택을 구현
</aside>
syscall handler 수정
- 유저 모드 → 커널모드 → 시스템 콜 호출 → 유저 스택 포인터를 스레드 구조체에 저장
- 따라서 시스템 콜 핸들러가 받은 인터럽트 프레임의 RSP값은 유저 프로세스의 유저스택포인터
void
syscall_handler (struct intr_frame *f UNUSED) {
// TODO: Your implementation goes here.
thread_current()->rsp_stack = f->rsp; // syscall을 호출한 유저 프로그램의 유저 스택 포인터
...
}
vm_try_handle_fault() 구현
- page fault가 뜨면 바로 프로세스를 종료하였다.
- 이젠 vm_try_handle_fault() 에서 한번 체크하게 되므로 우선 page_fault() 함수를 수정 해야 한다.
- page_fault() 수정 코드
<aside>
💡 위와같이 수정되면 vm_try_handle_fault() 에서 체크 후 false 이면 프로세스를 종료 시킨다.
</aside>
vm_stack_growth() 구현
- 스택의 맨 밑(stack_bottom)보다 1Page 아래에서 페이지를 하나 만듬
- 해당 페이지 타입은 ANON이여야 함
- vm_stack_growth()