2011-03-18 3 views
4

"스택 페인팅"이라는 기술을하고 있습니다. 특정 기능이 얼마나 많은 스택 공간을 사용했는지 확인합니다.Windows가 스택 공간을 회수합니까?

1MB 상당의 항목이 스택에 할당되었습니다. 그런 다음 그 항목을 스택에서 사용하지 않을 것이라고 확신합니다. 창문 은 자동으로 디코트 (무료)하는 페이지입니까?

특히 Windows의 VMM에 대해 궁금합니다. 페이지가 커밋되었거나 꼭 필요한 것은 아닌지에 대해 으로 지정 되었습니까?

다른 말로하면, 수동으로 해당 1MB 메모리를 액세스하면 Windows에서 액세스 위반이 발생할 수 있습니까?

+1

잘 * 스택 오버플로가 발생할 수 있으므로 stackoverflow.com에 왔습니다. :) –

+1

또는 BufferOverflow.com을 시도했을 수 있습니다. ;) 흠 ... 아마도 StackOverflow가 해당 도메인을 예약해야합니까? –

답변

3

첫 번째 질문에 답하기 위해 Windows는 해당 페이지의 디코 팅을 수행하지 않습니다. 스택으로 커밋 된 모든 페이지는 스레드가 종료 될 때까지 계속 증가합니다.

두 번째 질문에 답하려면 관련 필드가 IMAGE_OPTIONAL_HEADER32 또는 IMAGE_OPTIONAL_HEADER64 구조에 있습니다. 그들은 SizeOfStackReserve와 SizeOfStackCommit입니다. 이 구조는 PE의 NT 헤더의 일부이며, MSDOS 헤더 (PE의 "0"에서 시작하여 마법 값으로 "MZ"로 시작하는 것)에서 참조됩니다.

Microsoft의 link.exe에는이 두 필드와 직접적으로 관련이있는 "/ STACK : reserve [, commit]"스위치가 있습니다.

질문이 변경되었으므로 편집 : 스택의 커밋 된 페이지와 현재 가드 페이지에만 안정적으로 액세스 할 수 있습니다. 가드 페이지가 아닌 예약 페이지에 액세스하면 AV를 예상해야합니다 (마지막 가드 페이지에 액세스하면 SEH 스택 오버플로 예외가 발생합니다).

+0

컴파일러가 가드 페이지 스킴을 사용하는 함수에 대해 스택 공간 페이지를 "할당"하는 방법에 대해 궁금한 점이 있다면 _chkstk와 같은 것을 사용할 것입니다. _chkstk는 각 페이지를 현재 스택 포인터를 사용하여 가드 페이지가 액세스되고 페이지가 운영 체제에 의해 커밋되었는지 확인합니다. –

6

스택에 할당 된 항목은 삭제하지 마십시오. 현재 스코프를 벗어날 때 스택 포인터가 이전 스택 프레임 으로 다시 이동하므로 현재 범위의 객체에 사용 된 모든 메모리가 효과적으로 재구용되므로 자동으로 회수됩니다.

기본적으로 모든 스택은 응용 프로그램이 메모리에로드 될 때 할당되므로 고정 된 크기의 구조가 반복적으로 재사용됩니다 (코드 흐름이 범위 안팎으로 이동하는 동안). OS는 영리한 트릭을 수행 할 수 있지만 (스택의 상단 부분을 위탁하는 가드 페이지를 사용하여 응용 프로그램의 시작 부분에 예약되어 있음) 일반적으로 이것은 당신을 염려하지 않아야합니다.

스택 크기는 PE 헤더 (실행 파일의 헤더)의 일부이며 링커 옵션으로 설정할 수 있습니다. 메모리에로드 된 PE 구조를 스누핑하여로드 된 실행 파일에 대한 값을 검색 할 수 있습니다 (기본적으로 HMODULE은 실행 파일이 메모리에 매핑되는 위치입니다). 나는 ImageHelper 라이브러리가이 작업에서 유용 할 수 있다고 생각한다.

당연히
  1. , 소멸자가 실행 된 후, 그건 그렇고, FPO는 여기에 약간의 변화를 줄 수 있지만 개념은 동일합니다. 내가 수동으로 1메가바이트까지 메모리에 액세스하는 경우

편집 otherwords에서

, 창 액세스 위반을 던질 수있다?

이미 커밋 된 경우 (즉, 스택에 1MB의 개체를 할당하고 할당을 해제 한 경우) 발생할 수 있다고 생각하지 않습니다.

윈도우 스택의 일부가 더 이상 사용하지 않는 것을 단서가없는 것입니다. Windows는 더 많은 페이지를 커밋해야하는지 여부를 감지 할 수 있습니다. 가드 페이지를 사용하여 스택의 상단 부분에 대한 액세스를 감지하지만 이러한 페이지가 더 이상 사용되지 않는다는 것을 알 수 없습니다.

실제로 컨텍스트 스위치에서 스택 포인터를 찾을 수는 있지만 스택이있는 "영리한"기능을하는 앱이 중단 될 수 있습니다. 일반적으로 노력이 필요하지 않은 최적화가됩니다. 이러한 페이지는 여전히 페이지 아웃 될 수 있습니다.

여전히 안전하게 재생하려면할당이 발생했는지 여부를 모르는 경우 현재 사용중인 섹션을 위로 읽어야합니다. 따라서 페이지가 위쪽으로 커밋되지 않은 상태에서 가드 페이지를 계속 터치하면 Windows에 더 많은 작업을 알리도록 경고합니다 스택 페이지

+0

이것은 또한 좋은 대답입니다. – unixman83

+0

@ unixman83 : 고마워요! ':)' –

관련 문제