많은 운영 체제에서 스택과 힙은 프로세스의 가상 주소 공간의 반대쪽에서 시작하여 서로를 향해 증가합니다. 이렇게하면 힙을 치지 않고 가능한 한 스택을 확장 할 수 있습니다.운영 체제에서 스택 오버플로를 어떻게 감지합니까?
스택 오버플로를 유발하는 프로그램이 있다고 가정합니다. 현재 나의 이해는 스택이 제어 할 수 없게 힙쪽으로 성장하여 결과적으로 스택을 쳤다는 것입니다. 이 올바른지? 그렇다면 운영 체제가 스택 오버플로가 발생하는 것을 어떻게 감지합니까? OS가 연속 메모리 영역에 있기 때문에 스택의 일부로 힙에 할당 된 가상 메모리를 사용하려고한다는 것을 OS가 감지하지 못하는 것 같습니다.
운영체제에 따라 다르지만 이것이 발생하는 메커니즘에 대한 통찰력이 인 경우 운영 체제가 분명 도움이 될 것입니다. 이것은 잠시 나에게 괴롭혀 왔고 어떤 좋은 설명도 찾을 수없는 것 같습니다.
@ CAFxX- 이것은 합리적인 것처럼 보이지만 후속 조치로 스택 프레임이 매우 큰 프로그램 (가상 메모리 페이지보다 큼)이 있다고 가정합니다. 그런 다음 내 프로그램이 스택에 많은 페이지를 할당 한 다음 스택 뒤의 메모리와 힙의 메모리로 "건너 뛸 수"있지 않을까요? – templatetypedef
OS가 그 자리에 수표를 가지고 있습니다. 합리적이지 않으면 스택 오버플로가 발생합니다. 스택이 너무 많이 커지면 (예를 들어 실제로 많이 힙에 도달하는 경우 - 일반적으로 제한이 훨씬 엄격하고 플랫폼에 따라 다름) 의존성) OS는 스택 오버 플로우를 발생시킴으로써 당신을 멈추게 할 것입니다 - 이것은 일반적으로 Bad Things (TM)가 일어나지 않도록 프로세스를 종료합니다. – CAFxX
다른 유형의 스택 오버 플로우, 즉 스택 손상을 초래하는 스택 오버 플로우에 대해 묻는 중일뿐입니다. 이것은 다르며 일반적으로 스택에 "센티넬"을 배치하여 프로세스 런타임에서 검사합니다. 센티널이 겹쳐 쓰면 스택이 손상되어 스택 오버플로/손상 예외가 발생 함을 의미합니다 (단, 일반적으로 OS가 아니라 프로세스 런타임에 의해). – CAFxX