Post

(CS)프로세스 구조

프로세스 구조

프로세스 구조

프로세스의 일반적인 구조

메모리 구조

  • text(CODE): 코드
  • data: 전역변수
  • stack: 함수를 호출할 때마다 지역 변수, 매개변수와 리턴값 등이 쌓인다.
  • heap: 코드에서 동적으로 만들어지는 데이터

EBP(Extended Base Pointer)와 ESP(Extended Stack Pointer)

  • ESP: 현재 스택의 가장 위에 들어있는 데이터를 가리키고 있는 포인터
    • ESP는 다음 DATAPUSH 할 위치가 아니라 다음에 POP 했을때 뽑아낼 데이터의 위치를 가리킨다.
  • EBP: 현재 스택에 가장 바닥을 가리키는 포인터
    • 새로운 함수가 호출될 때마다 EBP 레지스터 값이 지금까지 사용했던 Stack 꼭대기의 위에 위치하게 되고 새로운 Stack 시작
    • EBP는 새로운 함수가 호출되거나 현재 실행중인 함수가 종료되어 리턴될 때마다 값이 달라진다.

Stack

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

void exFunc(int data) {
    int temp;
    temp = data;
}

int main(int argc, char const *argv[])
{
    exFunc(1);
    return 0;
}

Stack Overflow

소프트웨어에서 스택 오버플로(영어: stack overflow)는 스택 포인터가 스택의 경계를 넘어설 때 일어난다. 호출 스택은 제한된 양의 주소 공간을 이루며 대개 프로그램 시작 시 결정된다. 프로그램이 호출 스택에서 이용 가능한 공간 이상을 사용하려고 시도할 때, 스택이 오버플로(overflow)된다고 하며 이 경우 일반적으로 프로그램 충돌이 발생하게 된다 (위키백과)

Heap

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *data;
    data = (int *) malloc(sizeof(int));
    *data = 1;
    
    printf("%d\n", *data);

    return 0;
}
1
2
#include <stdlib.h>
void *malloc(size_t size);  
  • malloc() 함수
  • malloc() 함수는 프로그램이 실행 중일 때 사용자가 직접 힙 영역에 메모리를 할당할 수 있게 해줍니다.
  • malloc() 함수는 인수로 할당받고자 하는 메모리의 크기를 바이트 단위로 전달 받는다.
1
2
#include <stdlib.h>
void free(void *ptr);
  • free() 함수
    • 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해 주는 함수이다.
    • 데이터 영역이나 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 결정되어, 프로그램이 실행되는 내내(런타임 중) 고정된다.
    • 하지만, 메모리의 동적 할당으로 힙 영역에 생성되는 메모리의 크기는 프로그램이 실행되는 내내(런타임 중) 변동된다.
    • 따로 free() 함수를 통해 사용하지 않는 할당받은 메모리의 공간을 해제 해줘야 한다.
    • 사용이 끝난 메모리를 해재하지 않으면, 메모리 부족현상이 발생하는데 그게 바로 메모리 누수(momey leak)이다.
    • GC의 편리함을 새삼 다시 한번 느낄 수 있는 대목

메모리 구조 모델2

  • 위의 코드가 동작하는 과정을 간략하게 그림으로 표현한것
  • SP: 스택 프레임의 최상단을 가리키는 포인터
    • 높은 주소에서 SP까지가 데이터가 채워진 부분, SP부터 스택 프레임의 마지막 주소까지는 비워져 있는 부분
  • PC: Text(CODE)영역에서 컴파일 되어 실행되는 코드의 주소를 한줄 씩 가리키는 주소 레지스터

Heap Overflow

힙 오버플로(heap overflow)는 힙 데이터 영역에서 발생하는 버퍼 오버플로의 한 종류이다.(위키백과)

DATA

  • BSS: 초기화되지 않은 전역변수를 저장하는데 사용
  • DATA(GVAR): 초기값을 0이 아닌 특정한 값으로 지정한 경우 이곳에 저장

Reference

메모리의 동적 할당

This post is licensed under CC BY 4.0 by the author.