현재까지 Stack은 단일 페이지로 구성되어 그 크기 이상의 프로그램 실행은 제한되었다. 지금부터 필요한 경우 추가 페이지를 Stack에 부여함으로써 크기를 키울 수 있도록 구현한다.
스택에 접근하는 경우에만 추가 페이지를 할당한다.
<aside> 🧐 Heuristic?
<aside> 🧐 8바이트 아래에서 유효성 검사를 해야하는 이유?
PUSH
명령어는 스택 포인터(rsp
)를 8바이트 감소시킨다.rsp
가 가리키는 새로운 메모리 주소에 데이터를 저장한다.👉 스택 포인터보다 8바이트 아래에서 페이지 폴트가 발생한다.
</aside>
<aside>
🤖 user
→ kernel
로 전환될 때, 즉
syscall
이 호출될 때page_fault
가 발생할 때👉 intr_frame
이 전달되므로 이를 통해 rsp
를 구할 수 있다.
👉 그러나, 커널 모드에서 페이지 폴트가 발생한 경우에는 rsp
를 알 수 없다.
</aside>
스레드에
rsp
를 저장해놓는 필드를 추가하고, 시스템 콜이 발생했을 때 이 필드에 당시의rsp
를 저장한다.