Procedures call with Stack Frame

김민욱·2025년 4월 23일

Recursion을 지원하는 언어의 경우
코드는 반드시 Reentrant, 재진입이 가능해야한다.
\rarr 하나의 함수가 동시에 여러 번 실행 가능

각 실행마다 arguments, local variables, return pointer를 저장할 공간이 필요한데 이를 Stack으로 해결한다.

Stack discipline
함수 상태는 호출되고 나서 리턴될 때 까지의 시간만 필요함.
callee(호출 된 함수)가 caller(호출 한 함수)보다 먼저 종료되어야함.

Stack frame
함수 상태(arguments, local variables, return pointer)를 저장하는 stack 공간

Stack Frame

구성

  • 리턴 정보
  • 지역 저장소
  • 임시 공간

관리

  • 함수에 진입(call)하면서 공간이 할당됨 (%rbp: Frame 시작 주소)
  • 함수가 종료(ret)되면서 공간이 반납됨

x86-64/Linux Stack Frame

Callee Stack Frame

  • Argument build : caller로부터 받은 arguments
  • Local variables : 지역 변수들
  • Saved register context : 저장된 register 정보
  • Old frame pointer

Caller Stack Frame

  • Return address
  • Arguments build
    .
    .

Register 덮어쓰기 방지

함수들은 register를 돌려 쓴다. register는 한정되어있기 때문.
이 과정에서 register에 저장해둔 값이 덮어써지는 것을 방지해야한다.

  1. Caller Saved Convention
    Caller 함수가 register 값을 stack에 백업해 두고 함수를 call 한다.

  2. Callee Saved Convention
    Callee 함수가 실행 전 본인의 frame에 현재 값들을 백업한다.
    Caller에게 리턴하기 전 이 값들을 복원한다.


<참고자료>
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition
안성용, "시스템소프트웨어", 부산대학교

0개의 댓글