◎ 스택 프레임(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