본문 바로가기

Books/뇌를 자극하는 윈도우즈 시스템 프로그래밍

[뇌자극] 03. 컴퓨터 구조에 대한 세 번째 이야기

이번 장에서는 함수가 호출되는 원리와 호출이 될 때마다 할당되는 메모리 관리방식에 대해서 이야기하고자 한다. 프로그램이 실행되는 원리에 보다 근접한 내용을 언급하는 것이다.

절차적 함수 호출(Procedure Call) 지원 CPU 모델

함수가 호출되는 방식은 CPU에 따라서 차이를 보인다. 한 예로 ARM 코어에서는 ATPCS(ARM Procedure Call Standard)라는 것을 정의하였는데, 이는 함수의 전달인자와 리턴 어드레스(함수 호출이 완료되고 나면 되돌아 갈 주소)를 레지스터에 저장하기로 결정하고, 그 저장방식에 대한 표준을 정의한 것이다. 따라서 컴퓨터 구조를 이해하기 위해 설명할 모델은 이 표준을 고려하여 ARM 코어의 레지스터들도 디자인되어 있고, ARM 컴파일러도 이 표준에 맞게 바이너리 코드를 생성하도록 디자인되어 있다. 


스택 프레임(Stack Frame)

  • 함수 호출 과정에서 할당되는 메모리 블록 (= 지역변수의 선언으로 인해 할당되는 메모리 블록) 
  • 함수 호출이 return 하고 나면 할당된 메모리가 반환되어 기존에 선언된 지역변수에 접근이 불가능하다.
  • "fct2 함수가 호출되면서 이 함수 내에 선언된 변수 e와 h가 스택에 할당되는데, 이 메모리 블록을 가리켜 스택 프레임이라 한다. fct2 함수가 반환되면 이 스택 프레임은 모두 반환된다."


Stack Pointer 레지스터

  • 현재 어느 위치까지 데이터를 저장했는지 기억하는 레지스터
  • 변수가 할당될 때마다 변수의 크기만큼 증가하며, 다음 변수가 할당될 메모리 위치를 가리킨다.
  • 호출된 함수가 종료될 경우, 스택 프레임 단위로 sp 레지스터값을 이동한다.

[Q] 지역변수를 위한 메모리 공간을 스택이라 이름 붙인 이유

[A] 메모리의 구조적 특성(First In, First Out) 때문이다. 스택 프레임은 가장 먼저 할당되면, 가장 나중에 반환된다. 그리고 가장 나중에 할당되면, 가장 먼저 반환된다. 이것이 스택이라 불리는 이유이다.



Frame Pointer 레지스터

  • 함수 호출 이전의 sp 위치를 저장해 놓은 레지스터
  • 함수 호출이 일어날 때마다 fp 레지스터에 저장되어 있는 값을 스택에 저장한다. 그리고 새로운 값으로 fp 레지스터에 채운다. 
  • 이 원리로 함수를 중복 호출했을 때, fp 레지스터의 값을 덮어쓰는 문제가 쉽게 해결된다.


함수 호출 인자의 전달과 PUSH & POP 명령어 디자인

함수 호출과 프로시저(Procedure) 호출을 구분하는 것은 반환값의 존재 유무이다. 반환값이 존재하면 함수 호출, 반환값 없이 모듈화해 놓은 서브 루틴(Sub-Routine)의 실행을 위한 호출은 프로시저 호출이라 한다. 그러나 우리의 관심사는 정의가 아니고 보다 실질적인 내용들이다.

  • 함수 호출 시 실행위치의 이동은 어떻게 이뤄지는가?
  • 함수 호출 시 전달되는 인자들은 어떻게 함수 내부로 전달되는가?
  • 함수 호출이 끝나고 나면 어떻게 이전 실행위치로 복귀하는가?


함수 호출 인자의 전달방식

  • 지역변수와 마찬가지로 스택에 할당된다.
  • 성능 향상을 위해서 일부 전달인자들은 레지스터를 할당해서 이곳에 저장하도록 제품의 표준을 정의하기도 한다.
  • 실제 ARM 코어와 64비트 인텔 코어는 레지스터를 적극 활용한다.


여기서 잠깐 정리하면 호출된 함수 내부에서 선언되는 지역변수 이외에도, 호출 시 전달되는 인자값과 스택 프레임의 경계 정보까지 스택에 저장되는 구조라고 말할 수 있다.


PUSH & POP 명령어 디자인


함수 호출(Procedure Call)에 의한 실행의 이동

프로그램 실행 시 스택이 관리되는 기본 원리에 대한 공부를 했다. 그 과정에서 sp레지스터와 fp레지스터의 용도에 대해서도 공부했다. 이번에는 프로그램의 실행되는 원리에 대해 살펴보고 프로그램 작성 시 정의하고 호출되는 함수의 원리에 대해 공부해보자. 이 과정에서 pc레지스터의 역할에 대해 알게된다.


다시 살펴보는 메모리 구조와 프로그램 카운터(Program Counter)




asdf


asdf


asdf



함수 호출규약(Calling Convention)