프로그래밍 언어/C++

[게임 프로그래머 입문 올인원] 함수와 디버깅 : 스택과 레지스터 (13강)

순정법사 2023.09.05

A. 스택 (STACK)

1. 스택 메모리 = 스택

a. 스택 메모리란?

🌟 컴퓨터 프로그램에서 사용되는 메모리 영역 중 하나

 

  • 스택은 데이터를 선형 구조로 저장. 주로 함수가 사용하는 공용 공간
  • 높은 주소에서 낮은 주소로 이동
  • 크게 할당을 받아서 시작 (mb기준)
  • 스택 메모리는 운영 체제나 컴파일러에 의해 관리

 

b. 스택의 메모리의 특징

전역 변수의 주소처럼 고정 주소가 없음 항상 상대 주소!!

기준점(함수의 이름)의 데이터(변수의 위치)를 계산하는 형태

 

1) LIFO (Last-In-First-Out) 구조

 

스택은 데이터를 LIFO 구조로 저장 = 후입선출

 

2) 함수 호출 및 복귀

 

스택은 함수 호출과 관련된 정보를 저장하는 데 사용

 

함수가 호출될 때 현재 상태의 스택 프레임이 생성, 

함수가 반환할 때 스택 프레임이 제거되어 이전 호출 지점으로 돌아감

 

3) 지역 변수 및 매개변수 저장

 

각 함수 호출에 대한 지역 변수와 매개변수는 해당 함수의 스택 프레임에 저장

함수가 종료되면 스택에서 제거 

 

4) 재귀 호출

 

재귀 함수가 호출될 때마다 새로운 스택 프레임이 생성

호출이 깊어지면 사용량 증가할 수 있음

 

5) 컨텍스트 스위칭

 

스레드 간의 컨텍스트 스위칭에서도 스택 메모리가 사용

스레드는 각각 자체 스택을 가지며, 스레드 간 전환 시 스택 포인터가 변경

 

c. 스택 메모리의 이용

주로 작은 크기의 데이터를 빠르게 저장하고 검색하는 데 사용

임시 데이터 저장 및 함수 호출 관리에 중요한 역할

 

d. 스택 메모리의 도식화

 

직접 확인하려면

 

 

위 사진의 메모리 1과 레지스터 장을 켜서 어셈블리어로 주소값을 직접 확인하는 방법을 사용할 수 있음

 

 

2. 스택 프레임

a. 스택 프레임이란?

🌟 프로그램의 실행 중에 함수 호출과 관련된 정보를 저장하는 메모리 공간

 

위 그림에서 초록색 박스에 해당

 

 

b. 스택 프레임의 특징

  • 스택(Stack) 자료 구조에 저장
  • 새로운 스택 프레임이 생성 = 스택의 맨 위에 푸시(push)
  • 함수가 종료되면 해당 함수의 스택 프레임이 팝(pop)되어 제거

 

c. 스택 프레임의 정보

1) 지역 변수(Local Variables)

 

함수 내에서 선언된 지역 변수들은 스택 프레임에 저장

변수는 함수가 호출될 때 생성되고, 함수가 종료될 때 삭제


2) 함수의 매개변수(Parameter Values)

 

함수가 호출될 때 전달된 매개변수들은 스택 프레임에 저장

매개변수는 함수 내에서 사용되며 함수 실행이 끝날 때 제거


3) 함수의 반환 주소(Return Address)

 

함수가 호출되면 이전에 실행 중이던 코드의 주소(함수 호출 직전 명령어의 주소)가 스택 프레임에 저장

함수 실행이 끝나면 이 주소를 사용하여 호출자 함수로 돌아감

 

4) 함수 내의 중요 정보

 

함수 내에서 다양한 중요 정보(예: 이전의 스택 프레임 포인터)가 저장

 

d. 스택 프레임의 중요성

함수 호출과 관련된 호출 스택(Call Stack)의 핵심 구성 요소

호출 스택은 함수 호출 순서를 추적하고, 함수가 종료될때 제대로 복귀할 수 있도록 함

이러한 구조는 재귀 함수 호출 및 다양한 함수 간의 상호작용을 관리하는데 중요

 

🌟 스택 프레임과 호출 스택은 프로그램 실행의 핵심 부분

메모리 관리와 함수 호출 흐름을 효과적으로 관리하는 데 도움

 

 

 


B. CPU

1. 레지스터

a. 레지스터란?

x86은 32비트 프로그램

cpu도 연산을 하기 위한 레지스터라는 공간이 있음 (cpu의 손발)

 

레지스터의 크기 하나가 32비트/64비트로 지정이 되어있는 것

 

쉽게 생각하면 이런 느낌이다

 

32비트가 표현할 수 있는 숫자 범위 : 42억 = 4GB

따라서 큰 주소는 표현할 수 없음

👉 요즘에는 다 64비트로 사용함 

 

b. 함수와 레지스터

예전 32비트를 사용할 땐 함수의 매개변수가 작아도 무조건 스택 영역에 넣고 이동을 했지만,

 

 

64비트를 사용할 땐 레지스터 영역에 바로 넣어주는 경우도 있음!

 

c. 디버그 모드

함수를 호출하고 데이터를 할당할때에는 중간중간 쓰레기 값이 들어감

디버그 모드에서는 이 쓰레기값을 침범하는 데이터가 들어가 있다면 오류를 내고 디버깅할 수 있게 해줌

 

카나리 기법이라고도 함 (=메모리 보호 기법)

 

 

메모리 보호 기법 (Canary)

메모리 보호 기법 (Canaries) 메모리 보호 기법 종류 NX Bit ( MS : DEP ) ASLR Canaries RELRO PIE Canaries Canaries 또는 Canary word는 버퍼 오버 플로우를 모니터하기 위해 버퍼와 제어 데이터 사이에 설정 된 값 버

c0wb3ll.tistory.com

 

 

 


출처 : https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%9E%85%EB%AC%B8-%EC%98%AC%EC%9D%B8%EC%9B%90-rookiss#curriculum

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버 -

어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로 게임 프

www.inflearn.com