본 문서는 드림핵의 Linux Memory Layout 강의를 정리한 문서입니다.
리눅스의 메모리는 5가지의 세그먼트로 구분한다. 코드, 데이터, BSS, 힙, 스택 세그먼트다.
실행 가능한 기계코드가 위치하는 영역, CPU는 읽기와 실행 권한이 부여된다. 대부분의 운영체제는 쓰기 권한을 제거한다.
초기화가 이뤄진(initialized) 전역 변수/상수들이 위치한 메모리 영역. 읽기 권한이 부여된다.
데이터 세그먼트는 쓰기 가능 여부에 따라 다시 분류된다. 쓰기가 가능한 전역 변수 같은 데이터들은 data 세그먼트에 위치한다. 반면 쓰기가 불가능한 전역 상수의 경우, rdata 세그먼트에 위치한다.
BSS 세그먼트, Block Started By Symbol Segment) 는 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리 영역이다. 여기에 있는 전역 변수는 모두 0으로 값이 초기화 된다. 이 세그먼트에는 읽기 및 쓰기 권한이 부여된다.
함수의 인자나 지역 변수 같은 임시 변수들이 실행 중에 저장되는 영역, 스택 프레임 이라는 단위로 사용된다. 어떤 프로세스가 얼마 만큼의 스택 프레임을 사용할 지 미리 계산하는 것을 불가능하므로, 운영체제는 먼저 작은 크기의 스택 세그먼트를 할당하고 부족할 때마다 확장해준다. 이때 낮은주소로 확장된다.
동적 할당이 이뤄진 메모리가 위치한 영역, 스택 세그먼트와 다르게 높은 주소로 확장된다. 읽기, 쓰기 권한이 부여된다.