세그먼트(Segment)
리눅스에서는 프로세스의 메모리를 아래의 그림과 같이 크게 5가지의 세그먼트(Segment)로 구분한다.
이 중 '코드, 데이터, BSS' 세그먼트는 크기가 정해져있으며,
힙 세그먼트와 스택 세그먼트의 크기는 유동적이고 서로 다른 방향으로 자란다
코드 세그먼트
실행 가능한 기계 코드가 위치하는 영역
데이터 세그먼트
컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치하는 영역.
데이터 세그먼트는 다시 쓰기가 가능한 data 세그먼트와 쓰기가 불가능한 rodata(read-only-data) 세그먼트로 나뉜다.
data 세그먼트: 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치한다.
rodata(read-only-data) 세그먼트: 프로그램이 실행되면서 값이 변하면 안되는 데이터들이 위치한다. 전역으로 선언된 상수가 여기에 포함된다.
코드로 예를 들자면 다음과 같다.
BSS 세그먼트
컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리 영역.
이 세그먼트의 메모리 영역은 프로그램이 시작될 때, 모두 0으로 값이 초기화된다.
스택 세그먼트
프로세스의 스택이 위치하는 영역.
함수의 인자나 지역 변수와 같은 임시 변수들이 실행중에 여기에 저장된다.
스택 세그먼트는 스택 프레임(Stack Frame)이라는 단위로 사용되는데,
스택 프레임은 함수가 호출될 때 생성되고, 반환될 때 해제된다.
스택은 아래로 자란다(=> 스택이 확장될 때, 낮은 주소로 확장된다)
힙 세그먼트
힙 데이터가 위치하는 세그먼트.
실행중에 동적으로 할당되며, 스택 세그먼트와 반대 방향으로 자란다
ex) C언어의 malloc(), calloc() 등을 호출해서 할당받는 메모리는 힙 세그먼트에 위치한다.
최종 요약
세그먼트 역할 일반적인 권한 사용 예
코드 세그먼트 | 실행 가능한 코드가 저장된 영역 | 읽기, 실행 | main() 등의 함수 코드 |
데이터 세그먼트 | 초기화된 전역 변수 또는 상수가 위치하는 영역 | 읽기와 쓰기 또는 읽기 전용 | 초기화된 전역 변수, 전역 상수 |
BSS 세그먼트 | 초기화되지 않은 데이터가 위치하는 영역 | 읽기, 쓰기 | 초기화되지 않은 전역 변수 |
스택 세그먼트 | 임시 변수가 저장되는 영역 | 읽기, 쓰기 | 지역 변수, 함수의 인자 등 |
힙 세그먼트 | 실행중에 동적으로 사용되는 영역 | 읽기, 쓰기 | malloc(), calloc() 등으로 할당 받은 메모리 |
'DreamHack: System Hacking > F Stage 2' 카테고리의 다른 글
Background: x86 Assembly Essential Part(2) 스택, 프로시저, 시스템 콜 (0) | 2023.03.31 |
---|---|
Background: x86 Assembly Essential Part(1) 어셈블리 명령어 (0) | 2023.03.31 |
Quiz: Linux Memory Layout (0) | 2023.03.31 |
Quiz: Computer Architecture (0) | 2023.03.31 |
Background: Computer Architecture (0) | 2023.03.31 |