- 코드 세그먼트(Code Segment)
- 실행 가능한 기계 코드가 위치하는 영역으로 텍스트 세그먼트 라고도 불린다
- 프로그램이 동작하려면 코드를 실행할 수 있어야 하므로 이 세그먼트에는 읽기 권한과 실행 권한이 부여된다
- 쓰기 권한을 제거하는 이유는 공격코드 삽입이 쉬워지기 때문
- main 함수가 컴파일 되면 기계 코드로 변환되는데, 이 기계 코드가 코드 세그먼트에 위치한다
- 데이터 세그먼트(Data Segment)
- 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치한다
- CPU가 이 세그먼트의 데이터를 읽을 수 있어야 하므로, 읽기 권한이 부여됨
- 데이터 세그먼트는 다시 쓰기가 가능한 것과 불가능한 것으로 분류되는데, 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터 들이 위치하는 세그먼트를 data 세그먼트라고 함
- 반면 쓰기가 불가능한 세그먼트에는 프로그램이 실행되면서 값이 변하면 안되는 데이터들이 위치하는데, 대표적으로 전역 상수가 여기에 포함된다. 이러한 세그먼트를 rodata(read-only data) 세그먼트라고 한다
- 예시로 char *str_ptr = "readonly"; 의 코드에서 str_ptr은 전역 변수로서 data에 위치하고 "readonly"는 상수 문자열로 rodata에 위치한다
- BSS 세그먼트(BSS Segment, Block Started By Symbol Segment)
- 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리
- 이 메모리 영역은 프로그램이 시작될 때, 모두 0으로 값이 초기화 된다
- 이런 특성 때문에 C 코드를 작성할 때, 초기화되지 않은 전역 변수의 값은 0이다
- 이 세그먼트에는 읽기 권한 및 쓰기 권한이 부여된다
- 스택 세그먼트(Stack Segment)
- 프로세스의 스택이 위치하는 영역, 함수의 인자나 지역 변수와 같은 임시 변수들이 실행중에 저장됨
- 스택 프레임이라는 단위로 사용, 함수가 호출될 때 생성되고 반환될 때 해제된다
- 스택 프레임은 프로그램이 실행될 때 작은 크기로 할당되고, 부족할때 마다 기존주소보다 낮은 주소로 확장된다
- 이 세그먼트에는 CPU가 자유롭게 값을 읽고 쓸 수 있어야 하므로, 읽기와 쓰기 권한이 부여된다
- 힙 세그먼트(Heap Segment)
- 힙 데이터가 위치하는 세그먼트로, malloc(), calloc() 등을 호출해서 할당받는 메모리가 위치한다
- 일반적으로 읽기와 쓰기 권한이 부여됨
- 힙 세그먼트는 낮은 주소에서 높은 주소로 할당되는데, 스택 세그먼트와의 충돌을 피하기 위해 반대 방향으로 자란다
'Dreamhack' 카테고리의 다른 글
[Dreamhack] Sys-Architecture (0) | 2023.03.31 |
---|