감자 텃밭

Stack Frame ? 본문

System/System Theory Information

Stack Frame ?

g2h 2021. 11. 15. 18:41

What is Stack??

- Stack이란 프로그램이 실행되면 지역변수, 매개변수, 반환값 등이 저장되는 메모리 공간이다.

 

메모리 구조를 간략하게 설명하게 되면

실제 메모리 구조는 좀 더 복잡하게 되어있지만 간단하게 알고 넘어가자면 위와같이 정의되어 있다.

위의 사진을 보면 알 수 있듯 스택은 높은 주소에서부터 낮은 주소로 흐르며 반대로 Heap 영역은 낮은 주소에서 높은주소로 흐르게되는대 이러한 이유는 운영 체제의 Kernel영역을 절대 침범할 수 없도록 하기 위함이다.

또한 스택과 힙이 마주보게 되어 메모리를 효율적으로 사용할 수 있다.

 

Stack은 LIFO 구조 즉 선입후출 구조로 되어있다. 먼저 들어간 자료가 가장 나중에 나오는 구조이다.

 


그럼 본격적으로 Stack Frame에 대해 다뤄보도록 하겠다.

Stack Frame란 무엇인가??

함수가 호출될 때 생성되며, 스택영역에서 호출된 함수를 구분하기 위한 공간이다.

해당 Stack Frame 안에는 매개 변수, Return, 지역변수등이 존재하며,

해당 Stack Frame이 생성되면 기본적으로 모든 프로그램은 프롤로그 과정과 에필로그 과정이라 불리는

과정이 진행된다. 해당 내용은 따로 다루도록 하겠다.

 

우선 몇가지의 레지스터 및 용어에 대해 알아 놓아야 한다.

EBP 함수로 전달되는 파라미터나 지역변수를 나타날 떄 기준이 된다
스택의 지역변수들은 EBP를 기준으로 상대적위치로 나타낼 수 있으며, 스택에서 제일 높은 위치에 존재한다. (스택의 시작)
ESP 스택 포인터로서 스택이 어디에 있는지 가리키며, 스택에서는 가장 낮은 위치에 존재한다. (스택의 끝)
EIP 다음에 실행될 주소를 담고 있다.
EAX 산술 연산의 결과값 또는 함수의 반환값을 담고있다.
EBX 주소 지정을 확장하기 위한 INDEX로 사용된다
ECX 루프의 반복 횟수, 좌우방향의 쉬프트 수를 기억
EDX 곱셈, 나눗셈등 산술연산에 사용되며, EAX와 함꼐 쓰인다
ESI/EDI 32bit 환경에 쓰이는 레지스터이며, cpu가 현재 코드 세그먼트에서 다음에 실행할 명령의 오프셋을 저장한다.
SFP 스택의 베이스 값을 뜻하며, 이전 함수의 스택 프레임 포인터를 저장 하는 영역
스택 포인터의 기준점이 됨
RET 이전 함수의 다음 실행 명령어의 주소를 저장하는 영역
이전 함수의 EIP가 저장됨

[ ebp레지스터는 함수가 시작할 때마다 생성되는 레지스터들과는 달리 한개만 존재한다. 그래서 함수가 실행될 때 마다 ebp값은 변경되는대 그 전의 ebp값을 스택에 저장한다 저장되는 값이 SFP에 저장된다.]

 

SFP 와 RET는 중요하기에 꼭 기억하기를 바란다.

해당 내용들은 여러 기법에 응용 되기도 하며, 함수 스택프레임에서 프롤로그, 에필로그 과정에서 쓰이게 되므로

이를 이해하지 못하면 이후의 내용도 이해하기 힘들 수 있다.

 

 

 

 

 

 

참고자료
http://www.tcpschool.com/c/c_memory_structure [이미지 인용]
https://foxtrotin.tistory.com/351