본문 바로가기
컴퓨터구조

[기초개념] 스택과 힙 (스택 세그먼트, 힙 세그먼트, 스택 프레임, 프로시저, 관련 어셈블리어)

by 배이즈 2025. 1. 21.

기본개념

스택

🦴 스택이란?

1. 나열 구조인데, 제한적으로 접근할 수 있다.
2. 접시 더미와 마찬가지로 추가/제거는 상단에서만 가능하다. (LIFO, Last In First Out)
 
Push : 자료를 넣는 것
Pop : 넣어둔 자료를 꺼내는 것

 

윈도우의 가상 메모리 공간에 적재되는 스택

 

윈도우즈 프로세스의 각 스레드(프로그램 실행 흐름)는 자신만의 스택 공간을 가진다.

  • 보통 지역 변수함수의 리턴 주소가 저장이 된다.
  • 읽기, 쓰기 권한 부여 (자유롭게 읽고 쓸 수 있어야 하니까)
  • ‘아래로 자란다’ : 스택이 확장될 때 기존 주소보다 낮은 주소로 확장되기 때문에 이렇게 표현함

윈도우의 가상 메모리 공간

 

🦴 힙이란?

프로그램이 여러 용도로 사용하기 위해 할당받는 공간 → 모든 종류의 데이터가 저장될 수 있다.

  • 읽기, 쓰기 권한만을 가지거나 상황에 따라 실행 권한도 가진다.
  • 스택과 다른 점
    • 비교적 스택보다 큰 데이터도 저장할 수 있고 전역적으로 접근이 가능하도록 설계됨
    • 실행 중 동적으로 할당받음

stack과 heap의 구별

Stack 영역의 경우 프로그램에 의해 자동으로 관리되는 정적할당영역 이며
Heap 영역의 경우 필요에 따라 사용자에 의해 관리되는 동적할당영역 이다.
 
즉, Stack과 Heap의 차이는 할당이 정적이냐, 동적이냐이고
정적, 동적의 의미는 각 영역이 할당되는 시점이다.
 
정적할당 되는 Stack 영역의 경우,
설계자가 Code를 짜고 Compile을 할 때(Compile Time) 그 크기가 결정이 된다.
하지만 동적할당 되는 Heap 영역의 경우,
Compile할 때가 아닌 이후 실제 프로그램이 동작할 때(RunTime) 크기가 결정이 된다. 
 
cf) 컴파일 시점 ↔ 런타임
int i = 10
여기서 중요한 것은 해당 변수가 10으로 초기화되었다는 것은 컴파일 시점(Compile Time)이 아닌 동작 시점(Run Time)에 알 수 있다.
 
즉, 컴파일 시점에 int로 선언된 변수 i의 크기가 4byte임은 알 수 있지만 해당 변수가 어떤 값을 가지는지는 알 수가 없다.
또 i의 초기값을 컴파일 시점에 알 수가 없으니 크기 i로 선언된 array의 크기 또한 컴파일 시점에는 알 수가 없다.

 

메모리 구조


세그먼트

스택 세그먼트 <지역 변수>

: 어떤 프로세스가 실행될 때 작은 크기의 스택 세그먼트를 먼저 할당 → 부족해 질때마다 아래로 확장 

  • 읽기, 쓰기 권한 부여

 

스택 프레임

: 함수가 호출될 때 생성, 반환할 때 해제

 
힙 세그먼트

  • 읽기, 쓰기 권한 부여
  • 스택 세그먼트랑 반대로 자란다.
  • 동적 할당된 메모리가 위치한다.

어셈블리어

스택 관련

push val : val를 스택 최상단에 쌓음

rsp -= 8
[rsp] = val
 

pop reg : 스택 최상단의 값을 꺼내서 reg에 대입

rsp += 8
reg = rsp-8
 

Q. 8?
A. 64비트 아키텍쳐에서 스택은 8바이트 단위로 데이터를 저장해야 하며, 이로 인해 스택 포인터(rsp)는 항상 8의 배수로 정렬된다.


프로시저 관련

반복 연산을 프로시저 호출로 대신함으로써 코드 크기를 감소시킬 수 있다. 
 
프로시저를 부르는 것은 호출(call), 돌아오는 것은 반환(return)
호출 후 원래 시점으로 돌아와야 하므로 call 다음의 명령어 주소를 스택에 저장하고, rip를 프로시저로 이동
 
call addr : addr에 위치한 프로시저 호출

push return_address
jmp addr
 

leave : 스택프레임 정리 수동으로 mov rsp, rbp, pop rbp를 작성하지 않고 간단히 leave를 사용할 수 있어 코드가 간결해짐

mov rsp, rbp
pop rbp


함수 호출 시 스택 프레임 관리

  1. 함수가 호출되면:
    • 호출자의 rbp 값과 리턴 주소가 스택에 저장
    • 새로운 스택 프레임을 생성하기 위해 rbp를 rsp에 맞춤으로써, 현재 함수의 시작 지점을 설정
  2. 함수 실행 중에는:
    • 지역 변수를 저장하거나 사용하면서 rsp가 변경
    • rbp 는 스택 프레임의 기준점 역할을 하므로, 변하지 X
  3. 함수가 끝날 때:
    • 함수의 스택 프레임을 정리(leave)해야 호출자의 스택 상태를 복원 가능

 

함수별로 서로가 사용하는 스택의 영역을 명확히 구분하기 위해 스택프레임이 사용된다.
그래서 호출할 때 스택프레임을 사용하고 반환할 때 이를 정리한다. 그래서 leave 명령어 사용하는 것!

최근댓글

최근글

skin by © 2024 ttuttak