[Pintos] Porject 2_Calling convention_Caller, Callee and registers
함수 호출 규약 Calling Convention
- 함수 호출 규약(Calling Convention)을 이해하기 위해서는 스택과 스택 프레임에 대한 정확한 이해가 있어야 한다.
- 각각의 thread 마다 stack 이 생성되고, 각각의 함수마다 stack frame이 존재한다.
- stack frame에는 해당 함수에 관련된 데이터가 push, pop되는데, 이를 위해 main()과 sum() 함수의 대화 방식이 같아야한다. 이 방식을 함수 호출 규약(Calling Convention) 이라고 한다.
함수 호출 규약 (Calling Convention)
- 함수 호출 규약은 아래 4가지 값을 기준으로 그 종류가 나눠진다.
- Parameter 전달 방법 - 어떻게 parameter 전달?(stack frame사용 or register 사용)
- Parameter 전달 순서 - 함수명(parameter1, parameter2, ...) 에서 어떤 parameter부터 먼저 전달할 것인가?
- 함수 리턴 값 전달 방법 - 함수 리턴 값을 어디에 저장해서 돌려줄 것인가?
- 함수 호출간 사용했던 stack frame을 정리하는 방법 - 함수 사용이 끝난 후 사용했던 stack frame 공간을 누가 정리?
Caller와 Callee
main() 함수에서 func()이 호출되는 경우 main을 caller(호출 함), func()를 callee(호출 됨)이다. 이 때 레지스터와 스택을 사용한다.
main()함수는 실행하면서 레지스터를 사용한다. 그러나 func() 함수가 return되면 다시 func()함수가 호출 되기 전 레지스터의 값을 갖고 있어야 한다. 이 때 caller가 저장하고 보존되도록 신경써야 하는 레지스터를 caller-saved-register라 하고, callee는 이 레지스터들을 자유롭게 사용할 수 있다.


콜러가 저장하는 레지스터 (caller-saved-register)
- 사용하기 전 콜러가 반드시 백업해야 하는 레지스터, 콜리는 사용 가능
- 값이 보존되지 않아도 되는 경우에는 백업하지 않을 수 있다.
EAX : Extended Accumulator Register - 논리 연산
ECX : Extended Counter Register - 카운터 레지스터. 반복 명령어 사용시 반복 카운터로 사용
EDX : Extended Data Register - EAX와 같이 연산에 쓰임. 부호 확장 명령 등에 쓰임.
콜리가 저장하는 레지스터 (callee-saved-register)
- 사용하기 전 콜리가 반드시 백업해야 하는 레지스터, 콜러는 사용 가능
- 함수 복귀 전 다시 값을 복원해야 함
- 콜리 입장에서는 콜러가 백업을 필요로하는 레지스터가 무엇인지 모르기 때문에 무조건 백업해야한다.
EBX : Extended Base address Register - 메모리 주소 저장을 위한 레지스터. ESI나 EDI와 결합하여 사용 가능.
ESI : Extended Source Index - 데이터 조작 및 복사시 소스 데이터의 주소가 저장됨
EDI : Extended Destination Index - 복사 시 목적지의 주소가 저장됨. ESI 레지스터와 비슷
EBP : Extended Base Pointer - 스택 프레임의 시작 지점 주소 (스택의 가장 윗 부분, 스택의 처음)가 저장. 현재 스택 프레임이 소멸되지 않는 이상 EBP 레지스터의 값은 변하지 않음
참고로 위 7개 레지스터들은 모두 범용 레지스터이다.
참조:
http://cr3denza.blogspot.com/2015/03/caller-callee.html
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=tjdghkgkdl&logNo=10117639381
'정글 2기 > OS 운영체제' 카테고리의 다른 글
[three_easy_pieces] 파일 시스템(File system)_vsfs(Very Simple File System) (0) | 2021.10.13 |
---|---|
[OS운영체제] 권영진 교수님 OS 강의_2 (카이스트 전산학부) (0) | 2021.10.11 |
[three_easy_pieces] 가상 메모리(Virtual memory)_주소 변환의 원리 (0) | 2021.10.07 |
[pintos] Project 1_priority scheduling (0) | 2021.10.04 |
[pintos] Project 1_alarm (0) | 2021.10.04 |
댓글