카테고리 없음

[DreamHack] Linux Memory Layout 개념 정리

qkrdldks04 2025. 3. 27. 14:18

리눅스 메모리 구조(Memory Layout)

 

> 세그먼트

적재되는 데이터의 용도별로 메모리의 구획을 나눈 것

 

코드 세그먼트

실행 가능한 기계 코드가 위치하는 메모리 영역, 텍스트 세그먼트(Text Segment)라고도 불림

권한: 읽기, 실행 (쓰기 권한은 공격자의 악의적인 코드 삽입이 쉬워지므로 제거함)

main 함수가 컴파일 되고 변환된 기계 코드가 코드 세그먼트에 위치함

 

데이터 세그먼트

컴파일 시점에 값이 정해진(초기화 O) 전역 변수 및 전역 상수들이 위치하는 메모리 영역

권한: 읽기, 쓰기 =  전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치

쓰기가 불가능한 데이터 세그먼트 > rodata(read-only data) 세그먼트 = 값이 변하면 안되는 데이터들이 위치

str_ptr은 “readonly”라는 문자열을 가리키고 있는데 이 문자열은 상수 문자열로 취급되어 rodata 에 위치함 이를 가리키는 str_ptr은 전역 변수로서 data 에 위치

BSS 세그먼트

컴파일 시점에 값이 정해지지 않은(초기화 X) 전역 변수가 위치하는 메모리 영역

권한: 읽기, 쓰기

프로그램이 시작될 때, 모두 0으로 값이 초기화됨

초기화되지 않은 전역 변수인 bss_data가 BSS 세그먼트에 위치

 

스택 세그먼트

임시 변수가 저장되는 메모리 영역

권한: 읽기, 쓰기

스택 프레임(Stack Frame) 이라는 단위로 사용, 스택 프레임은 함수가 호출될 때 생성되고 반환될 때 해제됨

지역변수 choice가 스택에 저장

* 운영 체제는 프로세스를 시작할 때 작은 크기의 스택 세그먼트를 먼저 할당해주고, 부족해 질 때마다 이를 확장해줌 WHY? 스택에 대해서 ‘아래로 자란다' 라는 표현을 종종 사용하는데, 이는 스택이 확장될 때, 기존 주소보다 낮은 주소로 확장되기 때문

 

힙 세그먼트

실행 중 동적으로 사용되는 메모리 영역

권한: 읽기, 쓰기

heap_data_ptr에 malloc()으로 동적 할당한 영역의 주소를 대입하고, 이 영역에 값을 씁니다. heap_data_ptr은 지역변수이므로 스택에 위치하며, malloc으로 할당받은 힙 세그먼트의 주소를 가리킵니다.

 

 

💡  힙과 스택 세그먼트 자라는 방향이 반대인 이유? 동일한 방향으로 자랄 시 충돌 가능성이 있기 때문임!