본문 바로가기
CS/운영체제

[OS] Call Stack Frame

by 베어 그릴스 2022. 8. 16.
320x100

Call Stack Frame


 

Call Stack Frame개념에서 우리가 함수가 return 된 후에 지역변수를 사용할 수 없는 이유를 어느 정도 알 수 있다.

 

메모리의 스택을 좀더 자세히 알아보자.

Call Stack

 

Stack의 구성

 

(1) 파라메터: 호출되는 함수의 인자에 assign 되는 값

(2) 지역변수: 호출되는 함수 내에서만 생성되는 변수

(3) return address: 호출되는 함수 종료 시 되돌아가 수행을 계 속해 가기 위하여 jump 해 가야 할 주소

(4) frame point(stack frame pointer): 스택 상의 프레임 시작 주소. 보통 EBP 레지스터에 저장된다.

(5) Stack Pointer: 콜 스택의 최상위 메모리 주소. 보통 ESP 레지스터에 저장된다.

 

* frame이란?

함수호출 시 스택 상에서 운용되는 내용(데이터)

프레임 포인터: 스택 상의 프레임 시작 주소(베이스 주소)

프레임의 크기가 함수마다 다르기 때문에 바로 이전 프레임의 프레임 포인터 값을 프레임 내에 간직하고 있어야 함.

간단히 생각하면, stack에는 여러 함수가 들어오기 때문에 각 함수를 구분해주는 포인터라고 생각하면 된다.

 

 

[ main 함수에서 func(x, y) 함수를 호출했을 경우 EBP, ESP 레지스터 값의 변화 과정 ]


1. main 함수 실행
EBP 레지스터는 main 함수의 최하단 주소 값,
ESP 레지스터는 main 함수의 최상단 주소 값을 저장한다.


2. func(x, y) 함수 실행
먼저 func 함수의 프레임에 바로 이전 프레임의 프레임 포인터 값(main 함수의 프레임 포인터 값) 즉, EBP 레지스터의 값을 저장한다. → EBP레지스터를 ESP 값으로 변경하기 때문에 이전 함수의 시작 주소를 알 수 없게 된다. 이때를 위해 frame pointer 즉, 이전 EBP 레지스터의 값을 저장해놓는다.


그 후 EBP 레지스터를 ESP 레지스터의 값으로 변경하고,
ESP 레지스터를 func 함수의 최상단 주소 값으로 변경한다.

 

 

 

이렇게 함수가 끝나면 메모리에 남아있는 지역 변수를 모두 pop해 버리기 때문에 값을 사용할 수 없게 된다.

 

pop함과 동시에 EBP레지스터는 저장해놓았던 이전 EBP레지스터의 값으로 바꾸기 때문에 프레임을 유지할 수 있다.

 

*더 자세한 내용 참고

Stack frames (rutgers.edu)

 

Stack frames

Stack frames A really quick explanation of stack frames and frame pointers Paul Krzyzanowski February 16, 2018 Understanding Frame Pointers Each function has local memory associated with it to hold incoming parameters, local variables, and (in some cases)

people.cs.rutgers.edu

 

728x90