세그먼트
- 리눅스에서는 프로세스의 메모리 구조를 5개의 세그먼트로 구분
- 코드, 데이터, BSS, 힙, 스택 의 세그먼트가 존재
코드 세그먼트
- 실행 가능한 기계 코드가 위치하는 영역
- 텍스트 세그먼트라고도 불림
- 프로그램이 동작하려면 코드를 실행할 수 있어야 하므로 읽기와 실행 권한이 부여
- 쓰기 권한은 대부분 현대 운영체제에서 제거
- 아래 메인 함수가 컴파일 되면 554889e5b8697a00005dc3라는 기계 코드로 변환되고, 이 기계 코드가 코드 세그먼트에 위치하게 됨
int main() { return 31337; }
데이터 세그먼트
- 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치
- CPU가 이 세그먼트의 데이터를 읽을 수 있어야 하므로 읽기 권한 부여
- 데이터 세그먼트는 쓰기가 가능한 세그먼트와 쓰기가 불가능한 데이터로 분류
- 전역변수같이 프로그램 실행 중 값이 변할 수 있는 데이터들이 위치하며, data 세그먼트라고 부름
- 쓰기가 불가능한 세그먼트는 값이 변하면 안되는 상수가 포함, rodata(read-only data) 세그먼트라고 부름
char *str_ptr = "readonly"; // str_ptr은 data, 문자열은 rodata
BSS 세그먼트
- BSS의 약자는 Block Started By Symbol
- 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리 영역
- 개발자가 선언만 하고 초기화하지 않은 전역 변수 등이 포함
- 이 세그먼트의 메모리 영역들은 모두 0으로 값이 초기화
- 이 특성 때문에 C 코드를 작성할 때, 초기화되지 않은 변수의 값은 0이 됨
- 읽기 및 쓰기 권한 부여
스택 세그먼트
- 프로세스의 스택이 위치하는 영역
- 함수의 인자나 지역 변수와 같은 임시 변수들 실행중에 여기에 저장
- 스택 세그먼트는 스택 프레임 이라는 단위로 사용
- 스택 프레임은 함수가 호출될 때 생성되고, 반환될 때 해제됨
- 운영체제는 프로세스를 시작할 때 작은 크기의 스택 세그먼트를 먼저 할당해주고, 부족해 질 때마다 이를 확장해줌
- 스택에 대해서 ‘아래로 자란다‘라는 표현을 사용, 이는 스택이 확장될 때 기존 주소보다 낮은 주소로 확장하기 때문
- 이 영역은 CPU가 자유롭게 값을 읽고 쓸 수 있어야 하므로, 읽기와 쓰기 권한 부여
힙 세그먼트
- 힙 데이터가 위치하는 세그먼트
- 스택과 마찬가지로 실행중에 동적으로 할당될 수 있음
- 리눅스에서는 스택 세그먼트와 반대로 자람
- C언어에서는 malloc(), calloc() 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치
- 읽기와 쓰기 권한 부여
요약
세그먼트 | 역할 | 일반적인 권한 | 사용 예 |
---|---|---|---|
코드 세그먼트 | 실행 가능한 코드가 저장된 영역 | 읽기, 실행 | main() 등의 함수 코드 |
데이터 세그먼트 | 초기화된 전역변수 또는 상수가 위치하는 영역 | 읽기와 쓰기 또는 읽기 전용 | 초기화된 전역 변수, 전역 상수 |
BSS 세그먼트 | 초기화되지 않은 데이터가 위치하는 영역 | 읽기, 쓰기 | 초기화되지 않은 전역 변수 |
스택 세그먼트 | 임시 변수가 저장되는 영역 | 읽기, 쓰기 | 지역 변수, 함수의 인자 등 |
힙 세그먼트 | 실행 중에 동적으로 사용되는 영역 | 읽기, 쓰기 | malloc(), calloc()으로 할당받은 메모리 |
댓글남기기