리눅스 메모리 구조
: 프로세스 가상메모리의 각 구역이 어떤 정보를 담고 있는지 이해한다
적재되는 데이터의 용도별로 메모리의 구획을 나눈 것
: 실행 가능한 기계 코드가 위치한 영역 -> 읽기 권한, 실행 권한
int foo () { ... }
: 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수가 위치 -> 읽기 권한
int data_num = 31337; // data
char data_rwstr[] = "writable_data"; // data
const char data_rostr[] = "readonly_data"; // rodata
char *str_ptr = "readonly"; // str_ptr은 data, 문자열은 rodata
int main() { ... }
str_ptr은 “readonly”라는 문자열을 가리키고 있는데, 이 문자열은 상수 문자열로 취급되어 rodata에 위치하며, 이를 가리키는 str_ptr은 전역 변수로서 data에 위치
int initialized_global = o;
: 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치 -> 읽기 및 쓰기 권한
여기에는 개발자가 선언만 하고 초기화하지 않은 전역변수 등이 포함됨
이 세그먼트의 메모리 영역은 프로그램이 시작될 때, 모두 0으로 값이 초기화되며 이런 특성 때문에 C 코드를 작성할 때, 초기화되지 않은 전역 변수의 값은 0
int bss_data;
int main() {
printf("%d\n", bss_data); // 0
return 0;
}
위 코드에서 초기화되지 않은 전역 변수인 bss_data가 BSS 세그먼트에 위치
int uninitialized_global;
: 프로세스의 스택이 위치하는 영역 -> 읽기 및 쓰기 권한
함수의 인자나 지역 변수와 같은 임시 변수들이 실행중에 여기에 저장됨
스택 프레임(Stack Frame)이라는 단위 사용
스택이 확장될 때, 기존 주소보다 낮은 주소로 확장되기에 '아래로 자란다' 표현을 사용하기도 함
void func() {
int choice = 0;
scanf("%d", &choice);
if (choice)
call_true();
else
call_false();
return 0;
}
지역변수 choice가 스택에 저장됨
int foo () {int local = 0;}
: 스택과 마찬가지로 실행중에 동적으로 할당될 수 있으며, 리눅스에서는 스택 세그먼트와 반대 방향으로 자람 -> 읽기 및 쓰기 권한
C언어에서 malloc(), calloc() 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치
int *ptr = malloc(4);