Calling Convention

James·2023년 1월 29일
0

지난 글에서 stack의 자료구조와 메소드에 대해서 살펴봤습니다. 이번 글에서는 Stack이 어디에 어떠한 방식으로 사용되는지 살펴보도록 하겠습니다. Stack은 워낙 기초적이지만 응용할 곳이 많지만, calling convention에서 사용되는 stack으로 예시를 작성해보겠습니다.

Procedure Calling

RISC-V 32I architecture의 register set을 기준으로 calling convention에서 발생하는 stack의 응용에 대해서 설명하겠습니다. Procedure를 실행하는 중간에 다른 procedure를 call한다면, caller procedure의 state를 어딘가(stack, 정확히는 local thread의 stack)에 저장해야만한다.이 동작의 단계는 precall, prologue, epilogue, post-return으로 구분되며 이는 아래 그림과 같다. Caller procedure가 pre-call과 post-return 단계를 포함하며, callee procedure가 prologue와 epilogue를 의미한다.

각 단계에서 수행하는 instruction은 결국 register 값을 thread의 local stack에 ld/st를 수행하는 것이다. 이때, store해야할 register가 많으면 overhead로 작용할 수 있다. 이러한 overhead를 줄이기 위해서 caller-save register와 callee-save register로 구분짓고, RISC-V에서 이는 아래 그림과 같이 구분된다.

Precall

Callee procedure에서 사용할 register 값을 stack에 저장하는 단계로써 caller-save register에 해당하는 register를 stack bottom에 저장한다. Register save가 완료되면, PC jump를 통해 target address로 jump한다.

Prologue

Precall에서 저장된 caller-save register와 callee procedure에서 사용할 local variable의 사이즈만큼 stack pointer를 decrement한다. 그리고 callee-save regiser를 thread local stack에 저장한다.

Epilogue

Procedure의 작업을 마치고, caller procedure로 return하기 이전 시점에 해당한다. 이때, Callee-saved register를 recovery(state recovery)한다. Stack pointer와 PC도 return address로 setting한다.

Post-return

마지막으로 caller-save register를 recovery한다.

profile
System Software Engineer

0개의 댓글