3강 프로그램의 기계수준 표현(2)

CSAPP 3단원

CHAPTER 3 프로그램의 기계수준 표현

3.7 프로시저

프로시저 호출 : 스프트웨어에서의 주요 추상, 지정된 인자들과 리턴 값으로 특정 기능을 구현하는 코드를 감싸주는 방법을 제공

잘 설계된 소프트웨어 : 무슨 값이 게산되는가, 이 프로시저가 프로그램 상태에 무슨 효과를 갖는가 에 대한 간결한 인터페이스 정의 제공

일부 동작의 구체적인 구현은 감춰주는 방식으로 프로시저를 추상화 메커니즘으로 이용

ex. 프로시저 P가 프로시저 Q를 호출, Q가 실행한 후 다시 P로 리턴

  • 제어권 전달 : 프로그램 카운터는 진입할 때 Q에 대한 코드의 시작주소로 설정되고, 리턴할 때는 P에서 Q를 호출하는 인스트럭션 다음의 인스트럭션으로 설정되어야 함
  • 데이터 전달 : P는 하나 이상의 매개변수를 Q에 제공할 수 있어야 하며, Q는 다시 P로 하나의 값을 리턴할 수 있어야 함.
  • 메모리 할당과 반납 : Q는 시작할 때 지역변수들을 위한 공간을 할당할 수도, 리턴할 때 이 저장소를 반납할 수 있음.

3.7.1 런타임 스택

C언어와 다른 대부분의 언어에서의 프로시저 호출 동작방식 : 스택 자료구조가 제공하는 후입선출 메모리 관리 방식을 활용

프로시저 P가 프로시저 Q를 호출하는 예제 : Q가 실행되고 있는 동안 P까지의 연속된 호출 중의 프로시저 P는 일시정지

Q가 실행중에는 자신의 지역변수를 위한 새로운 저장공간을 할당할 수 있는 능력 or 다른 프로시저로의 호출을 설정하는 능력만 필요

반대로, Q가 리턴할 때는 자신이 할당받은 로컬 저장장소는 반납

즉 : 프로그램은 스택을 사용해서 프로시저들이 요구하는 저장장소를 관리할 수 있으며, 여기서 스택과 프로그램 레지스터들은 제어와 데이터를 전송하기 위해, 메모리를 할당하기 위해 필요한 정보를 저장

x86-64의 스택 : 작은 주소 방향으로 성장, 스택 포인터 %rsp는 스택의 최상위 원소 지칭, 데이터는 pushq와 popq 인스트럭션을 이용해서 저장과 읽기, 특정 값으로 초기화되지 않은 데이터를 위한 공간은 적당한 양의 스택 포인터를 감소시켜 간단히 할당 가능, 공간은 스택 포인터를 증가시켜 반납 가능

x86-64 프로시저가 레지스터들에 저장할 수 있는 개수 이상의 저장공간 필요로 할떄 : 공간을 스택에 할당 => 이 영역이 stack frame

런타임 스택의 구조 : 현재 실행 중인 프로시저에 대한 프레임은 항상 스택의 맨위 위치. 프로시저 P가 프로시저 Q를 호출할 때 리턴주소(return address)를 스택에 푸시해서 Q가 리턴할 때 P에서 프로그램이 실행을 재시작해야 하는 위치를 가리킴. 리턴 주소가 P에 관계된 상태들을 저장하기 때문에 리턴주소는 P의 스택 프레임에 속하는 것으로 간주. Q에 대한 코드는 현재 스택 경계르,ㄹ 확장해서 자신의 스택 프레임을 위한 공간 할당.