2012-09-15 1 views
4

나는 exe 스택이 어디에 있는지 혼란 스럽다. 프로그램 실행 전에 CRT가 힙 (페이지를 할당하는 OS에 의해 할당 됨)을 할당함으로써 힙을 초기화한다는 것을 알고있다. 스택은 어디에 있습니까? 페이지에도 있습니까? 또는 GDT에 ring3 설명자를 사용하여 사용자 모드 (ring3)의 모든 프로그램에서 공유하고 있습니까 (모르겠지만 확실하지 않습니다)?Windows에서 스택 - 어디입니까?

답변

5

Windows는 스레드 당 연속 가상 메모리 영역 (기본적으로 1MB)을 예약합니다. 그런 다음 메모리 영역의 최상위 페이지 몇 개를 커밋하고 그 아래에 보호 페이지로 표시합니다. 스레드의 스택이 아래쪽으로 늘어남에 따라 가드 페이지에 액세스하면 예외가 발생하고 Windows는 가드 페이지를 저지하고 그 아래 페이지를 가드로 표시합니다.

우수 SysInternals 유틸리티 VMMap으로이 동작을 탐색 할 수 있습니다.

enter image description here

3

각 스레드에 자체 스택이 제공됩니다. 그것은 단지 그 목적을 위해 할당 된 메모리 덩어리입니다.

는 모든 메모리 (. 대부분의 메모리 페이지가 4킬로바이트 것을 주어,이 페이지의 숫자에 걸쳐 것이다 있도록 Windows에서 내가 1메가바이트에 스택 기본값을 믿고) 스택을 포함하여, 페이지에

를 할당하지만 그건됩니다 실제로 스택 포인터 레지스터가 가리키는 메모리 덩어리입니다.

+0

스레드가 생성받을 때 응용 프로그램이 시작될 때 단일 스레드 애플리케이션, 메인 스레드의 스택이 생성되도록 스택이 초기화는,이 또한 있어야한다 : 아래 해당 도구에서 미리보기입니다 crt에 의해 완료? –

+0

crt는 그것을 할 수 없습니다 - 그것은 C 프로그램이 아닐 수도 있습니다! 그렇더라도, crt가 실행되기 전에 스택을 설정해야합니다. 그렇지 않으면 crt가 스택을 사용할 수 없습니다. 자동 변수, 매개 변수를 사용하거나 함수 호출을 할 수 없습니다. Windows OS 로더는 EXE/DLL/SYS/어떤 PE 헤더의 데이터에 의해 지시 된 초기 스택을 설정합니다. –

1

Windows의 각 프로그램은 프로세스입니다. 프로세스는 일반적으로 서로간에 메모리를 공유하지 않습니다.

공유 및 공유하지 않는 것은 각 프로세스의 가상 주소 공간이 실제 메모리에 매핑되는 방식에 대한 질문입니다.

두 프로세스가 주소 공간의 일부를 실제 메모리의 동일한 페이지에 매핑하면 해당 메모리가 효율적으로 공유되며 각 프로세스는이를 읽고 쓰고 다른 프로세스의 쓰기를 관찰 할 수 있습니다.

스택 메모리를 공유하는 데는 거의 의미가 없으므로 모든 프로세스에 자체 스택이 있습니다. 실제로 프로세스는 컨테이너와 비슷합니다. 코드를 실행하고 스택을 사용하는 엔티티는 스레드입니다. 모든 프로세스에는 적어도 하나의 스레드가 있습니다. 스레드는 자체적 인 스택을 가지고 있지만 프로세스의 스레드는 동일한 가상 주소 공간에 있으므로 서로 다른 스택에 액세스 할 수 있습니다. 때로는 스레드간에 데이터를 공유하는 것이 유용하지만 스레드 상태가 손상되지 않고 중단되거나 충돌이 발생하지 않도록주의해서 수행해야합니다.

관련 문제