Windows에서의 스택 할당
프로그램이 사용하는 스택 영역은 스레드가 생성되는 단계에서 만들어진다.
[ 초기 ]
high
... |
... |
Committed Page |
Guard Protection Page |
Reserved Page |
... |
... |
low
[*] 윈도우즈에서는 스레드 생성시 디폴트로 1MByte의 메모리를 Reserved Page로 놓는다.
여기서 1개의 페이지(4KByte)만을 실제 메모리와 매핑된 Committed Page로 두고 그 다음 페이지를 Guard Page로 놓는다.
[ 늘어나는 Committed Page ]
high
... |
... |
Committed Page |
Guard Protection Page |
Reserved Page |
... |
... |
low
[*] 스택을 사용하여 스레드가 Committed Page를 초과하여 사용할 때 Guard Page에 접근하게 되고 이 때 Guard Page를 Committed Page로 바꿔주며 Guard Page는 한 페이지 아래로 내려간다.
- 동작 원리는 Guard Page에 접근하게되면 페이지 폴트가 발생하고 해당 메모리가 스택 영역이였다면 ZwAllocateVirtualMemory를 호출하여 4KB를 할당해준다. 또 TIB의 StackLimit 값을 4KB 증가시킴으로써 현재까지 Commit된 스택 사이즈를 증가시켜준다.
[마지막 부분]
high
... |
... |
Committed Page |
Reserved Page |
... |
... |
[*] 마지막 페이지는 Guard Page가 내려오더라도 예약된 스택 영역을 벗어나지 않게 하기 위해서 항상 Reserved Page로 둔다.
ref - Windows 구조와 원리 (OS를 관통하는 프로그래밍의 원리)