[DreamHack] Linux Memory Layout 개념 정리
리눅스 메모리 구조(Memory Layout)
> 세그먼트
적재되는 데이터의 용도별로 메모리의 구획을 나눈 것
코드 세그먼트
실행 가능한 기계 코드가 위치하는 메모리 영역, 텍스트 세그먼트(Text Segment)라고도 불림
권한: 읽기, 실행 (쓰기 권한은 공격자의 악의적인 코드 삽입이 쉬워지므로 제거함)
데이터 세그먼트
컴파일 시점에 값이 정해진(초기화 O) 전역 변수 및 전역 상수들이 위치하는 메모리 영역
권한: 읽기, 쓰기 = 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치
쓰기가 불가능한 데이터 세그먼트 > rodata(read-only data) 세그먼트 = 값이 변하면 안되는 데이터들이 위치
BSS 세그먼트
컴파일 시점에 값이 정해지지 않은(초기화 X) 전역 변수가 위치하는 메모리 영역
권한: 읽기, 쓰기
프로그램이 시작될 때, 모두 0으로 값이 초기화됨
스택 세그먼트
임시 변수가 저장되는 메모리 영역
권한: 읽기, 쓰기
스택 프레임(Stack Frame) 이라는 단위로 사용, 스택 프레임은 함수가 호출될 때 생성되고 반환될 때 해제됨
* 운영 체제는 프로세스를 시작할 때 작은 크기의 스택 세그먼트를 먼저 할당해주고, 부족해 질 때마다 이를 확장해줌 WHY? 스택에 대해서 ‘아래로 자란다' 라는 표현을 종종 사용하는데, 이는 스택이 확장될 때, 기존 주소보다 낮은 주소로 확장되기 때문
힙 세그먼트
실행 중 동적으로 사용되는 메모리 영역
권한: 읽기, 쓰기
💡 힙과 스택 세그먼트 자라는 방향이 반대인 이유? 동일한 방향으로 자랄 시 충돌 가능성이 있기 때문임!