(CS)프로세스 구조
프로세스 구조
프로세스 구조
프로세스의 일반적인 구조
- text(CODE): 코드
- data: 전역변수
- stack: 함수를 호출할 때마다 지역 변수, 매개변수와 리턴값 등이 쌓인다.
- heap: 코드에서 동적으로 만들어지는 데이터
EBP(Extended Base Pointer)와 ESP(Extended Stack Pointer)
- ESP: 현재 스택의 가장 위에 들어있는 데이터를 가리키고 있는 포인터
ESP
는 다음DATA
를PUSH
할 위치가 아니라 다음에POP
했을때 뽑아낼 데이터의 위치를 가리킨다.
- EBP: 현재 스택에 가장 바닥을 가리키는 포인터
- 새로운 함수가 호출될 때마다 EBP 레지스터 값이 지금까지 사용했던
Stack
꼭대기의 위에 위치하게 되고 새로운Stack
시작 EBP
는 새로운 함수가 호출되거나 현재 실행중인 함수가 종료되어 리턴될 때마다 값이 달라진다.
- 새로운 함수가 호출될 때마다 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의 편리함을 새삼 다시 한번 느낄 수 있는 대목
- 위의 코드가 동작하는 과정을 간략하게 그림으로 표현한것
- 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.