출처: http://blog.naver.com/ttagui?Redirect=Log&logNo=10052778539


출처: KLDP http://kldp.org/node/199

================================================================================

Submitted by arimae

 

W.Richard Stevens 씨께서 저술한 Advanced Programming in the Unix Environment 의 7.6절은 보면 C 프로그램의 Layout에 대해 설명이 나와있습니다.

간단히 설명해 보면

/-------------------------/  메모리상에서
| | 높은 구역
| Stack |
| |
/-------------------------/
| |
| Heap |
| |
/-------------------------/
| Uninitialized data |
| ---------Data---------- |
| Initialized data |
/-------------------------/
| |
| Text |
| | 메모리상에서
/-------------------------/ 낮은 구역

Text segment : CPU에 의해 실행되는 머신 코드들이 있는 영역.Read Only

Initalized data segment : data segment 라 불리는 영역이며, 초기화된 외부 변수 static 변수등이 저장되는 영역입니다. 보통 Text segment + initialized data 영역을 합쳐서 프로그램이라고 합니다.
예) static int a = 1;

Uninitalized data segment : bss segment 라고 불리며, 이 영역을 프로그램이 실행될때 0 이나 NULL Pointer로 초기화 됩니다.
예) static int a; (외부 변수나, static 변수중 초기화 되지 않은 변수들)

Stack : 자동 변수들이 저장되는 곳이고, 함수가 호출될때 함수 안의 자동변수(함수내 로컬 변수) 등이 저장되는 곳입니다. 함수가 실행되는 동안에만 존재하며 함수의 실행이 종료되면 그 변수들도 사라집니다. 함수내의 자동 변수외에 saved frame pointer 등의 함수를 호출한 caller의 환경 정보도 저장합니다.

Heap : 동적 메모리 할당을 할경우 Heap 영역에 할당이 됩니다. Heap 영역은 uninitialzed data 영역의 top 과 stack 영역의 bottom 부분에 위치합니다.

이 밖에 더 자세한 것을 알고 싶으시면 Phrack 문서의 Smashing The Stack For Fun And Profit 을 읽어 보시거나 위에서 제가 언급한 책을 읽어 보시길 바랍니다. Phrack 문서는 해킹 문서로 해킹을 하기 전초 단계로 위의 영역에 대해 설명이 자세히 나와있습니다.

www.phrack.org 에서 받을 수 있으며, 49호 14 장이 위의 주제를 다룹니다.

 

==================================================================================

Submitted by 고도리

 

실제로는 물리적(혹은 논리적)인 메모리의 한 종류일 뿐입니다.

가장 큰 차이는 stack은 LIFO의 형태입니다. Heap은 위의 분의 프로세스
설명대로 그냥 메모리 공간입니다.

근데 왜 stack이랑 heap의 차이를 두느냐, stack은 주로 작업할때
데이터를 임시 저장하는 용도로 사용합니다.

여기에 LIFO라는 얘기가 나오게 되겠지요...

가장 간단한 예로 함수 호출을 생각해 보면, 함수를 호출하면 일단
현재 상태의 레지스터값을 저장해야하고, 함수를 호출할때 인자등을 건네
줘야합니다.

그것을 stack에 저장을 합니다. 그런 후 호출된 함수의 context쪽으로 들어
가겠지요... 여기서도 임시 저장공간으로 스택을 사용합니다.

그리고 계산을 다 한후 원래의 함수로 리턴을 해야하는데, 여기서 스택의
사용용도를 알 수가 있습니다.

일단 호출된 함수에서 사용한 값들은 다 사용을 했으니 리턴값을 빼고는 다
필요없으니 다 뽑아버리고요...

호출한 함수로 돌아가야 되니 함수호출하기 전에 저장했던 놈들을 다시
뽑아내야 되겠지요...

그래서 LIFO의 형태가 되야 하는 겁니다.

원래 컴파일러마다 함수호출관행이라는 것이 있는데, 자세한 것은
GCC manual의 해당부분을 보면 stack의 용도를 볼 수 있을 겁니다...


Posted by 세모아
,