프로젝트 2에서 스택은 USER_STACK에서 출발하는 단일의 페이지였음. 프로그램의 실행은 그 스택의 크기에 제한 되었음. 이제는 스택의 현재 크기가 더 커진다고 하면 우리는 추가적으로 필요에 따라 추가적인 페이지를 할당해줄거임.
추가적인 페이지를 할당하는데 있어서 우리는 오직 스택에 대한 접근으로 그것을 수행함. 스택에 대한 접근과 다른 접근들을 구별하는 별도의 휴리스틱을 고안해야함.
사용자 프로그램들은 스택 포인터 아래 쪽 영역을 쓸대 버그를 발생시킴. 왜냐하면 일반적으로 OS들은 스택 영역에 있는 데이터에 접근할 때마다 “시그널”의 형태로 아무때나 프로세스에 대해 인터럽트를 발생 시키기 때문임.
하지만 x86-64 환경의 PUSH 인스트럭션은 스택 포인터에 접근하기 전에 접근 권한을 확인함. 그로 인해 스택 포인터 아래 8바이트에 대해서 페이지 폴트를 유발함.
이제 넌 유저 프로그램의 스택포인터를 현재 기준으로 얻어와 야할 필요가 있음. 유저 프로그램때문에 발생하는 페이지 폴트나 시스템 콜로 page_fault() or syscall_handler()
. 을 통해 들어온 intr_frame의 rsp로부터 복구할 수 있다.