본문 바로가기

개발 관련

[펌]스택프레임(Stack Frame), Frame Pointer Omission(FPO)

◎ 스택 프레임(Stack Frame) 이란?

- 모든 함수는 자신 만의 Stack 영역을 가질 수 있는데,

  바로 이렇게 함수들이 사용하는 영역을 Stack Frame 이라고 한다.

 

- Stack Frame 을 나눠 주기 위해 EBP 레지스터가 존재하고, EBP는 Stack Frame 의 시작 지점 을 가리킨다.

 

- EBP레지스터는 하나 밖에 없기 때문에, 새로운 Stack Frame을  생성할 때 는, 항상 EBP를 백업 해야 한다.

( 함수 종료후, 이전 함수의 Base Point를 찾아가기 위해서 ) 

 

◇ 스택 프레임(Stack Frame)의 등장 배경

- Stack 내 데이터는 Data영역에 저장된 데이터와는 달리, 절대 주소값을 갖지 못하기

  때문에 항상 기준점 으로부터 offset 값을 이용하여 참조하게 되었다.

 

- ESP를 기준으로 참조 하는 경우, ESP는 수시로 변할 수 있기 때문에 컴파일러 에게 굉장한 부담을 준다.

 

- 때문에 고정된 기준점이 필요하게 되었고, Stack Frame이라는 개념을 도입하고,

  Stack Frame의 시작점을 Stack 안의 데이터에 접근하기 위한 기준점으로 삼게 되었다.

  ( 이 시작점이 EBP 이다 )

 

◇ Frame Pointer Omission[FPO]

- 말 그대로 Stack Frame Pointer(EBP) 를 생략하는 것이다.

- 즉 Stack Frame을 사용하지 않는다.

 

▶ 특징

1. EBP를 생략하면 다른 용도로 사용할 수 있다.

- Stack Frame을 사용하지 않는 곳 에서는 EBP를 사용하지 않기 때문에 타 용도로 사용 가능.

- 속도 향상에 도움이 된다.

 

2. 프로그램의 사이즈가 조금이라도 줄어든다.

- Stack Frame을 설정하고 정리할 필요가 없어지기 때문에 소스코드가 줄어든다.

 

3. 디버깅 하기가 어려워 진다.

- 아무래도 고정된 Base Pointer 가 있을 때보다, 유동적인 ESP 값을 이용하여

  참조 하게 되니, 스택의 상황에 따라 그 값도 수시로 변경될 것이고, 결국 직접적인

  구분이 어려워 진다.

 

4. 컴파일러에 부담이 생긴다.

 

 

▷ FPO는 회사 입장에서 보면 장점이 많다.

( 리버싱이 힘들어지고, 소스코드도 줄어드니.. )

 

<출처>

http://blog.naver.com/PostView.nhn?blogId=powerhw&logNo=80128887638