AAPCS: 프로세스 메모리 및 스택

프로세스의 메모리는 일반적으로 다섯 가지 범주로 분류할 수 있다.

  • Code (Program)는 프로세스에서 읽을 수 있어야 하지만 쓸 수는 없다.
  • Read-Only static data
  • Writable static data
  • Heap(힙)
  • Stack(스택)

Writable static 데이터는 초기화된 데이터, 0으로 초기화된 데이터(BSS) 그리고 초기화되지 않은 데이터로 세분된다. 스택을 제외하고 각 메모리들은 연속된 메모리 공간을 차지할 필요는 없다. 프로세스는 항상 일부 코드와 스택이 있어야 하지만 다른 범주의 메모리는 반드시 필요한 것은 아니다.

Heap은 프로세스 자체에서 관리하는 영역으로, 동적으로 데이터 개체(메모리)를 만드는데 사용된다.

스택 (Stack)

스택은 연속적인 메모리 공간으로, 인수 레지스터가 부족하면, 지역 변수를 저장하고 서부루틴에 추가 인수를 전달하는데 사용된다.

스택은 전체 내림차순(높은 주소에서 낮은 주소로)이며, 현재 스택 위치는 레지스터 SP(r13)로 접근된다. 일반적으로는 base 와 limit이 있지만, 둘 중 하나의 값을 결정하지 못할 수도 있다.

스택은 크기가 고정되거나 동적으로 활장될 수 있다.

범용 스택 제약

다음과 같은 기본 제약 조건이 항상 유지되어야 한다.

  • Stack-limit <= SP <= stack-base: 스택 포인터는 스택 범위내에 있어야 한다.
  • SP mod 4 = 0. 스택은 항상 word로 정렬되어야 한다.
  • 프로세스는 [SP, stack base -1]로 구분되는 전체 스택의 닫힌 영역에만 데이터를 저장할 수 있다.

공용 인터페이스의 스택 제약

스택은 공용 인터페이스에서 다음 제약 조건도 준수해야 한다.

  • SP mod 8 = 0. 스택은 더블워드로 정렬되어야 한다.

스택 프로빙(Stack Probing)

스택 무결성을 보장하기 위해 프로세스는 새로운 스택 공간을 추가하기 바로 직전에 스택 프로브를 발생 시킬 수 있다. 스택 프로브는 [SP_new, SP_old -1] 범위에 있어야 하며, 읽기/쓰기 가 가능하다. 스택 프로빙 최소 간격은 대상 플랫폼에 정의되지만 최소 4K가 되야 한다. 현재 할당된 스택 영역아래에 데이터를 저장할 수 없다.

프레임 포인터(Frame Pointer)

프레임 포인터는 함수 호출과 관련된 메모리 관리를 위해 사용되는 중요한 개념으로, 스택을 추적할 수 있게 한다. r11(FP) 레지스터를 사용한다.

프레임 포인터를 요약하면 다음과 같다.

  • 함수 내에서 로컬 변수와 함수 호출에 필요한 임시 데이터를 저장하는 스택 프레임을 관리하는데 사용
  • 함수가 호출될 때, 프레임 포인터는 스택상에 현재 함수의 스택 프레임 위치를 가리키도록 설정됨
  • 함수가 종료될 때, 프레임 포인터를 이용하여 스택 프레임을 정리하고 이전 함수의 스택 프레임으로 복귀
  • 프레임 포인터를 통해 함수 간 스택 프레임을 연결하여 함수 호출과 반환을 효율적으로 관리

참고

AAPCS 소개
AAPCS와 EABI의 관계
AAPCS: 데이터 타입과 정렬
AAPCS: 레지스터 사용
AAPCS: 프로세스 메모리 및 스택
AAPCS: Subroutine Calls(서브루틴 호출)

답글 남기기