본문 바로가기
.study/pwnable

[포너블 기초] 메모리 구조

by hackisha 2023. 9. 11.
728x90

메모리 구조란?

프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 load되어야 한다. 또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.

 

따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있다.

 

프로그램이 실행하게 되면 OS는 아래 그림과 같이 메모리(RAM)에 공간을 할당해준다.

이미지 출처: https://lxxyeon.tistory.com/70

그리고 RAM은 크게 코드(Code), 데이터(Data), 스택(Stack), 힙(Heap) 영역으로 나뉜다.

이미지 출처: http://www.tcpschool.com/c/c_memory_structure

코드(code) 영역

  • 코드 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트영역이라고도 부른다.
  • 실행할 프로그램의 코드는 프로그래머가 작성한 소스 코드이다.
  • 실행할 코드와 매크로 상수가 컴파일된 기계어 형태로 저장된다.
  • 중간에 코드를 바꿀 수 없게 Read-Only 로 지정돼있다.
  • 프로그램이 시작하고 끝날 때 까지 메모리에 계속 남아있다.
  • CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.

데이터(data) 영역

  • 데이터 영역은 작성한 코드에서 전역변수, 정적(static)변수 등이 저장되는 공간이다.
  • 프로그램이 시작하고 끝날 때 까지 메모리에 계속 남아있는다.
  • 실행 중도에 전역변수가 변경 될 수 있으니 이 영역은 Read-Write로 지정 돼있다.
  • 초기화 된 변수 영역(initialized data segment)과 초기화되지 않은 변수 영역(uninitialized data segment)으로 나뉘고, 초기화되지 않은 변수 영역은 BSS(Block Started by Symbol) 이라고도 한다.

스택(stack) 영역

  • 메모리의 스택 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.
  • 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
  • 스택 영역이 저장되는 함수의 호출 정보를 스택 프레임(Stack frame)이라고 한다.
  • 스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다.
    이러한 스택은 후입선출(LIFO) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출된다.
  • 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
  • 스택 영역은 컴파일 시에 크기가 결정된다.

장점:

  • 낭비되는 공간이 없다.
  • 하나의 명령만으로 메모리 조작과 주소 조작이 가능하다.

단점:

  • 크기에 한계가 있어 한계를 초과하도록 삽입할 수 없다.
  • 재귀함수가 너무 깊게 호출되거나 함수가 지역 변수를 너무 많이 가지고 있어 스택 영역을 초과하면 stack overflow가 발생한다.

힙(heap) 영역

  • 메모리의 힙(Heap) 영역은 사용자가 직접 관리할 수 있고 관리해만 하는 영역이다.
  • 힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
  • 스택과 다르게 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

장점:

  • 프로그램에 필요한 개체의 개수나 크기를 미리 알 수 없는 경우 유용하다.
  • 즉, 개체가 너무 커서 스택 할당자에 맞지 않을 경우 사용가능하다.

단점:

  • CPU자원을 많이 소모하기 때문에 시간이 많이 소요 될 수 있다.
  • 사용후 반드시 해제를 해야한다. 그렇지 않으면 memory leak이 발생한다.

스택(Stack) vs 힙(heap)

  • 스택은 이미 할당 되어 있는 공간을 사용하는 것이고, 힙은 따로 할당해서 사용하는 공간이다.
  • 다만 스택은 공간이 매우 적기 때문에 모든 응용 프로그램에서 스택을 사용할 수는 없다.
  • 스택의 할당은 이미 생성되어 있는 스택에 대해 포인터의 위치만 바꿔주면 되지만, 힙에서의 할당은 요청된 chunk의 크기, 현재 메모리의 fragmentation 상황 등 다양한 요소를 고려해야하기 때문에 더 많은 CPU자원이 필요하다.
  • Stack의 지역변수는 사용되고 소멸하므로 데이터 용량의 불확실성을 가지므로 밑에서 부터 채워 올리고, Heap은 위에서부터 채워 내려간다.
  • Stack 영역에서의 주소값은 밑에서부터(먼저선언된 순서) 정해지며 그 다음 주소는 순서대로 정해진다.
728x90

'.study > pwnable' 카테고리의 다른 글

[포너블 기초] 함수 호출 규약  (0) 2023.09.14
[포너블 기초] Docker  (0) 2023.09.13
[포너블 기초] 스택 프레임  (0) 2023.09.12
[포너블 기초] x86-32, x86-64 레지스터  (0) 2023.09.12
[포너블 기초] 컴퓨터 구조  (0) 2023.09.10