메가IT아카데미 국기과정/리눅스와 시스템보안
[3-10] 메모리 구조
한님폐하
2022. 9. 12. 18:41
1. 메모리 세그먼트
- Text : 프로그램에 코드 값(소스 코드)이 저장된다.
- Data : 전역 변수 및 정적 변수가 저장된다.
- Heap :동적 변수 선언시 해당 정보가 저장된다.
- Stack : 지역 변수, 함수의 인자값, 리턴 주소가 저장된다.
1-1. 'test1.c' 메모리 구조
① text 세그먼트 (실행 소스 코드 저장)
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%s\n", string);
return retVal;
}
② Data 세그먼트 (전역 변수 및 정적 변수 저장)
int retVal = 0;
static int output = 1;
③ BSS (초기화 안된 변수 저장)
int outVal;
④ Heap 세그먼트 (동적 메모리 할당시 사용)
ptr = (char *)malloc(sizeof(string));
⑤ Stack 세그먼트 (지역 변수, 함수의 인자값, 리턴 주소 저장)
char string[] = "test1";
char *ptr;
⑥ argc(arguments counter), argv(arguments vector) , env
- argc : main() 함수에 전달되는 인자 개수, 첫번째 인자는 실행 파일 이름으로 고정되어 있음
- argv : main() 함수에 전달되는 실제 인자 값
- env : 환경 변수
2. 스택
- 스택은 함수가 실행되면 생성되고 함수 처리가 완료되면 소멸된다.
- 즉, 스택은 함수 처리를 하기 위한 메모리 영역이다.
- 함수 호출과 관련된 지역 변수, 함수의 파라메터, 리턴 주소를 저장하여 처리한다.
- 스택에 값이 저장될때 높은 주소에서 낮은 주소 순으로 저장되기 때문에 나중에 저장된 값이 먼저 나가는 LIFO(Last-In First-Out) 구조이다. (또는 FILO : First-In Last-Out)
- 스택에 처리하는 기법을 '스택 프레임'이라고 한다.
2-1. 어셈블리를 이용한 코드 분석
vi test2.c
#include<stdio.h>
void function(int a, int b, int c)
{
char buffer1[5];
char buffer2[10];
}
int main()
{
function(1,2,3);
return 0;
}
gcc -S -o test2.a test2.c
gdb -q test2
gcc -ggdb -o test2 test2.c # 소스 정보 및 파일 내에 있는 정보를 모두 포함하여 컴파일 실시
gdb -q test2
[참고] gcc 버전
- gcc 2.96 버전 이상 부터는 버퍼 8byte 미만은 1word(4byte) 할당한다.
- 그리고 8byte 이상부터는 4word(16byte)로 단위로 할당된다.
- 그렇기 때문에 버퍼가 8byte 이상인 경우에는 불필요한 dummy 값들이 존재한다